Javascript CryptoJS AES encryption toString medthod和cipthertext ToBase64
我有一个使用CryptoJS的书面加密方法,我有一个32字长的密钥和一些字符串。 我正在尝试向web服务发送一条消息,该服务要求使用padding=PKCS7对数据进行AES加密,然后将其转换为Base64。我做了以下工作: 加密函数Javascript CryptoJS AES encryption toString medthod和cipthertext ToBase64,javascript,cryptography,cryptojs,Javascript,Cryptography,Cryptojs,我有一个使用CryptoJS的书面加密方法,我有一个32字长的密钥和一些字符串。 我正在尝试向web服务发送一条消息,该服务要求使用padding=PKCS7对数据进行AES加密,然后将其转换为Base64。我做了以下工作: 加密函数 export function encryptByAES(message: string, key: string): any { let encryptedMessage: CryptoJS.WordArray = CryptoJS.AES.encryp
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,但为什么它们不同呢。EncryptedTo字符串在“U2FsdGVkX”开头有一个额外的部分(我假设它是iv或其他),如果我更改消息,它将保持不变,但我认为密文将是EncryptedTo string()的子字符串
编辑:
示例键为:
const key='xxxxxxxxxxxxxxxxxxxxx'代码>
我修改了它,因为它不是公共的,但它肯定有一些特殊的字符和两个空格(大写和小写字母,比“f”更细等等)。
没有指定IV,我必须使用编码消息来连接API
我的问题是:
如何确定字符串是Base64加密的(它位于前端(浏览器))
为什么字符串2(B64字)不是字符串1的子字符串
为什么我能够用CryptoJS解密字符串1,但用字符串2(B64字)却没有成功
<> p>因为需要更好的显示代码,我使用的是答案而不是注释代码行。
来自文档(此代码用于默认AES CBC模式)
安全警告:请注意,ECB模式是不安全的
编辑-回答您的问题:
如何确定字符串是Base64加密的(它位于前端(浏览器))?默认输出的使用(由“返回encryptedMessage”产生)与OpenSSL兼容,即base64编码
为什么字符串2(B64字)不是字符串1的子字符串?因为它是双Base64编码,字符串看起来不同
为什么我能够用CryptoJS解密字符串1,但用字符串2(B64字)却没有成功?如果首先对字符串2进行base64解码,并将结果提供给解密函数,则使用字符串2将获得成功
base64编码的“前置”字符串“U2FsdGVkX”在base64解码后转换为“Salted”,这意味着您对encryptByAES函数的输入用作密码/密码短语,而不是密钥。如果你能给出一个完整的最小示例,而不仅仅是一个部分和一个信息“我有一个32字长的键”,那就更容易理解了。我建议您慢慢来,用优秀的例子研究文档。
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 });