有一个使用此算法加密的字符串。
b'{"merchantID": "XXXXXXXXXXX", "tokenID": "YYYYYY-YYYYYYYYYY-YYYY"}'
在输出中,我看到了有效载荷
25BE197FB04DAC542243AC124C3799031007417C2E214C833318C469D7D328DB889B36CDAACBB67D6F528911F3B31F7E3E4D44E3016A5A29D179998665FB4B590F42F4FEFA6771B5302AE1C067D9ACE0F8477D11BA82217B9A9F0E4941545161
我正在尝试使用解密方法解密字符串 - 它给出了
from base64 import b16encode, b16decode
from os import urandom
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.hashes import SHA1
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from gateway.exceptions import ConfigurationError
class Crypt:
"""AES-256-CBC crypto class"""
IV_LENGTH = 16
token = ""
cert = ""
def __init__(self, conf_token, conf_cert):
def get_repr_fp(cert):
fingerprint = x509.load_pem_x509_certificate(
cert, default_backend()).fingerprint(SHA1())
fingerprint = b16encode(fingerprint).decode()
return ":".join(str(fingerprint[i:i+2]).upper() for i in range(
0, len(fingerprint), 2))
def gen_key(fp):
token = conf_token
return ("".join(
chr(ord(x) | ord(y))
for x, y in zip(fp, token))[:len(token)]).encode()
try:
with open(conf_cert, 'rb') as f:
pub = f.read()
f.close()
fingerprint = get_repr_fp(pub)
encryptkey = gen_key(fingerprint)
except TypeError as e:
raise ConfigurationError() from e
aes = algorithms.AES(encryptkey)
self.BLOCK_SIZE = aes.block_size
self.KEY_LENGTH = int(aes.key_size / 8)
self.__decryptkey = fingerprint[:self.KEY_LENGTH].encode()
self.__encryptkey = encryptkey
def __cipher(self, key, iv):
aes = algorithms.AES(key)
return Cipher(aes, modes.CBC(iv), backend=default_backend())
def encryptor(self, iv):
"""Get encryptor context"""
return self.__cipher(self.__encryptkey, iv).encryptor()
def decryptor(self, iv):
return self.__cipher(self.__decryptkey, iv).decryptor()
def __pad_data(self, data):
"""Add null padding to data"""
block_bytes = int(self.BLOCK_SIZE / 8)
data = data + bytes((block_bytes - len(data) % block_bytes))
return data
def __unpad_data(self, data):
"""Remove padding from data"""
return data.decode().strip()
def encrypt(self, data):
"""Encrypt content"""
iv = urandom(self.IV_LENGTH)
encryptor = self.encryptor(iv)
return b16encode(iv + (encryptor.update(self.__pad_data(
data)) + encryptor.finalize()))
def decrypt(self, data):
"""Decrypt content"""
data = b16decode(data.upper())
decryptor = self.decryptor(data[:self.IV_LENGTH])
return self.__unpad_data(
decryptor.update(data[self.IV_LENGTH:]) + decryptor.finalize())
c = Crypt(conf_token="xxxxxxxxxxxxx+", conf_cert= "yyyy.pem")
rawtext = "zzzz"
a = rawtext.encode()
z = c.encrypt(a)
print("Encrypted - :",z)
f = c.decrypt(z)
print(f)
AES 是一种对称密码。这意味着数据使用相同的密钥进行加密和解密。
此外,您将“私钥”形成为某种带有冒号的难以理解的字符串。