本文實例講述了python實現的AES雙向對稱加密解密與用法。分享給大家供大家參考,具體如下:
高級加密標準(Advanced Encryption Standard,AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。
AES只是個基本算法,實現AES有若干模式。其中的CBC模式因為其安全性而被TLS(就是https的加密標準)和IPSec(win采用的)作為技術標準。簡單地說,CBC使用密碼和salt(起擾亂作用)按固定算法(md5)產生key和iv。然后用key和iv(初始向量,加密第一塊明文)加密(明文)和解密(密文)。
下面介紹python實現的AES加密解密實例,這里采用CBC模式,用到了pycrypto模塊
安裝:
pip install Cryptopip install binascii
實現:
#!/usr/bin/env python# -*- coding:utf-8 -*-#@author: rui.xu#這里使用pycrypto庫#按照方法:easy_install pycryptofrom Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hexclass prpcrypt():  def __init__(self,key):    self.key = key    self.mode = AES.MODE_CBC  #加密函數,如果text不足16位就用空格補足為16位,  #如果大于16當時不是16的倍數,那就補足為16的倍數。  def encrypt(self,text):    cryptor = AES.new(self.key,self.mode,b'0000000000000000')    #這里密鑰key 長度必須為16(AES-128),    #24(AES-192),或者32 (AES-256)Bytes 長度    #目前AES-128 足夠目前使用    length = 16    count = len(text)    if count < length:      add = (length-count)      #/0 backspace      text = text + ('/0' * add)    elif count > length:      add = (length-(count % length))      text = text + ('/0' * add)    self.ciphertext = cryptor.encrypt(text)    #因為AES加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題    #所以這里統一把加密后的字符串轉化為16進制字符串    return b2a_hex(self.ciphertext)  #解密后,去掉補足的空格用strip() 去掉  def decrypt(self,text):    cryptor = AES.new(self.key,self.mode,b'0000000000000000')    plain_text = cryptor.decrypt(a2b_hex(text))    return plain_text.rstrip('/0')if __name__ == '__main__':  pc = prpcrypt('keyskeyskeyskeys') #初始化密鑰  import sys  e = pc.encrypt(sys.argv[1]) #加密  d = pc.decrypt(e) #解密  print "加密:",e  print "解密:",dValueError: IV must be 16 bytes long windows下默認會報這個錯,
新聞熱點
疑難解答