介绍
- 实际操作中,当需要Python加解密并与Java互传数据时,就需要用Python实现一遍加解密
pkcs5介绍
-
pkcs5
是一种数据填充的方式。
- 在对数据做加密的过程中,我们会先将数据按照指定的
blockszie
(按照字节)分组,当数据的字节数不是blockszie的整数倍时,我们就需要对这一分组进行填充到blockszie
的整数倍。
- 不论是不是
blockszie
的整数倍,都进行填充。
- PKCS5只是对于8字节(BlockSize=8)进行填充,填充内容为0x01-0x08。
依赖包
pycryptodome
加密填充实现
from Crypto.Cipher import AES
def padding_pkcs5(value):
BS = AES.block_size
return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS), encoding='utf-8')
加密实现
from Crypto.Cipher import AES
import hashlib
# keys是32位
def aes_ecb_encrypt(response, keys):
response = padding_pkcs5(response)
# mode根据实际需要填写
cipher = AES.new(bytes.fromhex(get_sha1prng_key(keys)), mode=AES.MODE_ECB)
encrypt_cipher = cipher.encrypt(response)
return ''.join(['%02x' % i for i in encrypt_cipher]).upper()
def get_sha1prng_key(key):
'''这一部分根据自己需要生成key
same as java AES crypto key generator SHA1PRNG
Arguments:
key {[string]} -- [key]
Returns:
[string] -- [hexstring]
'''
signature = hashlib.sha1(key.encode()).digest()
signature = hashlib.sha1(signature).digest()
return ''.join(['%02x' % i for i in signature]).upper()[:32]
解密实现
def aes_ecb_decrypt(keys, value):
keys = bytes.fromhex(get_sha1prng_key(keys))
cryptor = AES.new(keys, AES.MODE_ECB)
result = bytes()
for i in range(int(len(value) / 2)):
high = int(value[i * 2:i * 2 + 1], 16)
low = int(value[i * 2 + 1:i * 2 + 2], 16)
result += bytes([high * 16 + low])
ciphertext = str(cryptor.decrypt(result), encoding='utf-8')
ciphertext = ciphertext[0:-ord(ciphertext[-1])]
return ciphertext