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

时间:2014-10-21 11:58:39

标签: javascript php encryption cryptojs

我使用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密码了,这个密码/关键的东西增加了复杂性

1 个答案:

答案 0 :(得分:4)

如果您想直接提供密钥,您也应提供 IV 。需要IV(初始化向量),因此可以与消息的第一个块进行异或。然后,第一个块的密文与消息的第二个块进行异或,依此类推。这称为cipher-block chaining (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 docs 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位。