成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python(3.x) 實(shí)現(xiàn)AES 加解密

harryhappy / 757人閱讀

摘要:首先安裝確認(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

相關(guān)文章

  • 最新版-Python和Java實(shí)現(xiàn)Aes相互解密

    摘要:前情需要使用和實(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版...

    fox_soyoung 評論0 收藏0
  • 最新版-Python和Java實(shí)現(xiàn)Aes相互解密

    摘要:前情需要使用和實(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版...

    孫淑建 評論0 收藏0
  • java解密實(shí)例

    摘要:序本文主要小結(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...

    mengera88 評論0 收藏0
  • web開發(fā)安全之請求及返回流數(shù)據(jù)解密實(shí)踐

    摘要:以上為加解密在實(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 請求...

    Taonce 評論0 收藏0
  • web開發(fā)安全之請求及返回流數(shù)據(jù)解密實(shí)踐

    摘要:以上為加解密在實(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 請求...

    Shonim 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<