密码学之DES,3DES与Python实现AES

这篇具有很好参考价值的文章主要介绍了密码学之DES,3DES与Python实现AES。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

最近项目中需要用到DES,3DES解密算法,所以了解一下。正好CSDN上有关于DES,3DES的资料。边看边写一下总结。

二、参考资料

密码学之DES,3DES详解与Python实现

三、总结

1.定义

DES(Data Encryption Standard-数据加密标准)属于对称加密,即使用相同的密钥来完成加密和解密。分组长度为8个字节64bit(密钥每个字节的最后一位都没有采用,所以有效位只有56位)。

2.算法原理

2.1密钥编排

第一步:
密钥置换(64bit -> 56bit) ,将64位的密钥K通过置换表PC-1置换得到56位的密钥K0
第二步:
将K0分为左右两半各28位,C0和D0
第三步:
根据’左移’时间表移动C0和D0上的位,得到C1,…,C16,D1,…,D16
第四步:
16对Cn和Dn分别合并得到16个56位的密钥。将每个56位的密钥通过置换表PC-2的到16个48位的密钥Kn。
这就通过’原始密钥’,'PC-1’表,'左移’时间表,'PC-2’表完成了密钥拓展。

2.2明文运算

第一步:明文填充与工作模式
des明文分组模式为64比特,当明文长度不够分组大小时,需要指定某种标准进行填充。
第二步:IP盒置换(初始置换)
64bit明文块M与初始置换IP表进行初始置换的到新的64bit的IP
第三步:分为左右各32bit
置换后的IP分为32bit的左半部分L0和32bit的右半部分R0
第四步:16轮运算
使用函数f对两个块(32位的数据块和48位的密钥Kn)进行操作,以生成一个32位的块。+表示XOR加法。从L0和R0开始,迭代16次,得到L16和R16。

Ln = Rn-1
Rn = Ln-1 + F(Rn-1, Kn) # +是XOR运算

一轮运算中的F函数:
Rn-1(32bit)->E(Rn-1)(48bit)->E(Rn-1)+Kn(48bit)->S盒压缩置换(32bit)->P盒置换(32bit)=F(Rn-1, Kn)
在f(Rn-1, Kn)中,首先将Rn-1从32位扩展为48位,这是通过重复Rn-1的一些位的选择表来完成的,这个选择表称为函数E,即E(Rn-1)实现了32位的输入块和48的输出块。
于是f(Rn-1, Kn)=E(Rn-1)+Kn,这样就的到了48位,也就是8组6位。
然后进行S盒压缩置换:根据这8组6位来寻找S盒子中的地址,位于该地址的是一个4位的数字。于是8组6位转化称为了8组4位共32位。
接着进行P盒置换,将刚刚的32位置换为32位,这样F函数就实现了。

然后执行一次异或操作得到Rn。

第五步:逆初始置换(末置换)
将第四步得到的R16和L16合并(R16在左)得到64位,再利用FP(Final Permutation)表置换,得到64位的加密结果。

2.3用到的置换表

中间涉及的置换表有IP(明文置换第一步)、PC_1(密钥置换第一步)、PC_2(密钥置换第四步)、E(明文置换第四步中的F函数中的E函数)、S_BOX(明文置换第四步中的F函数中的S盒)、P(明文置换第四步中的F函数最后的P盒置换)、FP(明文置换第五步)、SHIFT(密钥置换第三步)

四、3DES及DES与AES的区别

1.3DES

3DES是三重DES的意思,它表示明文经过DES密钥1加密,经过DES密钥2解密,再通过DES密钥3加密得到密文的过程。
这个设计出于两个原因:

  • 引用:1.The second key is used to DES-decrypt the encrypted message. (Since the second key is not the right key, this decryption just scrambles the data further.)
    第二个密钥用于对加密的消息进行DES解密。 (由于第二个密钥不是正确的密钥,因此该解密只会进一步扰乱数据。)

  • 这个方案由IBM公司设计和提出,理由是这样的话,当三个密钥相同时,3重DES等于普通的DES,这样就可以实现向下的兼容,使用DES的,比如老旧的银行系统等等,兼容性对它们很重要,因此这个方案被采纳了

DES与AES的区别

参考资料:
加密标准中DES与AES到底是什么?两者有啥区别?

总的来说,AES是比DES更先进的加密算法。

五、项目需求及Python实现

1.需求

甲方提供了JS上的加密方式是基于Javascript的AES-192加密算法

const SECRET = "xxxxxxxxxxxx"; // 长为12个字节

function decrypt(encrypted) {
    const decipher = crypto.createDecipher("aes192", SECRET);
    let decrypted = decipher.update(encrypted, "hex", "utf8")
    decrypted += decipher.final("utf8");
    return decrypted;
}

然后后端实现了一个Java版本的AES-192加密算法,其中关键的一步是

keySizeBites = 24; // AES-192加密算法对应192位,即24字节
ivSize = cipher.getBlockSize(); // AES块的大小,固定为128位,即16字节
final byte[][] keyAndIV = EVP_BytesToKey(keySizeBites, ivSize, md5, salt: null, password.getBytes(), count:1);

现在要求用Python实现加密该算法。

2.分析

资料:python之js解密_如何在Python中解密来自JavaScript CryptoJS.AES.encrypt的密码中提到:在JS上,有两种加密密码的方法,它们分别是:

  • A. crypto.createCipher(algorithm, password)
  • B. crypto.createCipheriv(algorithm, key, iv)

而上面的代码块采用的是方法A(它支持通过EVP_BytesToKey函数从提供的密码派生密钥和IV向量),而方法B才相当于python中的AES.new()方法(pyCrypto只支持密钥向量类型加密),因此我们必须手动实现OpenSSL的EVP_BytesToKey函数。

3.Python实现

3.1导入Crypto模块

No module named “Crypto” 解决方案

参考:No module named “Crypto” 解决方案

某些脚本需要用到Crypto库,但当pip install Crypto后仍提示:
No module named ‘Crypto’,解决方案如下:

pip uninstall crypto pycryptodome
pip install pycryptodome

pycryptocrypto是同一个库,cryptopython 中又被称为pycrypto,它是一个第三方库,但是已经停止更新了,所以不建议大家安装。pycryptodomecrypto的延伸版本,用法和crypto是一模一样的,可以完全替代crypto

3.2Python实现EVP_BytesToKey函数

参考资料:在Python中实现OpenSSL AES加密给出了Python中的EVP_BytesToKey函数,它可以基于密码得到密钥和初始向量。

def EVP_BytesToKey(password, salt, key_len, iv_len):
    """
    Derive the key and the IV from the given password and salt.
    """
    from hashlib import md5
    dtot =  md5(password + salt).digest()
    d = [ dtot ]
    while len(dtot)<(iv_len+key_len):
        d.append( md5(d[-1] + password + salt).digest() )
        dtot += d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]

3.3Python实现AES/CBC/PKCS5Padding 加解密

参考资料:[Python] AES/CBC/PKCS5Padding 加解密给出了Python基于密钥和初始向量实现CBC模式,PKCS5Padding填充的AES-192算法(输出bytes编码为base64)。因为我们的需求是要求hex编码,所以更改后的代码为文章来源地址https://www.toymoban.com/news/detail-717743.html

from Crypto.Cipher import AES
import base64

def EVP_BytesToKey(password, salt, key_len, iv_len):
    """
    Derive the key and the IV from the given password and salt.
    """
    from hashlib import md5
    dtot =  md5(password + salt).digest()
    d = [ dtot ]
    while len(dtot)<(iv_len+key_len):
        d.append( md5(d[-1] + password + salt).digest() )
        dtot += d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]

def encrypt(text):
    """
    AES/CBC/PKCS5Padding 加密
    """
    BLOCK_SIZE = AES.block_size
    # 需要加密的文件,不足BLOCK_SIZE的补位(text可能是含中文,而中文字符utf-8编码占3个位置,gbk是2,所以需要以len(text.encode()),而不是len(text)计算补码)
    text = text + (BLOCK_SIZE - len(text.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(text.encode()) % BLOCK_SIZE)
    # 创建一个aes对象 key 秘钥 mdoe 定义模式 iv#偏移量--必须16字节
    cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
    # 利用AES对象进行加密
    encrypted_text = cipher.encrypt(text.encode())

    return base64.b16encode(encrypted_text).decode('utf-8').lower()

def decrypt(encrypted_text):
    """
    AES/CBC/PKCS5Padding 解密
    """
    # 需要解密的文件
    encrypted_text = base64.b16decode(encrypted_text.upper())
    # 创建一个aes对象 key 秘钥 mdoe 定义模式 iv#偏移量--必须16字节
    cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
    # 利用AES对象进行解密
    decrypted_text = cipher.decrypt(encrypted_text)
    # 去除补位
    dec_res = decrypted_text[:-ord(decrypted_text[len(decrypted_text) - 1:])]

    return dec_res.decode()

password = 'xxxxxxxxxxxxx'.encode()           # bytes类型的密码
key_len, iv_len = 24, 16 # AES-192
AESkey = EVP_BytesToKey(password, b'', key_len, iv_len) # 通过密码的到密钥和向量
key, iv = AESkey[0], AESkey[1]
print('密钥: %s\n向量: %s' % (key, iv))
text = 'abcdefghijklmnhi' # 明文
print('明文:', text)
jiami = encrypt(text)
print('密文:', jiami)
jiemi = decrypt(jiami)
print('解密:', jiemi)

到了这里,关于密码学之DES,3DES与Python实现AES的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DES的加密解密在ECB上的使用(C语言实现)——大三密码学实验

    目录 实验内容 实验原理 DES加密解密 ECB(电码本模式) 代码 DES函数的构建 RE_DES函数的构建 ECB函数的构建 RE_ECB的函数的构建 主函数的构建 总代码 测试结果 输入一个文本文件,通过ECB和DES进行加密,再将内容储存在新的文本文件中,再通过ECB和DES解密,将内容储存在新的文本

    2024年02月04日
    浏览(35)
  • 【密码学】DES 介绍

    DES:Data Encryption Standard(数据加密标准) DES 是一种 对称密钥 的 块加密 算法。 谓之 “对称密钥”,是因为加密、解密用的密钥是一样的。 谓之 “块加密”,是因为这种算法把明文划分为很多个等长的块(block),对每个块进行加密,最后以某种手段拼在一起。“块加密” 亦

    2024年02月02日
    浏览(32)
  • [密码学]DES

    先声明两个基本概念 代换 或  替换(substitution),用别的元素代替当前元素。des的s-box遵循这一设计。 abc--def 置换(permutation),只改变元素的排列顺序。des的p-box遵循这一设计。 abc--bac **本文并未介绍初始置换(Initial Permutation)和初始置换的逆置换。这两个置换并不提供任

    2024年02月04日
    浏览(30)
  • 密码学之对称加密体系(2):AES、SM4的 S 盒具体算法的实现

    🔥点击进入【硬件安全】社区,查看更多精彩内容🔥 🔥点击查看《硬件安全》系列文章🔥 📢  声明 : 🥭 作者主页:【摆渡沧桑的CSDN主页】。 ⚠️ 未经作者允许,禁止转载。 ⚠️ 本文为非盈利性质,目的为个人学习记录及知识分享。因能力受限,存在知识点分析不

    2024年02月16日
    浏览(30)
  • 《现代密码学》学习笔记——第三章 分组密码 [二] AES

    版本 密钥长度 分组长度 迭代轮数 AES-128 4 4 10 AES-192 6 4 12 AES-256 8 4 14 (1)字节代换(SubByte) (2)行移位(ShiftRow) (3)列混合(MixColumn) (4)密钥加(AddRoundKey) 1.字节代换   字节代换是非线性变换,独立地对状态的每个字节进行。代换表(S-Box)是可逆的。   将

    2024年02月05日
    浏览(76)
  • 现代密码学第二次实验:分组加密算法DES及其工作模式

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正! 1、掌握DES算法的工作原理。 2、熟悉分组加密算法的4种工作模式(OFB模式可不做)。 3、了解DES的雪

    2024年02月06日
    浏览(43)
  • 【密码学】python密码学库pycryptodome

    记录了一本几乎是10年前的书(python绝技–用python成为顶级黑客)中过时的内容 里面提到了python标准库中自带的crypt库,经验证Python 3.12.1中并没有这个自带的库,密码学相关的库目前(2024.1.12)是一个自包含库pycryptodome,导入的是 import Crypto pypi库的页面 可以在文档中查看详

    2024年01月17日
    浏览(49)
  • python进件 — 密码学

    1、密码学介绍 密码学是研究和应用如何保护信息的一门学科。它涉及使用加密技术来确保数据的保密性、完整性和可用性。密码学的目标是设计和分析安全的算法和协议,以保护通信、存储和计算过程中的敏感数据。 密码学可以分为两个主要领域:对称密码和非对称密码。

    2024年02月11日
    浏览(24)
  • 【北京航空航天大学】【信息网络安全实验】【实验一、密码学:DES+RSA+MD5编程实验】

    1. 通过对DES算法的代码编写,了解分组密码算法的设计思想和分组密码算法工作模式; 2. 掌握RSA算法的基本原理以及素数判定中的Rabin-Miller测试原理、Montgomery快速模乘(模幂)算法,了解公钥加密体制的优缺点及其常见应用方式; 3. 掌握MD5算法的基本原理,了解其主要应用

    2024年02月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包