我有一个使用 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)?
BIG阳
相关分类