LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

安全加解密引擎基础(SKE DES/3DES)

关键词: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介绍。

posted on 2022-04-19 21:06  ArnoldLu  阅读(629)  评论(0编辑  收藏  举报

导航