关键词:DES、3DES、ECB、CBC、CFB、OFB、CTR等等。

1 基本概念

DES介绍

DES是对称性加密里常见的一种,是一种使用秘钥加密的块算法。秘钥长度是64位(bit), 超过位数秘钥被忽略。所谓对称性加密,加密和解密秘钥相同。对称性加密一般会按照固定长度,把待加密字符串分成块。不足一整块或者刚好最后有特殊填充字符。

常见的填充模式有:'pkcs5'、'pkcs7'、'iso10126'、'ansix923'、'zero' 类型,包括DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

DES基本原则

DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。

DES算法原理

DES算法的入口参数:Key、Data、Mode。

Key为8个字节共64位,是DES算法的工作秘钥;

Data也为8个字节64位,是要被加密或解密的数据;

Mode为DES的工作方式,有两种:加密或解密。

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:

(1)初始置换
其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。

(2)逆置换

经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

3DES介绍

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。
由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
3DES秘钥有128位、192位两种。

DES和3DES对比

3DES(即Triple DES)是DES向AES过渡的加密算法,是DES的一个更安全的变形。3DES以DES为基本模块,通过组合分组方法设计出分组加密算法。
该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))
 
更多参考:
《DES》-DES简单介绍,包括DES参数、DES基本原则、算法算法步骤、DES和3DES区别。
《des算法》-介绍DES算法基本原理、算法特点、DES特点、算法流程等。
《3DES》-介绍算法、加密过程。
《DES和AES密码之间的区别 & 对称加密算法DES、3DES和AES 原理总结》-DES和AES之间区别、DES不同分组模式对比

2 OpenSSL关于DES/3DES用法

OpenSSL通过openssl enc进行加密解密,

openssl enc -des-cbc -e -k 1234567812345678 -iv 1234567812345678 -pbkdf2 -in infile -out cipherfile
openssl enc -des-cbc -d -k 1234567812345678 -iv 1234567812345678 -pbkdf2 -in cipherfile -out replain

其中-des-cbc是算法和模式组合,-e表示Encrypt,-d表示Decrypt。

DES/3DES支持的算法和模式组合包括: 

des-cbc DES in CBC mode
des Alias for des-cbc
des-cfb DES in CFB mode
des-ofb DES in OFB mode
des-ecb DES in ECB mode

des-ede-cbc Two key triple DES EDE in CBC mode
des-ede Two key triple DES EDE in ECB mode
des-ede-cfb Two key triple DES EDE in CFB mode
des-ede-ofb Two key triple DES EDE in OFB mode

des-ede3-cbc Three key triple DES EDE in CBC mode
des-ede3 Three key triple DES EDE in ECB mode
des3 Alias for des-ede3-cbc
des-ede3-cfb Three key triple DES EDE CFB mode
des-ede3-ofb Three key triple DES EDE in OFB mode

更多参考:

《OpenSSL之3DES用法》

3 PyCryptodome关于DES/3DES用法

DES的密文或明文需要满足63bit,即8Byte对齐。

DES的秘钥固定为64bit。

from Crypto.Cipher import DES
from Crypto import Random

def des_encrypt_decrypt(mode):
    key = b"Eightkey"
    des_encrypt = DES.new(key, mode)
    plaintext = "Some data to be encrypted with 3DES.PPPP"
    ciphertext = des_encrypt.encrypt(plaintext.encode())
    des_decrypt = DES.new(key, mode)
    replaintext = des_decrypt.decrypt(ciphertext)

    print("Plain text:",plaintext.encode('utf-8').hex())
    print("Cipher text:", ciphertext.hex())
    print("Replain text:", replaintext.hex())

def des_encrypt_decrypt_iv(mode, iv):
    key = b"Eightkey"
    des_encrypt = DES.new(key, mode, iv)
    plaintext = "Some data to be encrypted with 3DES.PPPP"
    ciphertext = des_encrypt.encrypt(plaintext.encode('utf-8'))
    des_decrypt = DES.new(key, mode, iv)
    replaintext = des_decrypt.decrypt(ciphertext)

    print("Plain text:",plaintext.encode('utf-8').hex())
    print("Cipher text:", ciphertext.hex())
    print("Replain text:", replaintext.hex())

if __name__ == '__main__':
    iv = Random.new().read(DES.block_size)
    nonce = Random.new().read(8)
    des_encrypt_decrypt(DES.MODE_ECB)
    des_encrypt_decrypt_iv(DES.MODE_CBC, iv)
    des_encrypt_decrypt_iv(DES.MODE_CFB, iv)
    des_encrypt_decrypt_iv(DES.MODE_OFB, iv)

DES3的密文或明文输入需要满足64bit,即8Byte对齐。

秘钥输入需满足128bit或192bit,即16Byte或24Byte。

from Crypto.Cipher import DES3
from Crypto import Random

def des3_encrypt_decrypt(mode):
    key = "Sixteen byte key"
    des3_encrypt = DES3.new(key, mode)
    plaintext = "Some data to be encrypted with 3DES.PPPP"
    ciphertext = des3_encrypt.encrypt(plaintext.encode('utf-8'))
    des3_decrypt = DES3.new(key, mode)
    replaintext = des3_decrypt.decrypt(ciphertext)

    print("Plain text:",plaintext.encode('utf-8').hex())
    print("Cipher text:", ciphertext.hex())
    print("Replain text:", replaintext.hex())

def des3_encrypt_decrypt_iv(mode, iv):
    key = "Sixteen byte key"
    des3_encrypt = DES3.new(key, mode, iv)
    plaintext = "Some data to be encrypted with 3DES.PPPP"
    ciphertext = des3_encrypt.encrypt(plaintext.encode('utf-8'))
    des3_decrypt = DES3.new(key, mode, iv)
    replaintext = des3_decrypt.decrypt(ciphertext)

    print("Plain text:",plaintext.encode('utf-8').hex())
    print("Cipher text:", ciphertext.hex())
    print("Replain text:", replaintext.hex())

if __name__ == '__main__':
    iv = Random.new().read(DES3.block_size)

    des3_encrypt_decrypt(DES3.MODE_ECB)
    des3_encrypt_decrypt_iv(DES3.MODE_CBC, iv)
    des3_encrypt_decrypt_iv(DES3.MODE_CFB, iv)
    des3_encrypt_decrypt_iv(DES3.MODE_OFB, iv)

更多参考:

《Single DES — PyCryptodome 3.14.1 documentation》-PyCryptodome关于DES介绍。

《Triple DES — PyCryptodome 3.14.1 documentation》-PyCryptodome关于3DES介绍。

转载请注明出处:http://www.hrtxgs.com/article/20230505/512947.html

随机推荐

  1. 安全狗下加用户的又一方法

    上次发了安全狗下加用户的另一方法,据说不够风骚所以这次要淫荡一点 方法同样很简单,不过不知道有没有人发过。。PS: 转载请不要注明作者 001 测试环境: 安全狗的进程: .安全狗的服务 .开启远程桌面守护 .远程登录测试: .安全狗拦截...

  2. 安全清除你:C盘垃圾,让你多出近2G的空间!正文分析错误

    $False$

  3. 安全检测Unix和Linux服务器安全设置入门精讲

    其实每一个黑客都有自己独到的方法。笔者对于入侵网站服务器的资料收集了很多,但是因为实际情况的不同,往往造成许多方法的失效;由此可见,每一个网站的情况都不同,需要入侵者区分对待。假设深圳的线路比北京的线路要好的多,从而给了词典穷举很大的方便...

  4. 安全校验Session验证码并避免绕开验证码攻击

    已经记不得是在哪个网站上看到的了,一般情况下对于验证码的校验,大家很容易写成下面这样: 复制代码 代码如下: % If Request.Form("SecurityCode") = Session("SecurityCode") Then...

  5. 安全虚拟主机配置技巧

    注入漏洞、上传漏洞、弱口令漏洞等问题随处可见。跨站攻击,远程控制等等是再老套不过了的话题。有些虚拟主机管理员不知是为了方便还是不熟悉配置,干脆就将所有的网站都放在同一个目录中,然后将上级目录设置为站点根目录。有些呢,则将所有的站点的目录都...

  6. 安全基础知识IP的不安全性

    被窃盗的信用卡号、遭受攻击的计算机系统以及其他一些著名的在线攻击已经引起了许多用户的警惕,使安全管理人员将注意力放在了高级入侵检测系统、防火墙和其他高水平防御上。...

  7. 安全警钟让路由器成为你防范的堡垒

    在典型的校园网环境中,路由器一般处于防火墙的外部,负责与Internet的连接。这种拓扑结构实际上是将路由器暴露在校园网安全防线之外,如果路由器本身又未采取适当的...

  8. 安全的FTP服务器 vsftpd简介

    vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。比如: 非常高的安全性需求 带宽限...

  9. 安全技术—RSA公钥密码体制安全性分析

    引言 RSA密码系统是较早提出的一种公开钥密码系统。1978年,美国麻省理工学院(MIT)的Rivest,Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出了基于数论的非对称(公开钥)密码体制,称为RSA...

  10. 安全狗下添加用户的另一方法(大量操作实现突破)

    前几天发现的,略无语,因为简单到。。 直接在命令行下使用 for /l %i in (1,1,1000) do @net user test test /add@net localgroup administrators test /ad...