使用python進行AES對稱加密解密

2021-10-05 22:52:00 字數 4503 閱讀 1228

使用示例

可能問題

有時需要對資料進行對稱加解密,常用的有:

區塊加密演算法採用對稱金鑰,可以加密固定長度的較短(區塊數量)的資料。為了處理任意長度的資料,加密演算法必須指定加密模式。常用的加密模式如下:

經典的加密模式,比如cbc mode只能保證機密性,但不能保證完整性。

基於這個原因,經典模式經常會和mac演算法(比如crypto.hash.hmac)搭配使用,但是這種結合不夠直觀,有效和安全。

因此,有一些新的同時具有加密和驗證完整性的模式設計出來:

鑑於pycrypto已不再安全,建議使用pycryptodome。pycyrptodome 是pycrypto的分支,在安全性方面有較大提公升。

pip install pycryptodome
# -*- coding:utf-8  -*-

import json

from base64 import b64encode,b64decode

from crypto.cipher import aes

from crypto.util.padding import pad,unpad

from crypto.random import get_random_bytes

class

aesclassiccipher

:def

__init__

(self, key)

: self.bs = aes.block_size

self.key = key

self.mode = aes.mode_cbc

defencrypt

(self, data)

: cipher = aes.new(self.key, self.mode)

ct_bytes = cipher.encrypt(pad(data, self.bs)

) iv = b64encode(cipher.iv)

.decode(

'utf-8'

) ct = b64encode(ct_bytes)

.decode(

'utf-8'

)return json.dumps(

)def

decrypt

(self, json_input)

:try

: b64 = json.loads(json_input)

iv = b64decode(b64[

'iv'])

ct = b64decode(b64[

'ciphertext'])

cipher = aes.new(self.key, self.mode, iv)

plaintext = unpad(cipher.decrypt(ct)

, self.bs)

return plaintext.decode(

'utf-8'

)except

(valueerror, keyerror)

as err:

print

("incorrect decryption "

, err)

return

none

if __name__ ==

"__main__"

: data =

"你的cbc密文"

.encode(

'utf-8'

) key = get_random_bytes(16)

aes_cipher = aesclassiccipher(key)

encrypt_reuslt = aes_cipher.encrypt(data)

print

("encryption was: "

, encrypt_reuslt)

plaintext = aes_cipher.decrypt(encrypt_reuslt)

print

("the message was: "

, plaintext)

輸出結果為

encryption was:  

the message was: 你的cbc密文

# -*- coding:utf-8 -*-

import json

from base64 import b64encode, b64decode

from crypto.cipher import aes

from crypto.random import get_random_bytes

class

aesmoderncipher

:def

__init__

(self, key)

: self.bs = aes.block_size

self.key = key

self.mode = aes.mode_ocb

self.json_k =

['nonce'

,'header'

,'ciphertext'

,'tag'

]def

encrypt

(self, header, data)

: header = header

cipher = aes.new(self.key, self.mode)

cipher.update(header)

ciphertext, tag = cipher.encrypt_and_digest(data)

json_v =

[ b64encode(x)

.decode(

'utf-8'

)for x in

[cipher.nonce, header, ciphertext, tag]

]return json.dumps(

dict

(zip

(self.json_k, json_v)))

defdecrypt

(self, json_input)

:try

: b64 = json.loads(json_input)

jv =

cipher = aes.new(self.key, self.mode, nonce=jv[

'nonce'])

cipher.update(jv[

'header'])

plaintext = cipher.decrypt_and_verify(jv[

'ciphertext'

], jv[

'tag'])

return plaintext.decode(

'utf-8'

)except

(valueerror, keyerror)

as err:

print

("incorrect decryption "

, err)

return

none

if __name__ ==

"__main__"

: data =

"你的ocb密文"

.encode(

'utf-8'

) key = get_random_bytes(16)

header = b'header'

aes_cipher = aesmoderncipher(key)

encrypt_reuslt = aes_cipher.encrypt(header, data)

print

("encryption was: "

, encrypt_reuslt)

plaintext = aes_cipher.decrypt(encrypt_reuslt)

print

("the message was: "

, plaintext)

輸出結果為:

encryption was:  

the message was: 你的ocb密文

from crypto.cipher import aes
執行上面語句會報錯:

from crypto.cipher import aes

modulenotfounderror: no module named 『crypto』

可能原因是安裝有crypto, pycrypto, pycryptodome中的多個庫。

解決辦法:先將其全部解除安裝,然後再重新安裝 pycryptodome.

pip uninstall crypto pycrypto pycryptodome

pip install pycryptodome

正確使用AES對稱加密

經常我看到專案中有人使用了對稱加密演算法,用來加密客戶或專案傳輸中的部分資料。但我注意到開發 人員由於不熟悉原理,或者簡單複製網上的 示例,有導致 存在安全風險。我經常遇到的問題,有如下 演算法位長 建議rc4 40des 563des 112aes 128 tl dr rc4 des 3des都不...

使用python進行加密解密AES演算法

使用python進行加密解密aes演算法 分享 python開發者社群 pythoner.org ty 發布於 2011 09 26 21 36 53,分類 python語言基礎,0評 5639閱 在此我們將使用到pycrypto模組,可以訪問 來獲得此模組。該模組包括多種加密演算法,如aes md...

理解AES對稱加密

很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。相比於其他加密,aes加密似乎模式很多,包括ecb cbc等等等等,每個模式又包括iv引數和padding引數,並且,不...