CryptoJS使用密码短语加密AES,但PHP解密需要密钥

CryptoJS encrypts AES with passphrase but PHP decrypt needs a key

本文关键字:PHP 解密 密钥 AES 密码 短语 加密 CryptoJS      更新时间:2023-09-26

我正在使用CryptoJS加密字符串:

  function doHash(msg){
    msg = String(msg);
    var passphrase = 'aggourakia';
    var hash = CryptoJS.AES.encrypt(msg, passphrase);
    var ciphertext=  hash.ciphertext.toString(); //return ciphertext instead of object
    return ciphertext;      
}

据我所知,CryptoJS使用密码短语生成密钥,然后用于加密数据。

然而,我想使用PHP函数解密密码,或者这样的在线工具:http://aesencryption.net/

问题是,它们需要密钥,而不是密码短语

如何直接向CryptoJS AES提供密钥,我可以在服务器端或任何在线工具上使用该密钥进行解密?

问题是,我已经很难找到PHP函数来解密AES密码了,而这个密码短语/密钥增加了的复杂性

如果您想直接提供密钥,您也应该提供IV。IV(初始化向量)是必需的,因此它可以与消息的第一个块进行异或。然后将第一块的密文与消息的第二块进行异或,依此类推。这称为密码块链(CBC)。

var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

这来自CryptoJS文档https://code.google.com/p/crypto-js/#Custom_Key_and_IV

您可以使用PBKDF2生成密钥和IV,如@Narf所写。https://code.google.com/p/crypto-js/#PBKDF2

关于PHP:mcrypt有mcrypt_RIJNDAEL_128密码,它是AES 128。MCRYPT_RIJNDAEL_192和MCRYPT_ RIJNDAEL_256与AES 192和AES 256不兼容,因为AES使用具有所有密钥大小的128位块。Rijndael有一个可配置的块大小。如果您提供128位密钥,CryptoJS将使用128位AES,如果您使用接受密码短语的函数,它将使用256位。