CryptoJS AES加密toString方法和密文到Base64
CryptoJS AES encryption toString medthod and cipthertext to Base64
我有一个使用 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,但为什么它们不同。 Encrypted to string 在开头有一个额外的部分 'U2FsdGVkX' (我假设它是 iv 或其他东西)并且如果我更改消息它保持不变,但我认为密文将是 Encrypted to string( )?
编辑:
示例键是:
const key = 'xxxxxxxxxxxxxxxxxxxxxxxxx ';
我已经修改了它,因为它不是 public 但它肯定有一些特殊字符和末尾的两个空格(字母大小写,大于 'f' 等)。
IV 未指定,我必须使用编码消息连接 API
我的问题是:
- 我怎么知道这个字符串肯定是 Base64 加密的(它在前端(浏览器))?
- 为什么字符串 2(b64words) 不是字符串 1 的子字符串?
- 为什么我能够使用 CryptoJS 解密字符串 1,但使用字符串 2(b64words) 却没有成功?
由于可以更好地显示必要的代码,我使用的是答案,而不是您应该考虑的代码行的注释。
来自文档(此代码用于默认 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模式是不安全。
编辑 - 回答您的问题:
我怎么知道这个字符串肯定是 Base64 加密的(它在前端(浏览器))?使用默认输出(由“return encryptedMessage”产生)与 OpenSSL 兼容,即 base64 编码。
为什么字符串 2(b64words) 不是字符串 1 的子字符串?因为它是双倍的 Base64 编码并且字符串看起来不同。
为什么我能够使用 CryptoJS 解密字符串 1,但使用字符串 2(b64words) 却没有成功?如果您首先对字符串 2 进行 base64 解码并将结果提供给您的解密函数,那么您将成功使用字符串 2。
我有一个使用 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,但为什么它们不同。 Encrypted to string 在开头有一个额外的部分 'U2FsdGVkX' (我假设它是 iv 或其他东西)并且如果我更改消息它保持不变,但我认为密文将是 Encrypted to string( )?
编辑:
示例键是:
const key = 'xxxxxxxxxxxxxxxxxxxxxxxxx ';
我已经修改了它,因为它不是 public 但它肯定有一些特殊字符和末尾的两个空格(字母大小写,大于 'f' 等)。 IV 未指定,我必须使用编码消息连接 API
我的问题是:
- 我怎么知道这个字符串肯定是 Base64 加密的(它在前端(浏览器))?
- 为什么字符串 2(b64words) 不是字符串 1 的子字符串?
- 为什么我能够使用 CryptoJS 解密字符串 1,但使用字符串 2(b64words) 却没有成功?
由于可以更好地显示必要的代码,我使用的是答案,而不是您应该考虑的代码行的注释。
来自文档(此代码用于默认 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模式是不安全。
编辑 - 回答您的问题:
我怎么知道这个字符串肯定是 Base64 加密的(它在前端(浏览器))?使用默认输出(由“return encryptedMessage”产生)与 OpenSSL 兼容,即 base64 编码。
为什么字符串 2(b64words) 不是字符串 1 的子字符串?因为它是双倍的 Base64 编码并且字符串看起来不同。
为什么我能够使用 CryptoJS 解密字符串 1,但使用字符串 2(b64words) 却没有成功?如果您首先对字符串 2 进行 base64 解码并将结果提供给您的解密函数,那么您将成功使用字符串 2。