将加密货币转换为 crypto-js 脚本 (AES-256-CBC)

问题描述 投票:0回答:1

我有使用 Node.js 原生

encrypt()
lib 的工作
decrypt()
/
crypto
函数,它们工作得很好

const crypto = require('crypto');


const ENC_KEY = "bf37b0999c7717c17b2c1d90470cb41e";

function encrypt(data, key, ivLength = 16) {
  const iv = crypto.randomBytes(ivLength);
  const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
  let encrypted = cipher.update(data, 'utf8', 'base64');
  encrypted += cipher.final('base64');

  const resultData = {
    'iv': iv.toString('base64'),
    'data': encrypted
  }
  const response = btoa(JSON.stringify(resultData))
  return response;
};

function decrypt(data, key) {
  const jsonData = JSON.parse(Buffer.from(data, 'base64').toString('ascii'));
  const iv = Buffer.from(jsonData['iv'], 'base64')
  
  let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
  let decrypted = decipher.update(jsonData['data'], 'base64', 'utf8');
  const result = (decrypted + decipher.final('utf8'));
  return result;
};


const phrase = "ORIGINAL PHRASE";

const encryptedCrypto = encrypt(phrase, ENC_KEY);
const decryptedCrypto = decrypt(encryptedCrypto, ENC_KEY);
console.log(`Decoded string: ${decryptedCrypto}`);

我需要用

encrypt()
 lib 重写 
crypto-js
函数,以便原始
decrypt()
函数可以使用它。除了
encrypt()
功能之外,我无法修改任何内容。

我尝试过,但没有成功。有人可以帮我吗?

function encrypt(data, key, ivLength = 16) {
  const iv = CryptoJS.lib.WordArray.random(ivLength);
  const encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Hex.parse(key), {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.NoPadding
  });

  const resultData = {
    'iv': CryptoJS.enc.Hex.parse(iv).toString('base64'),
    'data': encrypted
  }
  const result = btoa(JSON.stringify(resultData))
  return result;
}
javascript cryptography cryptojs
1个回答
0
投票

您的 crypto-js 代码很接近,但有一些缺陷

function encrypt(data, key, ivLength = 16) {
    const iv = CryptoJS.lib.WordArray.random(ivLength);
    const encrypted = CryptoJS.AES.encrypt(
        data,
        CryptoJS.enc.Utf8.parse(key),
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            //padding: CryptoJS.pad.NoPadding,
        }
    );
    const resultData = {
        iv: CryptoJS.enc.Base64.stringify(iv),
        data: CryptoJS.enc.Base64.stringify(encrypted.ciphertext),
    };
    const result = btoa(JSON.stringify(resultData));
    return result;
}

注意

CryptoJS.enc.Utf8.parse(key)
不是
CryptoJS.enc.Hex.parse(key)

如果使用

.Hex.parse
转换如图所示的密钥(32 个字符),最终将是 128 位,而不是 256 位。

删除了

padding: CryptoJS.pad.NoPadding,
,因为这会破坏解密

CryptoJS.enc.Base64.stringify
中使用
resultData
,因为这基本上就是您在节点版本中所做的事情

注意:

crypto-js
开发已停止 - 您应该在节点和浏览器中使用本机加密,即
crypto.subtle

主要挑战是

crypto.subtle

的异步性质
© www.soinside.com 2019 - 2024. All rights reserved.