2023年7月31日发(作者:)
golang实现三重DES加密解密DESDES(Data Encryption)是1977年美国联邦信息处理标准(FIPS)中所采⽤的⼀种对称密码(FIPS46-3),⼀直以来被美国及其他国家的政府和银⾏等⼴泛使⽤。随着计算机的进步,DES已经能够被暴⼒破解,1997年的DES Challenge I 中⽤了96天破译密钥,1998年的DES Challenge II-1中⽤了41天,1998年的DES Challenge II-2中⽤了56⼩时,1999年的DES Challenge III 中只⽤了22⼩时15分钟。DES是⼀种将64⽐特的明⽂加密成64⽐特的密⽂的对称密码算法,它的密钥的长度是56⽐特。尽管从规格上来说,DES的密钥长度是64⽐特,但由于每隔7⽐特会设置⼀个⽤于错误检查的⽐特,因此实质上其密钥长度是56⽐特。DES 是以64⽐特的明⽂(⽐特序列)为⼀个单位来进⾏加密的,这个64⽐特的单位称为分组 ,⼀般来说,以分组为单位进⾏处理的密码算法称为分组密码,DES就是分组密码的⼀种。DES每次只能加密64⽐特的数据,如果要加密的明⽂⽐较长,就需要对DES加密进⾏迭代(反复),⽽迭代的具体⽅式就称为模式。DES 内部实现理论:在 des 中各个步骤称为轮,整个加密过程进⾏16轮循环。单轮加密⼦密钥:中间的“⼦密钥”指的是本轮加密所使⽤的的密钥,在Feistel⽹络中,每⼀轮都需要使⽤⼀个不同的⼦密钥。由于密钥只在⼀轮中使⽤,它只是⼀个局部的密钥,因此才称为⼦密钥(subkey)。轮函数:根据“右侧”和⼦密钥⽣成对“左侧”进⾏加密的⽐特序列,它是密码系统核⼼。将轮函数的输出与“左侧”进⾏XOR运算,其结果就是“加密后的左侧”。也就是说,我们⽤XOR将轮函数的输出与“左侧”进⾏合并。⽽输⼊的“右侧”则会直接成为输出的“右侧”。两轮加密连续两轮加密的密钥如果相同,相当于加密之后⼜进⾏解密。三轮加密三轮解密部分实际上没有进⾏任何处理,在加密算法中看起来是⼀种浪费,却保证了可解密性,因为完全没有进⾏任何处理的右半部分是解密过程所必须的信息。由于加密和解密可以⽤完全相同的结构来实现,因此⽤于实现 DES 算法的硬件设备的设计也变得更容易了。三重DES三重DES(triple-des)是为了增加DES的强度,将DES重复3次所得到的⼀种密码算法,也称为TDEA(Triple Date Encryption Algorithm),通常缩写为3DES。明⽂经过三次DES处理才能变成最后的密⽂,由于DES密钥的长度实质上是56⽐特,因此三重DES的密钥长度就是56×3=168⽐特。从图中我们可以发现,三重DES并不是进⾏三次DES加密(加密→加密→加密),⽽是加密→解密→加密的过程。在加密算法中加⼊解密操作让⼈感觉很不可思议,实际上这个⽅法是IBM公司设计出来的,⽬的是为了让三重DES能够兼容普通的DES。当三重DES中所有的密钥都相同时,三重DES也就等同于普通的DES了。这是因为在前两步加密→解密之后,得到的就是最初的明⽂。因此,以前⽤DES加密的密⽂,就可以通过这种⽅式⽤三重DES来进⾏解密。也就是说,三重DES对DES具备向下兼容性。在DES的部分我们已经提到过,DES的加密和解密过程只是改变了⼦密钥的顺序,⽽实际进⾏的处理是相同的。如果所有密钥都使⽤相同的⽐特序列,则其结果与普通的DES是等价的。如果密钥1和密钥3使⽤相同的密钥,⽽密钥2使⽤不同的密钥(也就是只使⽤两个DES密钥),这种三重DES就称为DES-EDE2。EDE表⽰的是加密(Encryption)→解密(Decryption)→加密(Encryption)这个流程。密钥1、密钥2、密钥3全部使⽤不同的⽐特序列的三重DES称为des-ede3。go 实现三重DES加密解密在这⾥,我们⽤了⼀个 go 的加解密包,做了以下封装:package mainimport ( "encoding/base64" "/wumansgy/goEncrypt")// 密钥 24字节const secretKey = "hjdo843k920s6um4kk8sk3s8"// 三重DES加密func TripleDesEncrypt(encryptedString string) (string, error) { cryptText, err := DesEncrypt([]byte(encryptedString), []byte(secretKey)) if err != nil { return "", err } return ToString(cryptText), nil}// 三重DES解密func TripleDesDecrypt(decryptString string) (string, error) { decryptBytes, err := String(decryptString) if err != nil { return "", err } cryptText, err := DesDecrypt(decryptBytes, []byte(secretKey)) if err != nil { return "", err } return string(cryptText), nil}
2023年7月31日发(作者:)
golang实现三重DES加密解密DESDES(Data Encryption)是1977年美国联邦信息处理标准(FIPS)中所采⽤的⼀种对称密码(FIPS46-3),⼀直以来被美国及其他国家的政府和银⾏等⼴泛使⽤。随着计算机的进步,DES已经能够被暴⼒破解,1997年的DES Challenge I 中⽤了96天破译密钥,1998年的DES Challenge II-1中⽤了41天,1998年的DES Challenge II-2中⽤了56⼩时,1999年的DES Challenge III 中只⽤了22⼩时15分钟。DES是⼀种将64⽐特的明⽂加密成64⽐特的密⽂的对称密码算法,它的密钥的长度是56⽐特。尽管从规格上来说,DES的密钥长度是64⽐特,但由于每隔7⽐特会设置⼀个⽤于错误检查的⽐特,因此实质上其密钥长度是56⽐特。DES 是以64⽐特的明⽂(⽐特序列)为⼀个单位来进⾏加密的,这个64⽐特的单位称为分组 ,⼀般来说,以分组为单位进⾏处理的密码算法称为分组密码,DES就是分组密码的⼀种。DES每次只能加密64⽐特的数据,如果要加密的明⽂⽐较长,就需要对DES加密进⾏迭代(反复),⽽迭代的具体⽅式就称为模式。DES 内部实现理论:在 des 中各个步骤称为轮,整个加密过程进⾏16轮循环。单轮加密⼦密钥:中间的“⼦密钥”指的是本轮加密所使⽤的的密钥,在Feistel⽹络中,每⼀轮都需要使⽤⼀个不同的⼦密钥。由于密钥只在⼀轮中使⽤,它只是⼀个局部的密钥,因此才称为⼦密钥(subkey)。轮函数:根据“右侧”和⼦密钥⽣成对“左侧”进⾏加密的⽐特序列,它是密码系统核⼼。将轮函数的输出与“左侧”进⾏XOR运算,其结果就是“加密后的左侧”。也就是说,我们⽤XOR将轮函数的输出与“左侧”进⾏合并。⽽输⼊的“右侧”则会直接成为输出的“右侧”。两轮加密连续两轮加密的密钥如果相同,相当于加密之后⼜进⾏解密。三轮加密三轮解密部分实际上没有进⾏任何处理,在加密算法中看起来是⼀种浪费,却保证了可解密性,因为完全没有进⾏任何处理的右半部分是解密过程所必须的信息。由于加密和解密可以⽤完全相同的结构来实现,因此⽤于实现 DES 算法的硬件设备的设计也变得更容易了。三重DES三重DES(triple-des)是为了增加DES的强度,将DES重复3次所得到的⼀种密码算法,也称为TDEA(Triple Date Encryption Algorithm),通常缩写为3DES。明⽂经过三次DES处理才能变成最后的密⽂,由于DES密钥的长度实质上是56⽐特,因此三重DES的密钥长度就是56×3=168⽐特。从图中我们可以发现,三重DES并不是进⾏三次DES加密(加密→加密→加密),⽽是加密→解密→加密的过程。在加密算法中加⼊解密操作让⼈感觉很不可思议,实际上这个⽅法是IBM公司设计出来的,⽬的是为了让三重DES能够兼容普通的DES。当三重DES中所有的密钥都相同时,三重DES也就等同于普通的DES了。这是因为在前两步加密→解密之后,得到的就是最初的明⽂。因此,以前⽤DES加密的密⽂,就可以通过这种⽅式⽤三重DES来进⾏解密。也就是说,三重DES对DES具备向下兼容性。在DES的部分我们已经提到过,DES的加密和解密过程只是改变了⼦密钥的顺序,⽽实际进⾏的处理是相同的。如果所有密钥都使⽤相同的⽐特序列,则其结果与普通的DES是等价的。如果密钥1和密钥3使⽤相同的密钥,⽽密钥2使⽤不同的密钥(也就是只使⽤两个DES密钥),这种三重DES就称为DES-EDE2。EDE表⽰的是加密(Encryption)→解密(Decryption)→加密(Encryption)这个流程。密钥1、密钥2、密钥3全部使⽤不同的⽐特序列的三重DES称为des-ede3。go 实现三重DES加密解密在这⾥,我们⽤了⼀个 go 的加解密包,做了以下封装:package mainimport ( "encoding/base64" "/wumansgy/goEncrypt")// 密钥 24字节const secretKey = "hjdo843k920s6um4kk8sk3s8"// 三重DES加密func TripleDesEncrypt(encryptedString string) (string, error) { cryptText, err := DesEncrypt([]byte(encryptedString), []byte(secretKey)) if err != nil { return "", err } return ToString(cryptText), nil}// 三重DES解密func TripleDesDecrypt(decryptString string) (string, error) { decryptBytes, err := String(decryptString) if err != nil { return "", err } cryptText, err := DesDecrypt(decryptBytes, []byte(secretKey)) if err != nil { return "", err } return string(cryptText), nil}
发布评论