• 安全加解密引擎基础(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介绍。

  • 相关阅读:
    同台电脑 多Git账号同时使用
    netty对http协议解析原理解析(转载)
    Netty 线程模型与Reactor 模式
    增量/存量数据按时间维度分组
    网易技术分享:Nginx缓存引发的跨域惨案
    全面剖析Redis Cluster原理和应用
    聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
    美团点评基于 Flink 的实时数仓建设实践
    美团技术分享:大众点评App的短视频耗电量优化实战
    美团技术分享:美团深度学习系统的工程实践
  • 原文地址:https://www.cnblogs.com/arnoldlu/p/16167297.html
Copyright © 2020-2023  润新知