为了账号安全,请及时绑定邮箱和手机立即绑定

CryptoJS AES加密toString方法及密文转Base64

CryptoJS AES加密toString方法及密文转Base64

饮歌长啸 2023-08-24 17:41:56
我有一个使用 CryptoJS 的书面加密方法,并且有一个 32 字长的密钥和一些字符串。我正在尝试向 Web 服务发送一条消息,该服务要求数据使用 padding=PKCS7 进行 AES 加密,然后转换为 Base64。我做了以下事情:加密功能export function encryptByAES(message: string, key: string): any {    let encryptedMessage: CryptoJS.WordArray = CryptoJS.AES.encrypt(        message,        key,        {            mode: CryptoJS.mode.ECB,            padding: CryptoJS.pad.Pkcs7        }    );    return encryptedMessage;}function toBase64String(words : any) : any{    return CryptoJS.enc.Base64.stringify(words);}我使用该函数,并得到上述输入:let encry = encryptByAES(message, key);console.log('Encrypted to string(): ' + encry.toString()); //Prints U2FsdGVkX19XZDGZBnr+dM6qJA6bfUpp1kmhSK6E0t6TeuJU78BkyUkIthWnnWnX99Q9Eeq0pbdLWlgTx576MIV9FDYDcjcajlApXr/6r9k=let b64words = toBase64String(encry.ciphertext); //Prints zqokDpt9SmnWSaFIroTS3pN64lTvwGTJSQi2Faedadf31D0R6rSlt0taWBPHnvowhX0UNgNyNxqOUClev/qv2Q==console.log('Ciphertext: ' +  b64words);通过末尾的“=”符号,我看到两者都是 Base64,但为什么它们不同。加密到字符串在开头有一个额外的部分“U2FsdGVkX”(我假设它是 iv 或其他东西),如果我更改消息它保持不变,但我认为密文将是加密到 string() 的子字符串?编辑:示例键是: const key = 'xxxxxxxxxxxxxxxxxxxxxxxxx  ';我修改了它,因为它不是公开的,但它肯定有一些特殊字符和末尾有两个空格(字母大写和小写,大于“f”等)。未指定 IV,我必须使用编码消息来连接 API我的问题是:我如何知道该字符串确实经过 Base64 加密(位于前端(浏览器))?为什么字符串 2(b64words) 不是字符串 1 的子字符串?为什么我能够使用 CryptoJS 解密字符串 1,但无法成功解密字符串 2(b64words)?
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

由于可以更好地显示必要的代码,因此我使用的是答案,而不是您应该考虑的代码行的注释。


来自文档(此代码适用于默认的 AES CBC 模式) https://cryptojs.gitbook.io/docs/#custom-key-and-iv


custom-key-and-iv

var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");

var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f");

var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

安全警告:请注意,ECB 模式是不安全的

编辑-回答您的问题:

  1. 我如何知道该字符串确实经过 Base64 加密(位于前端(浏览器))?使用默认输出(由“返回加密消息”产生)与 OpenSSL 兼容,即base64编码。

  2. 为什么字符串 2(b64words) 不是字符串 1 的子字符串?因为它是双重 Base64 编码,并且字符串看起来不同。

  3. 为什么我能够使用 CryptoJS 解密字符串 1,但无法成功解密字符串 2(b64words)?如果您首先对字符串编号 2 进行 Base64 解码并将结果提供给解密函数,则您将成功获得字符串编号 2。


查看完整回答
反对 回复 2023-08-24
  • 1 回答
  • 0 关注
  • 401 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号