python实现openssl的EVP_BytesToKey及AES_256_CBC加解密算法

python实现openssl
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), NULL, pass, passlen, 1, key, iv);
并实现AES 256 CBC加解密.

# encoding:utf-8

import base64
from Crypto.Cipher import AES
from Crypto import Random
from hashlib import md5


def EVP_BytesToKey(password, salt, key_len, iv_len):
    """
    实现openssl
    EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), NULL, pass, passlen, 1, key, iv);
    """
    pass_salt = (password + salt).encode(encoding='utf-8') #传给hashlib.md5前要先转成bytes
    dtot = md5(pass_salt).digest() # 返回bytes,不要转成十六进制字符串
    d = [ dtot ]

    while len(dtot) != (key_len + iv_len):
        d.append(md5(d[-1] + pass_salt).digest()) # 在一维列表中,下标为-1表示该元素为列表的最后一项
        dtot += d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]


def encryt(string, key, iv):
    """
    加密文本
    :param string: 待加密文本
    :param key: 密钥
    :param iv: 偏移量/初始向量
    :return: 密文
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    x = AES.block_size - (len(string) % AES.block_size)
    # 长度不整除16时,需要进行补全, 比如少了3个,就填充3个3
    if x != 0:
        string = string + chr(x)*x
    msg = cipher.encrypt(string.encode('utf-8'))

    return msg


def decrypt(en_str, key, iv):
    """
    解密文本
    :param en_str: 待解密文本
    :param key: 密钥
    :param iv: 偏移量/初始向量
    :return: 解密后的文本
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    msg = cipher.decrypt(en_str)
    padding_len = msg[len(msg)-1]
    return msg[0:-padding_len]


if __name__ == '__main__':
    with open('res.json', 'r') as fp:
        content = fp.readlines() #list
        text_16str = ''.join(content) # list to str
        text_byte = bytes.fromhex(text_16str) #get bytes

        password = "%^%xxxxxx"
        key, iv = EVP_BytesToKey(password, '', 32, 16)
        
        #out = encryt('world', key, iv)
        print(out.hex())

        out = decrypt(text_byte, key, iv)
        print(out.decode('utf-8'))

作者:帅得不敢出门 csdn原创谢绝转载收录

相关推荐

  1. C++使用opensslEVP对文件进行AES-256-CBC解密

    2024-07-11 15:04:02       51 阅读
  2. 基于openssl实现AES ECB解密

    2024-07-11 15:04:02       23 阅读
  3. openssl3.2 - exp - aes-128-cbc

    2024-07-11 15:04:02       28 阅读
  4. 代码示例:OpenSSL AES CBC 加密

    2024-07-11 15:04:02       29 阅读
  5. Android集成OpenSSL实现解密-JNI实现

    2024-07-11 15:04:02       52 阅读
  6. 基于AES图像解密算法MATLAB仿真

    2024-07-11 15:04:02       45 阅读
  7. rust - 基于AES-CBC-128双重加密实现

    2024-07-11 15:04:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 15:04:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 15:04:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 15:04:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 15:04:02       69 阅读

热门阅读

  1. python批量读取Excel数据写入word

    2024-07-11 15:04:02       25 阅读
  2. 富格林:正确击破暗箱稳健出金

    2024-07-11 15:04:02       19 阅读
  3. 云原生监控-Kubernetes-Promethues-Grafana

    2024-07-11 15:04:02       15 阅读
  4. cmake

    2024-07-11 15:04:02       21 阅读
  5. leetcode300:最长递增子序列

    2024-07-11 15:04:02       21 阅读
  6. [Linux][Shell][Shell数学运算]详细讲解

    2024-07-11 15:04:02       21 阅读
  7. tessy 单元测试:小白入门指导手册

    2024-07-11 15:04:02       20 阅读
  8. C语言-概述,应用领域

    2024-07-11 15:04:02       18 阅读