正确地从Python 2 md5库迁移到Python 3 hashlib
我正在尝试将第三方支付网关(正确地从Python 2 md5库迁移到Python 3 hashlib,python,django,python-3.x,ccavenue,Python,Django,Python 3.x,Ccavenue,我正在尝试将第三方支付网关(CCAvenue)集成到Django 1.11、Python 3.5.2中 第三方提供的参考代码使用不推荐的库md5加密文本 from Crypto.Cipher import AES import md5 def pad(data): length = 16 - (len(data) % 16) data += chr(length)*length return data def encrypt(plainText,workingKey)
CCAvenue
)集成到Django 1.11、Python 3.5.2中
第三方提供的参考代码使用不推荐的库md5加密文本
from Crypto.Cipher import AES
import md5
def pad(data):
length = 16 - (len(data) % 16)
data += chr(length)*length
return data
def encrypt(plainText,workingKey):
iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
plainText = pad(plainText)
encDigest = md5.new ()
encDigest.update(workingKey)
enc_cipher = AES.new(encDigest.digest(), AES.MODE_CBC, iv)
encryptedText = enc_cipher.encrypt(plainText).encode('hex')
return encryptedText
如何使用Python 3的
hashlib
库使上述encrypt()
方法与Python 3兼容?你能发布整个方法吗?警告:不要再使用加密或pycrypto强>
以下是一种与Python 3兼容的方法:
from binascii import hexlify, unhexlify
from Crypto.Cipher import AES
from hashlib import md5
from django.utils.encoding import force_bytes
iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
# for python 3.9 & pycryptodome, this need to be byte
iv = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
BS = 16
def _pad(data):
return data + (BS - len(data) % BS) * chr(BS - len(data) % BS)
def _unpad(data):
return data[0:-ord(data[-1])]
def encrypt(plain_text, working_key):
plain_text = _pad(plain_text)
enc_cipher = AES.new(md5(force_bytes(working_key)).digest(), AES.MODE_CBC, _iv)
return hexlify(enc_cipher.encrypt(plain_text)).decode('utf-8')
def decrypt(cipher_text, working_key):
encrypted_text = unhexlify(cipher_text)
dec_cipher = AES.new(md5(force_bytes(working_key)).digest(), AES.MODE_CBC, _iv)
return _unpad(dec_cipher.decrypt(encrypted_text).decode('utf-8'))
警告:不要再使用加密或pycrypto强> 以下是一种与Python 3兼容的方法:
from binascii import hexlify, unhexlify
from Crypto.Cipher import AES
from hashlib import md5
from django.utils.encoding import force_bytes
iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
# for python 3.9 & pycryptodome, this need to be byte
iv = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
BS = 16
def _pad(data):
return data + (BS - len(data) % BS) * chr(BS - len(data) % BS)
def _unpad(data):
return data[0:-ord(data[-1])]
def encrypt(plain_text, working_key):
plain_text = _pad(plain_text)
enc_cipher = AES.new(md5(force_bytes(working_key)).digest(), AES.MODE_CBC, _iv)
return hexlify(enc_cipher.encrypt(plain_text)).decode('utf-8')
def decrypt(cipher_text, working_key):
encrypted_text = unhexlify(cipher_text)
dec_cipher = AES.new(md5(force_bytes(working_key)).digest(), AES.MODE_CBC, _iv)
return _unpad(dec_cipher.decrypt(encrypted_text).decode('utf-8'))
你的Python2对3?你的Python2对3?在ashwini上运行得非常好。CCAVINE应该用这些方法更新他们的参考代码。CCA应使用这些方法更新其参考代码。