首页 > 编程知识 正文

aes加密算法原理,AES加密算法

时间:2023-05-06 18:04:36 阅读:169694 作者:2094

DES 和AES加密算法(python实现)已测试通过 (1) DES算法 from Crypto.Cipher import DESfrom binascii import b2a_hex, a2b_hexclass MyDESCrypt: def __init__(self, key=''): # 密钥长度必须为64位,也就是8个字节 if key != '': self.key = key.encode('utf-8') else: self.key = '12345678'.encode('utf-8') self.mode = DES.MODE_CBC # 加密函数,如果text不足16位就用空格补足为16位, # 如果大于16当时不是16的倍数,那就补足为16的倍数。 def encrypt(self, text): try: text = text.encode('utf-8') cryptor = DES.new(self.key, self.mode, self.key) # 这里密钥key 长度必须为16(DES-128), # 24(DES-192),或者32 (DES-256)Bytes 长度 # 目前DES-128 足够目前使用 length = 16 # lenth可以设置为8的倍数 count = len(text) if count < length: add = (length - count) # backspace # text = text + ('' * add) text = text + ('' * add).encode('utf-8') elif count > length: add = (length - (count % length)) # text = text + ('' * add) text = text + ('' * add).encode('utf-8') self.ciphertext = cryptor.encrypt(text) # 因为DES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题 # 所以这里统一把加密后的字符串转化为16进制字符串 return b2a_hex(self.ciphertext) except: return "" # 解密后,去掉补足的空格用strip() 去掉 def decrypt(self, text): try: cryptor = DES.new(self.key, self.mode, self.key) plain_text = cryptor.decrypt(a2b_hex(text)) # return plain_text.rstrip('') return bytes.decode(plain_text).rstrip('') except: return ""if __name__ == '__main__': msg = "python is the best language!" key = "12345678" # key值可传可不传 des1 = MyDESCrypt() # 加密 cipherTxt = des1.encrypt(msg) # 返回值为bytes型 print(cipherTxt) # 解密 decTxt = des1.decrypt(cipherTxt); # 返回值为str型 print(decTxt) AES算法 import base64from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hexclass PrpCrypt(object): def __init__(self, key, iv): self.key = key.encode('utf-8') self.mode = AES.MODE_CBC self.iv = iv.encode('utf-8') def pad_byte(self, b): ''' 1 先计算所传入bytes类型文本与16的余数 2 在将此余数转成bytes 当然用0补位也可以 3 已知了 余数 那么就用余数*被转成的余数,就得到了需要补全的bytes 4 拼接原有文本和补位 :param b: bytes类型的文本 :return: 返回补全后的bytes文本 ''' bytes_num_to_pad = AES.block_size - (len(b) % AES.block_size) # python3 中默认unicode转码 # 实际上byte_to_pad 就已经 将 数字转成了unicode 对应的字符 即使你的入参正好是16的倍数,那么bytes也是把列表整体的转码也是有值的 # 后边解密的匿名函数 拿到最后一个数字后,就知道应该截取的长度,在反着切片就行了 # 这样保证了数据的完整性 byte_to_pad = bytes([bytes_num_to_pad]) padding = byte_to_pad * bytes_num_to_pad padded = b + padding return padded def encrypt(self, text): ''' 1 先生成aes实例 2 对传入的text转成bytes 3 对传入的text补全 4 调用encrypt 加密 得到密文 5 先将密文转16进制,在将16进制用base64转码,然后在将得到的base64解码 其实在步骤4 就已经完成了aes加密,我所在的公司加密比较复杂 ,需要的可以直接返回步骤4的值 :param text: :return: ''' cryptor = AES.new(self.key, self.mode, self.iv) text = text.encode('utf-8') text = self.pad_byte(text) self.ciphertext = cryptor.encrypt(text) cryptbase64 = base64.b64encode(b2a_hex(self.ciphertext)).decode('utf8') return cryptbase64 def decrypt(self, text): ''' 解密和加密的顺序是相反的 1 定义匿名函数,去掉补位 2 base64解码 3 生成aes实例 4 16进制转2进制 5 使用decrypt解码 得到补全的bytes类型明文 :param text: :return: 解密且去掉补位的明文 ''' unpad = lambda s: s[:-ord(s[len(s) - 1:])] base64Str = base64.b64decode(text.encode('utf8')) cryptor = AES.new(self.key, self.mode, self.iv) aesStr = cryptor.decrypt(a2b_hex(base64Str)) aesStr = str(unpad(aesStr), encoding='utf8') return aesStrif __name__ == '__main__': data = '1213131321' pc = PrpCrypt('daajanbaqa654321', '1234567890123456') # 加密 redata = pc.encrypt(data) print(redata) # 解密 result = pc.decrypt(redata) print(result)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。