【问题标题】:How can I encrypt a string with AES-128-CBC algorithm in Javascript?如何在 Javascript 中使用 AES-128-CBC 算法加密字符串?
【发布时间】:2018-03-19 13:01:50
【问题描述】:

我有以下使用 openssl 加密字符串的 shell 脚本:

API_KEY="qrBprgc/3dTjrrD@4t!9FcNjwT3_Ra"
DATE="Mon, 19 Mar 2018 12:45:05 EET"

aesivkey=$(echo -n "$DATE" | openssl dgst -sha256 -hmac "$API_KEY" -r)
aes128cbciv=${aesivkey:0:32}
aes128cbckey=${aesivkey:32:32}

private_key="test"
encrypted_private_key=`echo -e $private_key | openssl aes-128-cbc -base64 -nosalt -K $aes128cbckey -iv $aes128cbciv`

我正在尝试在 javascript 中创建相同的功能(在邮递员中使用它)。目前我有以下代码:

var dateString = "Mon, 19 Mar 2018 12:45:05 EET";
var api_key="qrBprgc/3dTjrrD@4t!9FcNjwT3_Ra"

//aesivkey=$(echo -n "$DATE" | openssl dgst -sha256 -hmac "$API_KEY" -r)
var aesivkey = (CryptoJS.HmacSHA256(dateString, api_key)).toString();
//aes128cbciv=${aesivkey:0:32}
var aes128cbciv = aesivkey.substring(0, 32);
//aes128cbckey=${aesivkey:32:32}
var aes128cbckey = aesivkey.substring(aesivkey.length - 32);

var private_key="test"

//encrypted_private_key=`echo -e $private_key | openssl aes-128-cbc -base64 -nosalt -K $aes128cbckey -iv $aes128cbciv`
var encrypted_private_key = CryptoJS.AES.encrypt(private_key, aes128cbckey,
{
    keySize: 128 / 8,
    iv: aes128cbciv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});

谁能解释一下我做错了什么?

shell 脚本中的结果:HSMD8RaXNbRrN4c1NzFXvQ==

javascript 中的结果:U2FsdGVkX1+uapLKV00iSOtj8eVpjfY4onoqQmoPPF4=

【问题讨论】:

  • 然后,会发生什么?错误?结果错误?小狗? aesivkey、aes128cbciv、aes128cbckey 与它们的对应物相似吗?
  • @tevemadar 我收到不同的结果,shell 脚本返回“HSMD8RaXNbRrN4c1NzFXvQ==”,javascript 返回“U2FsdGVkX1+uapLKV00iSOtj8eVpjfY4onoqQmoPPF4="
  • 计算出的密钥至少是正确的吗?在 CryptoJS 的情况下,IV 可能会得到前缀。此外,您在调用加密时使用的是 aesivkey 而不是 aescbckey。
  • @MaartenBodewes 关于“aesivkey”,这只是一个错字。 shell/js中计算出来的key和iv是一样的。
  • 您真的应该寻找更好的方法来生成您的密钥和 IV 值。请注意,您不应使用上述方法来创建安全传输模式,因为您将可怕地失败

标签: javascript encryption aes


【解决方案1】:

目前的结果是Salted__(参见base 64编码的ASCII内容,前8个字节拼写这个词),即它使用密码加密。这可能是因为您的密钥和 IV 在使用前需要从十六进制解码为WordArray。如果密钥是字符串而不是WordArray,它将被解释为密码,并且将派生密钥。

例如:

CryptoJS.enc.Hex.parse(aes128cbckey)

iv: CryptoJS.enc.Hex.parse(aes128cbciv)

注意事项:

  • 如果您提供密码,在配置参数中指定keySize 很好,但如果您直接指定密钥,您可能不应该使用它。

  • 创建 CryptoJS 的开发人员应该真的真的真的没有重载 encrypt 函数。

【讨论】:

  • 我尝试解码我​​的密钥和 IV,然后我仍然收到错误的结果:“61KqddprvgB2Xq/YLO5Dmw=="
  • 嗯,可能echo -e 增加了一个换行符?输出在其他方面看起来还可以。试试-e -n
  • 哦,问题出在 -e 中,现在可以正常工作了,非常感谢您的帮助!
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多