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

我使用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使用密码生成密钥,然后用于加密数据.

However I’d like to decrypt the cipher using a PHP function, or maybe
an online tool such as this: 07002

问题是这些期望是关键,而不是密码.

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

问题是,我已经很难找到PHP函数来解密AES密码了,这个密码/关键的东西增加了复杂性

解决方法:

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

您可以像@Narf写的那样使用PBKDF2生成密钥和IV. 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位.

上一篇:Javascript的JSON.stringfy和PHP的json_encode一样吗?


下一篇:PHP将mcrypt转换为openssl