1

我试图通过演示应用程序加密 as3crypto 中的文本。

现在我正在尝试通过 php 解密加密的文本,但似乎文本没有正确解密。有谁知道如何通过PHP正确解密它?还是我做错了?请赐教...

这是场景:

  1. 在http://crypto.hurlant.com/demo/中加密它:

    加密: AES

    模式: CBC

    填充:

    密钥: 11918f8bcd112e92744125008722050c

    文字: Lorem ipsum dolor sit amet,consectetur adipiscing elit。在 ut massa nec purus laoreet posuere quis vitae tortor。

    初始化向量: 留空

  2. 按加密。选择base64并复制密文。

  3. 制作一个包含这些代码的 php 脚本并运行它:

    $cipher = MCRYPT_RIJNDAEL_128;

    $mode = MCRYPT_MODE_CBC;

    $key = "11918f8bcd112e92744125008722050c";

    $cipher = "在此处放置密码文本...";

    $data = base64_decode($cipher);

    echo mcrypt_decrypt($cipher, $key, $data, $mode);

4

2 回答 2

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);
}       
于 2013-11-10T18:09:47.303 回答
1

问题可能出在你的钥匙上。虽然您可以将十六进制字符串提供给 as3crypto 并且它会知道如何处理它,但mcrypt_decrypt会将每个字符解释为它的底层 ASCII 值(如 a = 97)而不是它的十六进制值(a = 10)。使用hex2bin方法将十六进制字符串转换为字节字符串,您的解密应该可以正常工作。

此外,问题可能在于 as3crypto 和 php 之间的默认 IV(初始化向量)的不同想法。由于您使用的是 CBC 模式,因此您应该指定 IV,作为一种良好的安全实践。还要注意与您的密钥类似的潜在陷阱,即在 as3 中指定十六进制字符串并需要在 php.ini 中将其转换。

于 2013-03-19T05:29:13.537 回答