在过去的两天里,我一直在努力实现我最初认为很容易实现的东西。
我需要一种非常简单且不安全的方法来通过AJAX发送密码并解密服务器端
我使用CryptoJS的AES:
JS加密
msg = "message";
var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
var encrypted = CryptoJS.AES.encrypt(msg, key, { iv: iv });
var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64);
console.log(data_base64,iv_base64,key_base64) //If I use these keys in the PHP decryption it works
return encrypted.toString();
和使用mCrypt的PHP解密
$encrypted = "f82126a59b76d86946a013d9f575d0d4"; //this is what the JS function above returned.
$key = "000102030405060708090a0b0c0d0e0f"; //same key as in JS function
$iv = "101112131415161718191a1b1c1d1e1f"; //same IV as in JS function
$plaintext = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv ), "t " );
echo "Original string : " . $encrypted . "<br />n";
echo "Decrypted string : " . $plaintext . "<br />n";
由于我使用相同的IV
和key
进行加密,我希望这能很好地解密。然而,我似乎错过了一些东西,因为我仍然在plaintext.
中看到胡言乱语
编辑:
看来AES的全部目的是
keys
和我必须使用的IV
是由CryptoJS输出的(请参阅中的console.log
JS函数)。如果我使用这些,函数似乎运行得很好。但实际上我不想这样,因为这些键是动态的因此,每次我运行JS函数时,它们都会发生变化我只是需要客户端和服务器之间的共享私钥,用于加密/解密并且是静态的。就这么简单。
您的密钥为128位($key的长度为32个十六进制字符,表示16字节或128位)。但是,在mcrypt_decrypt()调用中,您告诉PHP使用带有256位密钥的MCRYPT_RIJNDAEL_256
。请尝试使用MCRYPT_RIJNDAEL_128
。通常,密码应该适应传递的密钥的长度,但可能是PHP在密钥中填充了空字节,以使用256位加密。
其次,在PHP中,mcrypt_decrypt被设置为使用CBC模式(请参阅MCRYPT_MODE_CBC
)。您没有指定CryptoJS应该使用哪种模式。幸运的是,根据CryptoJS的文档,CBC模式是默认使用的模式;但是,由于您正在编写可移植代码,因此应该考虑将其明确化。
编辑
如果它告诉你钥匙太长,那是因为你没有把它们打包。您向PHP提供了一个长32字节(256位)的十六进制编码字符串,这不是您的密钥!要获得你需要做的二进制数据:
$key = pack('H*', "000102030405060708090a0b0c0d0e0f");
$iv = pack('H*', "101112131415161718191a1b1c1d1e1f");
CCD_ 10函数将十六进制表示转换为二进制字符串。
MCRYPT_RIJNDAEL_256
与AES不同。256
与密码的块大小有关,而不是与密钥大小有关。
快速历史课程-AES是一场比赛,最终被一种名为Rijndael的算法赢得。Rinjdael是为几个块大小(128、160、192、224和256位)定义的密码。然而,对于AES,仅选择128位块大小。
当您使用需要IV的模式(如CBC模式)时,块大小定义IV的大小。因此,对于AES,无论密钥大小如何,您都需要128位IV。支持的密钥大小为128、192或256位。
在PHP中,可以使用密码MCRYPT_RIJNDAEL_128
来使用AES。