如何将这段Java代码转换成js?

public static String getSignature(String skey, String iv, String data) throws Exception {
  IvParameterSpec Ⅳ = new IvParameterSpec(iv.getBytes("utf-8"));
  DESKeySpec desKey = new DESKeySpec(skey.getBytes("utf-8"));
  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  SecretKey key = keyFactory.generateSecret(desKey);
  Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  cipher.init(Cipher.ENCRYPT_MODE, key, Ⅳ);
  byte[] databyte = cipher.doFinal(data.getBytes("utf-8"));
  return new String(Base64.getEncoder().encode(databyte));
}

我自己试过了,我得到了:

  function getSignature(
    skey,
    iv,
    data,
  ) {
    const IV = Buffer.from(ivString, 'utf-8');
    const desKey = Buffer.from(skey, 'utf-8');

    const cipher = crypto.createCipheriv('des-cbc', desKey, IV);
    let encrypted = cipher.update(data, 'utf-8', 'base64');
    encrypted += cipher.final('base64');
    return encrypted;
  }

但我得到了一个ERR_CRYPTO_INVALID_KEYLEN错误,因为我的密钥长度不是8.我猜我的js代码缺少这部分Java代码,但我不知道如何将这部分转换成js:

  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  SecretKey key = keyFactory.generateSecret(desKey);

推荐答案

要将缺少的Java代码部分转换为JavaScript,您可以使用crypto.createCipheriv()方法来使用crypto.createCipheriv()crypto.randomBytes()来生成密钥.以下是修改后的JavaScript代码:

const crypto = require('crypto');

function getSignature(skey, iv, data) {
    const IV = Buffer.from(iv, 'utf-8');
    const desKey = Buffer.from(skey, 'utf-8');

    const cipher = crypto.createCipheriv('des', desKey.slice(0, 8), IV);
    let encrypted = cipher.update(data, 'utf-8', 'base64');
    encrypted += cipher.final('base64');
    return encrypted;
}

在这段代码中,crypto.createCipheriv()用于生成密钥,方法是提供一个空缓冲区(Buffer.alloc(8))作为第二个参数,并提供一个空字符串('')作为第三个参数.通过将desKey缓冲器与适当数量的填零字节(Buffer.alloc(8 - desKey.length))串联来调整密钥长度.

Javascript相关问答推荐

在JavaScript中检索一些文本

对象和数字减法会抵消浏览器js中的数字

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

从实时数据库(Firebase)上的子类别读取数据

按钮未放置在html dis位置

拖放仅通过 Select 上传

google docs boldText直到按行执行应用脚本错误

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

如何在Svelte中从一个codec函数中调用error()?

400 bad request error posting through node-fetch

Use Location位置成员在HashRouter内为空

在Odoo中如何以编程方式在POS中添加产品

不同表的条件API端点Reaction-redux

用于部分字符串的JavaScript数组搜索

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

无法在Adyen自定义卡安全字段创建中使用自定义占位符

ReactJS在类组件中更新上下文

使用Java脚本筛选数组中最接近值最小的所有项

带元素数组的Mongo聚合