摘要:首先安裝確認(rèn)安裝的是版本版本的是不一樣的文件頭部的聲明為我們可以生成一個(gè)隨機(jī)的密鑰注意要使用密碼學(xué)安全的隨機(jī)方法這里生成的是而不是為了可讀性采用加密內(nèi)容加密前需要到的整數(shù)倍長度才可有對應(yīng)方法初始向量為長度返回初始向量加密數(shù)據(jù)解密方法為
首先 安裝cryptography
sudo pip3 install cryptography
確認(rèn)安裝的是2.1.x版本 (1.x版本的api是不一樣的).
文件頭部的聲明為:
# coding: utf-8 import os from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import padding import base64 # 128bits block size aes_block_size = 16
我們可以生成一個(gè)隨機(jī)的密鑰:
def get_random_key_readable(key_size=256): """ get random key for symmetric encryption with key_size bits :param key_size: bit length of the key :return: bytes key """ # length for urandom ulen = int(key_size/8/4*3) key = base64.b64encode(os.urandom(ulen)) return key
注意要使用密碼學(xué)安全的隨機(jī)方法os.urandom.
這里生成的是str而不是bytes, 為了可讀性.
采用AES CBC 加密:
def aes_cbc_encrypt(message, key): """ use AES CBC to encrypt message, using key and init vector :param message: the message to encrypt :param key: the secret :return: bytes init_vector + encrypted_content """ iv_len = 16 assert type(message) in (str,bytes) assert type(key) in (str,bytes) if type(message) == str: message = bytes(message, "utf-8") if type(key) == str: key = bytes(key, "utf-8") backend = default_backend() iv = os.urandom(iv_len) cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend) encryptor = cipher.encryptor() padder = padding.PKCS7(128).padder() padded_data = padder.update(message) + padder.finalize() enc_content = encryptor.update(padded_data) + encryptor.finalize() return iv + enc_content
內(nèi)容加密前需要padding到128bit(16bytes)的整數(shù)倍長度才可. cryptography有對應(yīng)padding方法.
初始向量為16bit長度. 返回初始向量+加密數(shù)據(jù).
解密方法為:
def aes_cbc_decrypt(content, key): """ use AES CBC to decrypt message, using key :param content: the encrypted content using the above protocol :param key: the secret :return: decrypted bytes """ assert type(content) == bytes assert type(key) in (bytes, str) if type(key) == str: key = bytes(key, "utf-8") iv_len = 16 assert len(content) >= (iv_len + 16) iv = content[:iv_len] enc_content = content[iv_len:] backend = default_backend() cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend) unpadder = padding.PKCS7(128).unpadder() decryptor = cipher.decryptor() dec_content = decryptor.update(enc_content) + decryptor.finalize() real_content = unpadder.update(dec_content) + unpadder.finalize() return real_content
我們可以隨機(jī)生成一些message測試下加解密:
import random import unittest import time from app.libs.crypto_enc import * from app.libs.crypto_sign import * class TestAESEnc(unittest.TestCase): def test_aes_enc_dec(self): key = get_random_key_readable() print("start test_aes_enc_dec") total_len = 0 s = time.time() for i in range(100): mlen = random.randint(1, 1024*1024) total_len += mlen message = os.urandom(mlen) enc = aes_cbc_encrypt(message, key) dec = aes_cbc_decrypt(enc, key) self.assertEqual(message, dec, "aes message len {} is not equal".format(mlen)) e = time.time() print("total_len", total_len) print("total_time", e - s) print("speed", total_len / (e - s)) if __name__ == "__main__": unittest.main()
注意這里的速度測試是不準(zhǔn)的, 因?yàn)榘?b>urandom的時(shí)間, 而這個(gè)方法比較耗時(shí).
但是仍然可以看到, AES的加解密速度是極快的.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41298.html
摘要:前情需要使用和實(shí)現(xiàn)同一個(gè)加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個(gè)向量,可增加加密算法的強(qiáng)度此處使用做轉(zhuǎn)碼。解密先用解密再將代碼加密出來的密鑰放到中進(jìn)行解密大功告成,實(shí)現(xiàn)了在和的互轉(zhuǎn)。 前情 需要使用Python和Java實(shí)現(xiàn)同一個(gè)AES加解密算法,使Python版本加密的密文能夠由Java代碼解密,反之亦然。 Python實(shí)現(xiàn) Python為3.6版...
摘要:前情需要使用和實(shí)現(xiàn)同一個(gè)加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個(gè)向量,可增加加密算法的強(qiáng)度此處使用做轉(zhuǎn)碼。解密先用解密再將代碼加密出來的密鑰放到中進(jìn)行解密大功告成,實(shí)現(xiàn)了在和的互轉(zhuǎn)。 前情 需要使用Python和Java實(shí)現(xiàn)同一個(gè)AES加解密算法,使Python版本加密的密文能夠由Java代碼解密,反之亦然。 Python實(shí)現(xiàn) Python為3.6版...
摘要:序本文主要小結(jié)一下里頭的以及加解密。屬于塊加密,塊加密中有等幾種工作模式。與一樣在加密前需要對數(shù)據(jù)進(jìn)行填充,不是很適合對流數(shù)據(jù)進(jìn)行加密。 序 本文主要小結(jié)一下java里頭的AES以及RSA加解密。 AES showImg(https://segmentfault.com/img/remote/1460000011156406);使用AES加密時(shí)需要幾個(gè)參數(shù): 密鑰長度(Key Size...
摘要:以上為加解密在實(shí)際開發(fā)過程中代碼,代碼提交是對于和等符號進(jìn)行過濾,防止注入,在開發(fā)過程中可以參考此代碼進(jìn)行適當(dāng)修改進(jìn)行使用 web開發(fā)過程中對post請求過來的整個(gè)請求流數(shù)據(jù),怎樣保證post在傳輸過程中被截取后無法獲取到用戶提交請求實(shí)際數(shù)據(jù),保證請求安全,在實(shí)踐過程中我們采用過濾器(Filter)來實(shí)現(xiàn)流截取完成這個(gè)代碼post請求流數(shù)據(jù)及返回?cái)?shù)據(jù)加解密 一、請求數(shù)據(jù)流解密 1 請求...
摘要:以上為加解密在實(shí)際開發(fā)過程中代碼,代碼提交是對于和等符號進(jìn)行過濾,防止注入,在開發(fā)過程中可以參考此代碼進(jìn)行適當(dāng)修改進(jìn)行使用 web開發(fā)過程中對post請求過來的整個(gè)請求流數(shù)據(jù),怎樣保證post在傳輸過程中被截取后無法獲取到用戶提交請求實(shí)際數(shù)據(jù),保證請求安全,在實(shí)踐過程中我們采用過濾器(Filter)來實(shí)現(xiàn)流截取完成這個(gè)代碼post請求流數(shù)據(jù)及返回?cái)?shù)據(jù)加解密 一、請求數(shù)據(jù)流解密 1 請求...
閱讀 1566·2023-04-26 01:36
閱讀 2730·2021-10-08 10:05
閱讀 2784·2021-08-05 09:57
閱讀 1544·2019-08-30 15:52
閱讀 1200·2019-08-30 14:12
閱讀 1320·2019-08-30 11:17
閱讀 3110·2019-08-29 13:07
閱讀 2429·2019-08-29 12:35