2

Zend2 Crypt モジュールを使用してデータを暗号化しています。これが私のコードです。

$cipher = BlockCipher::factory('mcrypt', array(
  'algorithm' => 'aes',
));
$cipher->setKey('mypassphrase');
$encrypted = $cipher->encrypt('Hey, I am the secret data');

クール、それはうまくいきます!$encrypted次に、そのデータ (私は秘密のデータです) を Python で復号化する必要があります。

私はそれを行うためにpycryptoを使用しています。PHP 環境外でデータを復号化する手順は?

    from Crypto.Cipher import AES
    import base64
    import hashlib

    password = 'mypassphrase'
    key = hashlib.sha256(password).digest()

    decoded = base64.standard_b64decode(encrypted)
    cipher = AES.new(key, AES.MODE_CBC)
    data = cipher.decrypt(decoded)

IVZend はデフォルトで MODE_CBC を使用するため、 を指定する必要があります。Python コードでどのように指定できますか?

Zend2 のドキュメントは次のとおりです。

暗号化の出力は、HMAC 値、IV ベクトル、および暗号化されたテキストを含む、Base64 (デフォルト) でエンコードされた文字列です。使用される暗号化モードは、CBC (デフォルトでランダムな IV を持つ) と、HMAC のデフォルトのハッシュ アルゴリズムとしての SHA256 です。Mcrypt アダプタは、デフォルトで PKCS#7 パディング メカニズムを使用して暗号化します。そのための特別なアダプター (Zend\Crypt\Symmetric\Padding) を使用して、別のパディング方法を指定できます。BlockCipher で使用される暗号化および認証キーは、setKey() メソッドを使用して指定されたユーザーのキーからのキー導出関数として使用される PBKDF2 アルゴリズムで生成されます。

Python コードを適応させてデータを復号化するのを手伝ってくれる人はいますか? ありがとう

4

1 に答える 1

4

Zend2で暗号化されたデータを復号化する方法を見つけました。これが私のコードです:

from base64 import b64decode
from Crypto import Random
from Crypto.Cipher import AES
from Crypto.Hash import SHA256, HMAC
from Crypto.Protocol.KDF import PBKDF2

# The hmac starts from 0 to 64 (length).
hmac_size = 64
hmac = data[:hmac_size]

# The cipher text starts after the hmac to the end.
# The cipher text is base64 encoded, so I decoded it.
ciphertext = data[hmac_size:]
ciphertext = b64decode(ciphertext)

# The IV starts from 0 to 16 (length) of the ciphertext.
iv = ciphertext[:16]

# The key size is 256 bits -> 32 bytes.
key_size = 32

# The passphrase of the key.
password = 'mypassphrase'

# The key is generated using PBKDF2 Key Derivation Function.
# In the case of Zend2 Crypt module, the iteration number is 5000, 
# the result length is the key_size * 2 (64) and the HMAC is computed
# using the SHA256 algorithm
the_hash = PBKDF2(password, iv, count=5000, dkLen=64, prf=lambda p, s:
                  HMAC.new(p, s, SHA256).digest())

# The key starts from 0 to key_size (32).
key = the_hash[:key_size]

# The hmac key starts after the key to the end.
key_hmac = the_hash[key_size:]

# HMAC verification
hmac_new = HMAC.new(key_hmac, 'aes%s' % ciphertext, SHA256).hexdigest()
if hmac_new != hmac:
    raise Exception('HMAC verification failed.')

# Instanciate the cipher (AES CBC).
cipher = AES.new(key, AES.MODE_CBC, iv)

# It's time to decrypt the data! The ciphertext starts after the IV (so, 16 after).
data = cipher.decrypt(ciphertext[16:])

ミッションは成功しました!

于 2013-02-11T10:56:57.107 に答える