3

字符串在这里用 php 加密。可以使用以下参数对其进行解密:Rijndael-256、ECB 和 Base64。但它不能被我的 ActionScript 代码解密:

var text:String = "Some data";
var key:ByteArray = new ByteArray();
key.writeUTFBytes("SomePassword");
key.position = key.length;
for (var i:int = key.length; i < 256 / 8; i++) {
    key.writeByte(0);
}
var pad:IPad = new NullPad();
var cipher:ICipher = Crypto.getCipher("aes-256-ecb", key, pad);
var data:ByteArray = Base64.decodeToByteArray(text);
cipher.decrypt(data);
trace(data.toString());

升级版:

“无法解密”意味着我得到了错误的纯文本。

在 php 中,纯文本首先由 aes-256-ecb 加密。然后用Base64编码。在 ActionScript 中,这些步骤以相反的顺序完成。

UPD2:

测试编码解码:

var key:ByteArray = new ByteArray();
key.writeUTFBytes("Some password");
key.position = key.length;
for (var i:int = key.length; i < 256 / 8; i++) {
    key.writeByte(0);
}
trace(key.toString());
var data:ByteArray = new ByteArray();//plain text
data.writeUTFBytes("Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!");
var pad:IPad = new NullPad();
var cipher:ICipher = Crypto.getCipher("aes-256-ecb", key, pad);
trace(data.toString());//trace plain text
cipher.encrypt(data);
trace(data.toString());//trace encrypted text
cipher.decrypt(data);
trace(data.toString());//trace decrypted text

停止后的输出cihper.encrypt(data)为:

Some password
Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!
[Fault] exception, information=Error: Error #2030: End of file found.

UPD3:

它适用于 PKCS5 填充:

var pad:IPad = new PKCS5();
var cipher:ICipher = Crypto.getCipher("aes-256-ecb", key, pad);
pad.setBlockSize(cipher.getBlockSize());

输出是:

Some password
Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!
$ú^{±àÙ[pm|x¿9¡ÃZsI D¾`©4¾þÂõ,J
('èfÑk1ôì&­ªQƆfbÇåòþ§VµÄs   ¦p<iÿ
Hello, my dear World! Hello, the Sun! Hello, the Moon! Hello! Hello! Hello!

UPD4:

对于从 php (as here ) 获取的数据,带有 PKCS5 填充的代码在此处停止运行。并且使用 Null 填充它不会停止但解密的数据是错误的。

4

1 回答 1

2

引用上一篇文章中的代码:

return trim(
    base64_encode(
        mcrypt_encrypt(
            MCRYPT_RIJNDAEL_256,
            $sSecretKey, $sValue, 
            MCRYPT_MODE_ECB, 
            mcrypt_create_iv(
                mcrypt_get_iv_size(
                    MCRYPT_RIJNDAEL_256, 
                    MCRYPT_MODE_ECB
                ), 
                MCRYPT_RAND)
            )
        )
    );

MCRYPT_RIJNDAEL_256 不是 AES。MCRYPT_RIJNDAEL_128 是。Rijndael 具有可变的块大小。AES 是 Rijndael 的一个子集,具有固定的块大小。

MCRYPT_RIJNDAEL_* 后面的数字是指块大小。所以 MCRYPT_RIJNDAEL_256 是具有 256 位块大小的 Rijndael。MCRYPT_RIJNDAEL_128 是具有 128 块大小的 Rijndael,即 AES。

此外,如果您要使用 MCRYPT_MODE_ECB,我会将 mcrypt_create_iv() 调用替换为由一堆空字节组成的空字符串。ECB 作为块模式不使用 IV。

最后,我个人的建议是使用phpseclib,一个纯 PHP AES 实现,因为这对 mcrypt 来说是非常反直觉的。

于 2012-12-06T21:57:54.800 回答