这段代码可以直接运行,测试数据可用自己模拟.
如果超过16个字节,会每16个字节加密一次, 依次类推.
注意: 里面密钥和数据补充是用NUL
#coding: utf8
import sys
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import base64
import os
import sys
class prpcrypt():
LENGTH = 16
cryptor = None
def __init__(self, key, iv):
self.key = self.fill_character(key)
self.iv = iv
#self.mode = AES.MODE_CBC
self.mode = AES.MODE_ECB
self.cryptor = AES.new(self.key, self.mode)
def fill_character(self, value):
if len(value) < self.LENGTH:
value = he.ljust(16, '\000')
elif len(value) > self.LENGTH:
value = value[: 16]
return value
#加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
def encrypt(self, text):
#这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用
count = len(text)
if(count % self.LENGTH != 0) :
add = self.LENGTH - (count % self.LENGTH)
else:
add = 0
text = text + ('\000' * add)
#print "%s" % b2a_hex(text)
self.ciphertext = self.cryptor.encrypt(text) #加密
print "%s" % b2a_hex(self.ciphertext) #b2a_hex二进制转16进制并输出
return self.ciphertext
#解密后,去掉补足的空格用strip() 去掉
def decrypt(self, text):
length = 16
count = len(text)
if(count % length != 0) :
add = length - (count % length)
else:
add = 0
text = text + ('\000' * add)
plain_text = self.cryptor.decrypt(text) #解密
return plain_text
def _16byte_decrypt(self, data):
length = len(data);
n = 0
result_data = str()
print '-------解密--------------'
while n < length :
tmp = data[n: n + self.LENGTH]
n = n + self.LENGTH
#logger.debug('---------------------n: %d', n)
result_data += self.decrypt(tmp)
return result_data
def _16byte_encrypt(self, data):
n = 0;
en_data = str()
tmp = str()
print '-------加密---------------'
while(n < len(data)):
if (n + self.LENGTH) > len(data):
tmp = data[n: ]
else:
tmp = data[n: n+self.LENGTH]
n = n + self.LENGTH
#print len(tmp)
en_data = en_data + self.encrypt(tmp)
return en_data
def Save(name, data):
try:
file =open(name, 'w')
file.write(data)
except:
os.unlink(name)
file.flush()
file.close()
if __name__ == '__main__':
'''
pc = prpcrypt('keyskeyskeyskeys', None) #初始化密钥
e = pc.encrypt("0123456789ABCDEF")
d = pc.decrypt(e)
print e, d
e = pc.encrypt("0000000000000000")
d = pc.decrypt(e)
# b91c117bc0fa9225a0c5132709ae96e0 0000000000000000
print e, d
'''
he = 'AAA'
print b2a_hex(he.ljust(16, '\000'))
obj = prpcrypt('hello word', None) #初始化密钥
file = open('xxx', 'r') #将xxx 替换成你要加密的数据
data = file.read()
file.close
print len(data)
en_data = obj._16byte_encrypt(data)
print len(en_data)
Save("22222_en", en_data)
de_data = obj._16byte_decrypt(en_data)
Save("22222_de", de_data)