python測試AES-128,AES.MODE_ECB模式 加解密

這段代碼可以直接運行,測試數據可用自己模擬.
如果超過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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章