当前位置: 首页 > 知识库问答 >
问题:

我如何在JavaScript中用AES-128-CBC算法加密一个字符串?

聂季同
2023-03-14

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

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中制作相同的函数(以在postman中使用它)。目前我有以下代码:

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
});

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

共有1个答案

古畅
2023-03-14

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

例如:

CryptoJS.enc.Hex.parse(aes128cbckey)

而且

iv: CryptoJS.enc.Hex.parse(aes128cbciv)
 类似资料:
  • 我只需要通过代码加密AES CBC 128位模式的字符串。我使用openssl库完成了这项工作,但无法获得正确的输出。 到目前为止,我已经完成了。 我的十六进制输出是:B0 15 751B50 80 D4 FF 81 68 146BB71B95 99 37 38 但正确的输出是:< code > 73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA (通过

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 我用java编写了这段代码,以便解密密文。我有钥匙。对我来说,一切都是正确的,但我有我要解释的问题。 这是我的代码: 我收到以下错误: 出了什么问题?我知道这个问题在某种程度上与衬垫有关,但我不知道确切的解决方案。我只有一个密文IV和密钥。

  • 下面是我到现在为止所尝试的 下面是适用于我的node.js代码。在CryptoJ中,我没有成功地实现类似的功能。根据我的理解,crypto是内置库,其中的节点在其上有自己的包装器。