python 實現 AES CBC模式加解密


AES加密方式有五種:ECB, CBC, CTR, CFB, OFB

從安全性角度推薦CBC加密方法,本文介紹了CBC,ECB兩種加密方法的python實現

python 在 Windows下使用AES時要安裝的是pycryptodome 模塊   pip install pycryptodome 

python 在 Linux下使用AES時要安裝的是pycrypto模塊   pip install pycrypto 

CBC加密需要一個十六位的key(密鑰)和一個十六位iv(偏移量)

1. 加密

加密時,明文首先與IV異或,然后將結果進行塊加密,得到的輸出就是密文,同時本次的輸出密文作為下一個塊加密的IV。 

2. 解密

解密時,先將密文的第一個塊進行塊解密,然后將結果與IV異或,就能得到明文,同時,本次解密的輸入密文作為下一個塊解密的IV。 

 

 

 3. 代碼:

  

# -*- coding=utf-8-*-
from Crypto.Cipher import AES
import os
from Crypto import Random
import base64

"""
aes加密算法
padding : PKCS7
"""

class AESUtil:

    __BLOCK_SIZE_16 = BLOCK_SIZE_16 = AES.block_size

    @staticmethod
    def encryt(str, key, iv):
        cipher = AES.new(key, AES.MODE_CBC,iv)
        x = AESUtil.__BLOCK_SIZE_16 - (len(str) % AESUtil.__BLOCK_SIZE_16)
        if x != 0:
            str = str + chr(x)*x
        msg = cipher.encrypt(str)
        # msg = base64.urlsafe_b64encode(msg).replace('=', '')
        msg = base64.b64encode(msg)
        return msg

    @staticmethod
    def decrypt(enStr, key, iv):
        cipher = AES.new(key, AES.MODE_CBC, iv)
        # enStr += (len(enStr) % 4)*"="
        # decryptByts = base64.urlsafe_b64decode(enStr)
        decryptByts = base64.b64decode(enStr)
        msg = cipher.decrypt(decryptByts)
        paddingLen = ord(msg[len(msg)-1])
        return msg[0:-paddingLen]

if __name__ == "__main__":
    key = "1234567812345678"
    iv = "1234567812345678"
    res = AESUtil.encryt("123456", key, iv)
    print res # 2eDiseYiSX62qk/WS/ZDmg==
    print AESUtil.decrypt(res, key, iv) # 123456

 

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM