我尝试通过演示应用加密as3crypto中的文本。
现在我试图通过php解密加密的文本,但似乎文本没有正确解密。有谁知道如何通过PHP正确解密它?或者我做错了吗?请赐教......
这是场景:
在http://crypto.hurlant.com/demo/中加密:
加密: AES
模式: CBC
填充:无
密钥: 11918f8bcd112e92744125008722050c
文字: Lorem ipsum dolor坐下来,精神上的adipistur elit。在ut massa nec purus laoreet posuere quis vitae tortor。
初始化向量: 将其留空
按加密。选择base64并复制密文。
制作一个包含这些代码的php脚本并运行它:
$ cipher = MCRYPT_RIJNDAEL_128;
$ mode = MCRYPT_MODE_CBC;
$ key =“11918f8bcd112e92744125008722050c”;
$ cipher =“PLACE CIPHER TEXT HERE ...”;
$ data = base64_decode($ cipher);
echo mcrypt_decrypt($ cipher,$ key,$ data,$ mode);
答案 0 :(得分:2)
这样可行:
PHP代码:
//notice that $key and $iv length must be 16 chars long! ex: 1234567890123456
function decrypt($data,$key,$iv)
{
$decr= mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv);
return $decr;
}
这是AS3代码
//notice that $key and $iv length must be 16 chars long! ex: 1234567890123456
private function encrypt(input:String,decrKey:String,decrIV:String):String
{
var inputBA:ByteArray=Hex.toArray(Hex.fromString(input));
var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
var pad:IPad = new NullPad();
var aes:ICipher = Crypto.getCipher("aes-cbc", key, pad);
var ivmode:IVMode = aes as IVMode;
ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
aes.encrypt(inputBA);
return Base64.encodeByteArray( inputBA);
}
答案 1 :(得分:1)
mcrypt_decrypt
会将每个字符解释为它的基础ASCII值(如a = 97)而不是十六进制值(a = 10)。使用hex2bin方法将十六进制字符串转换为字节字符串,您的解密应该可以正常工作。
另外,问题可能在于as3crypto和php之间的默认IV(初始化向量)的不同想法。由于您使用的是CBC模式,因此您应该指定IV,这是一种很好的安全措施。还要注意与你的密钥类似的潜在缺陷,在as3中指定一个十六进制字符串并需要在php中进行转换。