Nik*_*des 5 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;
}
Run Code Online (Sandbox Code Playgroud)
据我了解,CryptoJS 使用密码短语来生成密钥,然后将其用于加密数据。
但是,我想使用PHP函数或诸如此类的在线工具解密密码:http : //aesencryption.net/
问题是这些人期望键,而不是密码。
如何直接提供CryptoJS AES 的密钥,我可以在服务器端或任何在线工具上使用它来解密?
事实是,我已经很难找到可以解密AES密码的PHP函数,而这种密码短语/密钥的确增加了复杂性
如果您想直接提供密钥,您也应该提供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 });
Run Code Online (Sandbox Code Playgroud)
这是来自 CryptoJS 文档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 位。