0

これが私の Python コードです。M2Crypto を使用して正常に暗号化および復号化できます。

from base64 import b64encode, b64decode
import M2Crypto

class AESEncryptionService(object):
    def encrypt(self, key, msg):
        return self.__cipher(key, msg, 1)

    def decrypt(self, key, msg):
        try:
            decrypted = self.__cipher(key, msg, 0)
            return decrypted
        except:
            return False

    def __cipher(self, key, msg, op):
        iv = '\0' * 16
        iv.encode('ascii')
        cipher = M2Crypto.EVP.Cipher(alg='aes_128_cbc', key=key, iv=iv, op=op)
        v = cipher.update(msg)
        v = v + cipher.final()
        del cipher
        return v

enc_service = AESEncryptionService()
cipher = b64encode(enc_service.encrypt("FD496E240E7822552BC0D63C03AB7ABB", "Hello Hello Hello Hello Hello Hello Hello"))

print cipher

plaintext = enc_service.decrypt("FD496E240E7822552BC0D63C03AB7ABB", b64decode(cipher))

print plaintext

出力:

oMkdgXOy49VvvbQksxuhBq3YqJWrEw++lZO3ZMYYyo6T7JpK+Ovp+tdm+FrVGPnN
Hello Hello Hello Hello Hello Hello Hello

同じ結果が得られることを期待して、PHP で簡単なテスト スクリプトを作成しました。

<?php

$key = 'FD496E240E7822552BC0D63C03AB7ABB';
$plain = 'Hello Hello Hello Hello Hello Hello Hello';
$iv = '0000000000000000';

$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plain, MCRYPT_MODE_CBC, $iv);

$plain = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $cipher, MCRYPT_MODE_CBC, $iv);

echo base64_encode($cipher), '<br>';
echo $plain;

出力:

v5QinnNaEkn8myZa31Ikl5DrrtSXrhebDERJz4uqUgWMvbZ3datyCbm9WHPGlAo7
Hello Hello Hello Hello Hello Hello Hello

PHP と同じように出力するように Python コードを修正するのを手伝ってくれませんか? PHP の AES の実装は、.NET で復号化できるため、正しいことを知っています。M2Crypto Python ライブラリによって出力された文字列は、.NET では復号化できません。

パディングと関係があるのではないかと思います。

M2Crypto.EVP.Cipher にはパディング パラメータがあります。1、2、3、128 に設定してみましたが、暗号には影響しないようです。

4

2 に答える 2

1

PHP$ivはASCIIゼロの文字列(つまり、byte 0x30)のように見えますが、Pythonivではリテラル0x00バイトを使用しているように見えます。

編集

b64encodeまた、暗号文をとに渡しているように見えますb64decode。これらが完全に逆であると確信していますか?改行、フォーマット、新しい行の末尾などはありませんか?

于 2012-08-05T21:09:38.233 に答える
0

簡単なグーグル検索により、次のスニペットが明らかになりました: http://www.example-code.com/python/crypt2_aes_matchPhp.asp

試してみる価値はありますか?

于 2012-08-05T21:27:52.040 に答える