AES簡介以及配合Base64實現加密解密


一、對稱加密

1、什么是對稱加密

對稱加密就是指加密和解密使用同一個密鑰的加密方式。

2、對稱加密的工作過程

發送方使用密鑰將明文數據進行加密成密文,發送給接收方,接收方收到密文后,使用同一個密鑰將密文解密成明文。

3、對稱加密的優點

加密計算量小,速度快,適合對大量數據進行加密的場景。

4、對稱加密的兩大不足

  • 密鑰傳輸問題:由於對稱加密的加密和解密用的是同一個密鑰,所以對稱加密的安全性就不僅僅取決於加密算法本身的強度,更取決於密鑰是否被安全保管,因此加密者如何將密鑰安全傳遞到解密者手里,就成了對稱加密面臨的關鍵問題。
  • 密鑰管理問題:隨着密鑰數量增多,密鑰管理問題會逐漸顯現出來。

二、AES加密算法

AES加密算法是眾多對成績密算法中的一種,它的英文全稱是Advanced Encryption Standard,翻譯過來就是高級加密標准。

AES加密算法采用分組密碼體制,每個分組數據的長度為128位16個字節,密鑰長度可以是128位16個字節,192位或256位,一共有五種加密模式,我們通常采用需要初始向量IV的CBC模式,初始向量也是128位16個字節。

1、AES的加密流程

(1)五個關鍵詞
  • 分組密碼體制:將明文切成一段一段的來進行加密,然后把一段一段的密文拼接起來形成最終密文的加密方式。AES采用分組密碼體制,即AES加密會首先把明文切成一段一段的,而且每段數據的長度要求必須是128位16個字節,如果最后一段不夠16個字節,就需要用Padding來把這段數據填充滿16個字節,然后分別對每段數據進行加密,最后再把每段加密數據拼接起來形成最終密文、

  • Padding:Padding就是用來把不滿16個字節的分組數據填充為16個字節用的,它有三種模式:PKCS5PKCS7NOPADDINGPKCS5是指分組數據缺少幾個字節,就在數據的末尾填充幾個字節的幾。比如缺少5個字節,就在末尾填充5個字節的5。PKCS7是指分組數據缺少幾個字節,就在數據的末尾填充幾個字節的0,比如缺少7個字節,就在末尾填充7個字節的0。No Padding是指不需要填充,也就是說數據的發送方肯定會保證最后一段數據也正好是16個字節。那如果在PKCS5模式下,最后一段數據的內容剛好就是16個16怎么辦?那解密端就不知道這一段數據到底是有效數據還是填充數據,PKCS5模式會自動幫我們在最后一段數據后再添加16個字節的數據,而且填充的數據也是16個16,這樣解密端就能知道誰是有效數據誰是填充數據了。PKCS7最后一段數據的內容的內容是16個0,也是同樣的道理。解密端需要使用和加密端同樣的Padding模式,才能准確的十倍有效數據和填充數據。我們開發通常采用PKCS7模式。

  • 初始向量IV:初始向量IV的作用是使加密更加安全可靠,我們使用AES加密時需要主動提供初始向量,而且只需要提供一個初始向量就夠了,后面每段數據的加密向量都是前面一段的密文。初始向量IV的長度規定為128位16個字節,初始向量的來源為隨機生成。

  • 密鑰:AES要求密鑰的長度可以是128位16個字節,192位或256位,位數越高,加密強度自然越大,但是加密的效率自然會低一些,因此要做好衡量,我們開發通常采用128位16個字節的密鑰,我們使用AES加密時需要主動提供密鑰,而且只需要提供一個密鑰就夠了,每段數據加密使用的都是這一個密鑰,密鑰來源為隨機生成。

  • 五種加密模式:AES一共有五種加密模式,分別是ECB(電碼本模式),CBC(密碼分組鏈接模式),CTR(計算器模式),CFB(密碼反饋模式),OFB(輸出反饋模式)

    • ECB

      最基本的加密模式,即僅僅使用明文和密鑰來加密數據,相同的明文塊會被加密成相同的密文塊,這樣明文和密文的結構將是完全一樣的,就會更容易被破解,相對來說不是那么安全,因此很少使用。

    • CBC

      CBC模式比EBC模式對了一個初始向量IV,加密的時候,第一個明文塊首先會和IV做異或操作,然后在經過密鑰加密,然后第一個密文塊又會被作為第二個明文塊的加密向量來異或,依次類推下去,相同的明文塊經過加密后得到的密文塊是不同的,明文接口和密文結構也不同,因此更加安全。

    • CTR

      計算器模式不常見,在CTR模式中, 有一個自增的算子,這個算子用密鑰加密之后的輸出和明文異或的結果得到密文,相當於一次一密。這種加密方式簡單快速,安全可靠,而且可以並行加密,但是在計算器不能維持很長的情況下,密鑰只能使用一次。

    • CFBOFB

(2)AES加密流程(主要針對CBC模式)
> 1、首先`AES`加密會把明文按128位16個字節進行切分,如果數據的最后一段不夠16個字節,會用Padding來填充。
>
> 2、把明文塊0與初始向量IV做異或操作,再用密鑰加密,得到密文塊0,同時也會將密文塊0用作明文塊1的加密向量。
>
> 3、明文塊1與密文塊0進行異或操作,再用密鑰加密,得到密文塊1,以此類推。
>
> 4、最后把密文塊拼接起來得到最終的密文。
(3)、AES的加密原理

我們探討AES的加密原理,起始就是探討加密器里做了什么,加密器里做了四個重要的操作,分別是:密鑰擴展,初始輪,重復輪,最終輪。

  • 密鑰擴展:根據初始密鑰生成后面10輪密鑰的操作。

    AES內部一共會執行11輪加密,AES會通過一個簡單快速的混合操作,根據初始密鑰依次生成后面10輪的密鑰,每一輪的密鑰都是通過上一輪生成的,所以每一輪的密鑰都是不同的。

  • 初始輪:初始輪就是將128位的明文數據與128位的初始密鑰進行異或操作

  • 重復輪:所謂重復輪,就是指把字節混淆,行移位,列混亂,加輪密鑰這四個操作重復好幾輪。

    重復輪重復的論述取決於密鑰的長度,128位16位字節的密鑰重復輪推薦重復執行9次,192位密鑰重復輪推薦重復執行11次,256位密鑰重復輪推薦執行13次。

  • 最終輪:最終輪其實和重復輪的操作差不多,知識在最終輪我們丟棄了列混亂這個操作。

三、Python代碼實現(配合Base64)

import base64
import json

from Crypto.Cipher import AES


class Aes_cbc(object):
    def __init__(self, key):
        self.key = key.encode("utf-8")     # 密鑰
        self.vi = "0102030405060708".encode("utf-8")   # 偏移量
        self.mode = AES.MODE_CBC  # 加密模式

    def encryption(self, data):   # 加密
        pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)  # 對字符串進行補位
        data = pad(json.dumps(data)).encode("utf-8")
        cipher = AES.new(self.key, self.mode, self.vi)
        encryptedbytes = cipher.encrypt(data)
        # 使用Base64進行編碼,返回byte字符串
        encodestrs = base64.b64encode(encryptedbytes)
        # 對byte字符串按照utf-8進行解碼,並返回
        return encodestrs.decode("utf-8")

    def decrypt(self, data):   # 解密
        encodebytes = base64.decodebytes(data.encode("utf-8"))   # 將加密的數據轉換為bytes數據類型
        cipher = AES.new(self.key, self.mode, self.vi)
        text_decrypted = cipher.decrypt(encodebytes)
        unpad = lambda s: s[0:-s[-1]]
        return unpad(text_decrypted).decode("utf-8")



if __name__ == '__main__':
    a = Aes_cbc("0CoJUm6Qyw8W8jud")
    r_code ={
        "code": {
            "code": "0000",
            "msgId": "Success",
            "msg": "成功",
        },
        "bo": {
            "applyId": "REQX10000001423",
            "openStatus": "1"
        },
        "other": {
            "syncType": "2"
        }
    }
    print(a.encryption(r_code))
    print(json.loads(a.decrypt(a.encryption(r_code))))


免責聲明!

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



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