加密算法之DES

2018-12-19  本文已影响6人  Carrism

DES

DES加密是一种将64位明文加密为64位密文的对称加密算法。DES是以64位明文为一个单位进行加密的,以64位为单位进行分组。

DES的Feistel网络

image

64位明文被分成左右两部分进行处理,右侧数据和子密钥经过轮函数生成用于加密左侧数据的序列,与左侧数据进行异或运算,运算结果输出为位加密后的左侧,右侧数据直接输出位右侧。这样的过程称为一次Feistel轮。

每轮Feistel轮都使用不同的子密钥。由于每轮Feistel不会加密右侧,因此需要将上一轮的输出进行左右两侧对调,DES共计需要进行16次Feistel轮,最后一次无需左右对调。

实现DES的加密跟解密

func PKCS5Padding(orgData []byte,size int) []byte  {
    padding := size - len(orgData)%8
    padTxt := bytes.Repeat([]byte{byte(padding)},padding)
    return append(orgData,padTxt...)
}
func PKCS5UnPadding(cipherTxt []byte) []byte  {
    //要删减的字母
    unpadding := int(cipherTxt[len(cipherTxt) - 1])
    length := len(cipherTxt)
    return cipherTxt[:length - unpadding]
}
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
}
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
}
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模式全称密文反馈模式,前一分组的密文会被送到密码算法的输入端

上一篇 下一篇

猜你喜欢

热点阅读