如何解密Zend2加密数据?

2024-09-27 00:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Zend2 Crypt module加密数据。这是我的密码。在

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

很酷,效果很好!现在,我需要在Python中解密$encrypted数据(嘿,我就是秘密数据)。在

我用pycrypto来做这个。在我的PHP环境之外解密数据的步骤是什么?在

^{pr2}$

我需要指定一个IV,因为Zend在默认情况下使用的是MODE\ucbc。如何在Python代码中指定它?在

以下是Zend2文档:

The output of the encryption is a string, encoded in Base64 (default), that contains the HMAC value, the IV vector, and the encrypted text. The encryption mode used is the CBC (with a random IV by default) and SHA256 as default hash algorithm of the HMAC. The Mcrypt adapter encrypts using the PKCS#7 padding mechanism by default. You can specify a different padding method using a special adapter for that (Zend\Crypt\Symmetric\Padding). The encryption and authentication keys used by the BlockCipher are generated with the PBKDF2 algorithm, used as key derivation function from the user’s key specified using the setKey() method.

有人能帮我修改Python代码来解密数据吗? 谢谢


Tags: andthe数据defaultbyalgorithmusedencrypted
1条回答
网友
1楼 · 发布于 2024-09-27 00:21:20

我找到了一种解密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:])

任务成功!

相关问题 更多 >

    热门问题