首页 > 编程语言 >openssl enc内部算法实现原理

openssl enc内部算法实现原理

时间:2024-10-29 22:57:48浏览次数:1  
标签:enc passwd openssl iv 算法 key sha256 salt md5

我们都知道使用命令openssl时可以使用-enc指定算法,那么具体它的实现原理是什么呢?我们通过实验来一探究竟
我们新建一个my.txt里面的内容为12345678

openssl enc -aes-128-cbc -in my.txt -out my.enc -k "mypasswd"

结果会生成my.enc文件,我们用xxd命令可以看到

那么这个文件是如何通过这个mypasswd变成这样一个.enc文件呢?

key与IV

首先我们知道aes的cbc模式需要两个关键参数key和iv向量,那么上面过程中是怎么通过mypasswd生成这两个的呢,具体原理是什么呢?
首先我们可以通过-p参数打印

,然后我们再通过xxd查看my.enc

发现盐值是不是刚好就是前8到16位的值
那么key和iv是怎么算出来的呢

哈希算法

在通过salt和passwd生成key和iv的时候,会涉及到一个很重要的hash算法,这个算法是由配置指定的,不同的版本默认的算法是不一样的,也可以修改,或者可以通过-md去指定它。

aes-128-cbc

sha256

当我们使用-md sha256时(如果不选,默认就是sha256,可以通过查配置/etc/ssl/openssl.cnf可得)
通过查资料可以知道

key = sha256(passwd+salt)[:16]
iv = sha256(passwd+salt)[16:]

代码:

from Crypto.Cipher import AES  
from Crypto.Hash import SHA256  
from Crypto.Util.Padding import pad  
import binascii  
  
from Crypto.Util.number import long_to_bytes  
  
  
def generate_key_and_iv():  
  
    passwd = b'mypasswd'  
    salt = "216BD549FB2C5270"  
    salt_b = long_to_bytes(int(salt, 16))  
    # 生成 256 位 (32 字节) 的密钥和 128 位 (16 字节) 的 IV    digest = SHA256.new(passwd + salt_b).digest()  
    key = digest[:16]  
    iv = digest[16:32]  
    return key, iv  
  
  
def encrypt(plaintext, key, iv):  
    cipher = AES.new(key, AES.MODE_CBC, iv)  
    ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size))  
    return binascii.hexlify(ciphertext).decode('utf-8'), binascii.hexlify(iv).decode('utf-8')  
  
  
if __name__ == "__main__":  
    # 生成密钥和 IV    key, iv = generate_key_and_iv()  
  
    # 明文  
    plaintext = "12345678"  
  
    # 加密  
    ciphertext_hex, iv_hex = encrypt(plaintext, key, iv)  
    print(f"key: {key.hex()}")  
    print(f"iv: {iv.hex()}")  
    print(f"Ciphertext: {ciphertext_hex}")

是不是刚好能对上呢

md5

当我们使用-md md5
由于md5位数更短,结果不一样

md5_one = md5(passwd+salt)
md5_two = md5(md5_one+passwd+salt)
key = md5_one
iv = md5_two

也是对上了

aes-256-cbc

sha256

规则

sha256_one = sha256(passwd+salt)
sha256_two = sha256(sha256_one+passwd+salt)
key = sha256_one
iv = sha256_two[:16]
md5

规则

md5_one = md5(passwd+salt)
md5_two = md5(md5_one+passwd+salt)
md5_three = md5(md5_two+passwd+salt)
key = md5_one+md5_two
iv = md5_three

参考:https://www.cnblogs.com/findumars/p/12627336.html

标签:enc,passwd,openssl,iv,算法,key,sha256,salt,md5
From: https://www.cnblogs.com/ceniryone/p/18514710

相关文章

  • E. Best Subsequence
    “最大权值闭合图,即给定一张有向图,每个点都有一个权值(可以为正或负或0),你需要选择一个权值和最大的子图,使得子图中每个点的后继都在子图中。”这样的定义可以让你理解算法执行的逻辑,却难以在你赛场上遇到它时牵动你的思绪更符合你做题时真切感受的描述应该是:给你一些点,消耗一些......
  • 第六届国际科技创新学术交流大会(IAECST 2024) 暨第四届物流系统与交通运输国际学术会
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍第六届国际科技创新学术交流大会暨第四届物流系统与交通运输国际学术会议(LSTT202......
  • SPS-SCIENCE PROGRESS
    @目录一、征稿简介二、重要信息三、服务简述四、投稿须知一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述SCIENCEPROGRESS在过去100多年来,一直是科学、技术和医学领域备受推崇的评论刊物。期刊目的是激发读者对他们可能不完全熟悉的领域产生兴趣,并......
  • 第二届计算机网络技术与电子信息工程国际学术会议(CNTEIE 2024) 2024 2nd Internationa
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍第二届计算机网络技术与电子信息工程国际学术会议(CNTEIE2024)将于2024年12月6-8日......
  • 手写fft算法,和内置fft算法对比
    好的,下面我将提供一个完整的Python示例,包括手写FFT算法(快速傅里叶变换)和使用NumPy的内置FFT算法,然后对比两者的结果并绘制图形。1.手写FFT算法我们将实现一个简单的FFT算法,即Cooley-Tukey算法,这是一种最常用的FFT算法。2.NumPy内置FFT算法NumPy库提供了一个非常高效的FFT实......
  • Offer68题 Day2 树的基础算法
    1.前中后序递归遍历//前序遍历classSolution{public:voidtraversal(TreeNode*cur,vector<int>&vec){if(cur==NULL)return;vec.push_back(cur->val);//中traversal(cur->left,vec);//左traversal(cur-&g......
  • 朱刘算法
    1问题我们知道带权无向图上有一个经典问题:最小生成树。那么如果换成带权有向图呢?对于一个带权有向图,从中选出一个子图,使得该子图中无环,且存在一个点可以到达其他所有点,则这个子图就是一个树形图。而求出所有树形图中选出边权和最小的一种选法,就是最小树形图问题。容易想到,解决......
  • Python从0到100(六十八):Python OpenCV-图像边缘检测及图像融合
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • Offer68题 Day3 两个基础算法
    1.DFS深度优先算法/* -深度优先算法 DFS从起始节点出发,沿着一条路径尽可能深入地访问每个节点,直到无法继续时再回退,寻找未访问的节点。 -使用递归实现。*/#include<iostream>#include<vector>usingnamespacestd;voidDFS(intnode,vector<vector<int>>&gra......
  • 代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.
    学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html重叠区域问题最远位置问题452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)点击查看代码classSolution(ob......