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());

UPD:

「復号化できない」とは、プレーンテキストが間違っていることを意味します。

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から取得したデータの場合、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 は、AES とも呼ばれる 128 ブロック サイズの Rijndael です。

また、MCRYPT_MODE_ECB を使用する場合は、mcrypt_create_iv() 呼び出しを一連の null バイトの空の文字列に置き換えます。ブロックモードとしての ECB は IV を使用しません。

最後に、私自身の個人的な推奨事項は、これはすべて mcrypt と非常に直感的であるため、純粋な PHP AES 実装である phpseclibを使用することです。

于 2012-12-06T21:57:54.800 に答える