使用示例
可能問題
有時需要對資料進行對稱加解密,常用的有:
區塊加密演算法採用對稱金鑰,可以加密固定長度的較短(區塊數量)的資料。為了處理任意長度的資料,加密演算法必須指定加密模式。常用的加密模式如下:
經典的加密模式,比如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可能原因是安裝有crypto, pycrypto, pycryptodome中的多個庫。modulenotfounderror: no module named 『crypto』
解決辦法:先將其全部解除安裝,然後再重新安裝 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引數,並且,不...