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

Javascript CryptoJS使用密码短语加密AES,但PHP解密需要密钥,javascript,php,encryption,cryptojs,Javascript,Php,Encryption,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 ciph

我正在使用加密字符串:

  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;      
}
据我所知,使用密码短语生成密钥,然后用于加密数据

不过,我想使用PHP函数解密密码,或者 这样的在线工具:

问题是,它们需要一个而不是密码短语。

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


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

如果你想直接提供密钥,你也应该提供IV。需要IV(初始化向量),以便它可以与消息的第一个块异或。然后第一个块的密文与消息的第二个块异或,依此类推。这就是所谓的

这来自CryptoJS文档

您可以使用PBKDF2像@Narf那样生成密钥和IVs


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

我敢打赌,密码短语是用来通过PBKDF2派生密钥的。@Narf您愿意赌多少?@owlstead-Hehe,这只是一个猜测。@Narf看起来像是某个人,如果您问我mcrypt已经过时,但没有弃用:(我收到一位开发人员的邮件,他们希望创建一个新版本的底层C库,但这将是几年来的第一个版本-目前尚未维护(因此,如果存在bug或漏洞,没有人会修复它们)。您的主要观点是,您应该提供一个IV来使用使用密钥的
encrypt
函数,这是正确的,因此我已经修复了可能发现的错误。请查看更改并注意。我是否也需要在PHP函数中使用IV?我还没有启动PHP服务器-因此我正在使用此工具,以查看它是否在mCrypt中工作他实际上是一个mCrypt工具。不幸的是,我看到的只是我需要在这里键入密文和要解密的密钥。我正在复制您在示例中提供的密钥和您示例中输出的密文,但它似乎正在冒出gibberish@NicholasKyriakides是的,你也需要PHP的IV。
var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');

var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });