python2.x和3.x为什么不兼容_Python中使用AES算法(解决Python2.x和3.x下运行不兼容问题)...
兩年前使用python時(shí),碰到2.x下AES加密解密算法代碼無(wú)法在3.x下順利運(yùn)行,花點(diǎn)時(shí)間解決了兼容問(wèn)題,在2.7、3.6、3.7下運(yùn)行良好。
Linux系統(tǒng)安裝依賴庫(kù)比較簡(jiǎn)單,Windows下稍嫌繁瑣,裝完必須的庫(kù)也可以正常運(yùn)行。
代碼整理如下:
# -*- coding: utf-8 -*-
import base64
import sys
from Crypto import Random
from Crypto.Cipher import AES
# Author: areful
# Date: 2017-07-06
class AESCipher:
def __init__(self, key, iv=Random.new().read(AES.block_size)):
self.key = key
self.iv = iv
self.mode = AES.MODE_CBC
if sys.version > '3':
self.PY3 = True
else:
self.PY3 = False
def encrypt(self, text):
if self.PY3:
return self.encrypt36(text)
else:
return self.encrypt27(text)
def encrypt27(self, text):
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
bs = AES.block_size
text_length = len(text)
amount_to_pad = bs - (text_length % bs)
if amount_to_pad == 0:
amount_to_pad = bs
pad = chr(amount_to_pad)
text1 = text + pad * amount_to_pad
cipher_text = cipher.encrypt(text1)
return base64.b64encode(cipher_text)
def encrypt36(self, text):
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
bs = AES.block_size
text_length = len(text.encode('utf-8'))
amount_to_pad = bs - (text_length % bs)
if amount_to_pad == 0:
amount_to_pad = bs
pad = chr(amount_to_pad)
text1 = text + pad * amount_to_pad
cipher_text = cipher.encrypt(text1)
encrypted_str = str(base64.b64encode(cipher_text), encoding='utf-8')
return encrypted_str
def decrypt(self, text):
import base64
base_text = base64.b64decode(text)
cipher = AES.new(self.key, self.mode, self.iv)
plain_text = cipher.decrypt(base_text).decode('utf-8')
pad = ord(plain_text[-1])
ne = plain_text[:-pad]
return ne
@staticmethod
def pad(s):
bs = AES.block_size
return s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
@staticmethod
def unpad(s):
return s[0:-ord(s[-1])]
@staticmethod
def __pad(text):
text_length = len(text)
amount_to_pad = AES.block_size - (text_length % AES.block_size)
if amount_to_pad == 0:
amount_to_pad = AES.block_size
pad = chr(amount_to_pad)
return text + pad * amount_to_pad
@staticmethod
def __unpad(text):
pad = ord(text[-1])
return text[:-pad]
@staticmethod
def test(key, iv, text):
cipher = AESCipher(key, iv)
encrypted_msg = cipher.encrypt(text)
print(encrypted_msg)
msg = cipher.decrypt(encrypted_msg)
print(msg)
if __name__ == '__main__':
AESCipher.test('ABCDEFGHICKLMNOP',
bytes(bytearray(b'x01x02x03x04x05x06x07x08x41x42x43x44x45x46x47x48')),
'areful.測(cè)試文本')
總結(jié)
以上是生活随笔為你收集整理的python2.x和3.x为什么不兼容_Python中使用AES算法(解决Python2.x和3.x下运行不兼容问题)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js生日计算年龄_JS根据生日算年龄的方
- 下一篇: python一些常用方法_python常