DES
DES加密是一种将64位明文加密为64位密文的对称加密算法。DES是以64位明文为一个单位进行加密的,以64位为单位进行分组。
DES的Feistel网络
image64位明文被分成左右两部分进行处理,右侧数据和子密钥经过轮函数生成用于加密左侧数据的序列,与左侧数据进行异或运算,运算结果输出为位加密后的左侧,右侧数据直接输出位右侧。这样的过程称为一次Feistel轮。
每轮Feistel轮都使用不同的子密钥。由于每轮Feistel不会加密右侧,因此需要将上一轮的输出进行左右两侧对调,DES共计需要进行16次Feistel轮,最后一次无需左右对调。
实现DES的加密跟解密
- 对明文进行补码,使得明文能够以64位进行分组。在DES加密前使用
func PKCS5Padding(orgData []byte,size int) []byte {
padding := size - len(orgData)%8
padTxt := bytes.Repeat([]byte{byte(padding)},padding)
return append(orgData,padTxt...)
}
- DES解密之后得到的还不是初始的明文,需要进行去除之前增加的补码
func PKCS5UnPadding(cipherTxt []byte) []byte {
//要删减的字母
unpadding := int(cipherTxt[len(cipherTxt) - 1])
length := len(cipherTxt)
return cipherTxt[:length - unpadding]
}
- DES加密,这里使用的加密方式为CBC方式
func DesEncrypt(orig []byte,key []byte) []byte {
//首先会检查密钥是否合法
//Des加密算法,密钥的长度必须是8bit
block,_ := des.NewCipher(key)
//补码
orgiData := PKCS5Padding(orig,block.BlockSize())
//设置加密方式
blockMode := cipher.NewCBCEncrypter(block,key)
//创建缓冲区
crypted := make([]byte,len(orgiData))
blockMode.CryptBlocks(crypted,orgiData)
return crypted
}
- DES解密
func DesDecrypt(cipherTxt []byte,key []byte) []byte {
//校验key的有效性
block,_ := des.NewCipher(key)
// 设置解码方式
blockMode := cipher.NewCBCDecrypter(block,key)
// 创建缓冲区,存放解密后的数据
orgData := make([]byte,len(cipherTxt))
//开始解密
blockMode.CryptBlocks(orgData,cipherTxt)
//去掉编码
orgi := PKCS5UnPadding(orgData)
return orgi
}
- 使用DES对明文进行加密解密
func main() {
//原文
var str = "Hello World"
//加密得到密文
desStr := DesEncrypt([]byte(str),[]byte("12345678"))
//解密得到明文
sourceStr := DesDecrypt(desStr,[]byte("12345678"))
fmt.Printf("%s",sourceStr)
}
DES的不同加密模式
1.ECB模式
电子密码本方式,将数据进行按照8个字节进行分组,不足8个字节的则进行补码,划分之后则对数据按照8个字节进行加密,之后按照顺序将计算得到的结果进行拼接得到密文
2.CBC模式
CBC模式上面已进行详解
3.CFB模式
CFB的加密解密模式如下所示:
image
CFB模式全称密文反馈模式,前一分组的密文会被送到密码算法的输入端
网友评论