Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CryptoJS AES encryption toString medthod和cipthertext ToBase64_Javascript_Cryptography_Cryptojs - Fatal编程技术网

Javascript CryptoJS AES encryption toString medthod和cipthertext ToBase64

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

我有一个使用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,但为什么它们不同呢。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 });