我正在使用 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 使用密码生成 key ,然后使用该 key 加密数据。
However I'd like to decrypt the cipher using a PHP function, or maybe an online tool such as this: http://aesencryption.net/
问题是这些需要 key ,不是密码。
我如何直接向 CryptoJS AES 提供 key ,我可以在服务器端或任何在线工具上使用它来解密?
问题是,我已经很难找到用于解密 AES 密码的 PHP 函数,而这个密码短语/ key 又增加了复杂性
最佳答案
如果您想直接提供key,您也应该提供IV。需要 IV(初始化向量),以便它可以与消息的第一个 block 进行异或运算。然后第一个 block 的密文与消息的第二个 block 进行异或运算,依此类推。这叫做 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 文档 https://code.google.com/p/crypto-js/#Custom_Key_and_IV
您可以使用 PBKDF2 生成 key 和 IV,就像@Narf 写的那样。 https://code.google.com/p/crypto-js/#PBKDF2
关于 PHP:mcrypt具有 AES 128 的 MCRYPT_RIJNDAEL_128 密码。MCRYPT_RIJNDAEL_192 和 MCRYPT_RIJNDAEL_256 与 AES 192 和 AES 256 不兼容,因为 AES 使用具有所有 key 大小的 128 位 block 。 Rijndael 的 block 大小是可配置的。如果您提供 128 位 key ,CryptoJS 将使用 128 位 AES,如果您使用接受密码的函数,它将使用 256 位。
关于javascript - CryptoJS 使用密码加密 AES 但 PHP 解密需要 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26486152/