常用密码算法-DES

常用密码算法-DES_第1张图片
image.png

常用密码算法-DES_第2张图片
image.png

常用密码算法-DES_第3张图片
image.png

常用密码算法-DES_第4张图片
image.png

常用密码算法-DES_第5张图片
image.png

常用密码算法-DES_第6张图片
image.png

常用密码算法-DES_第7张图片
image.png

DES-CBC实例:

package main

import (
    "crypto/cipher"
    "crypto/des"
    "encoding/hex"
    "fmt"
    "gopcp/cryptology/utils"
)

func main() {
    //明文
    src := []byte("I Love you")
    //秘钥
    key := []byte("87654321")
    //加密
    encrypt_msg := EncryptDES(src, key)
    fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))//encrypt_msg =  cdacd3001fefdcd6f84593a17a3c0866
    //解密
    decrypt_msg := DecryptDES(encrypt_msg, key)
    fmt.Println("decrypt_msg = ", string(decrypt_msg))//decrypt_msg =  I Love you
}

//加密
func EncryptDES(src, key []byte) []byte {
    //通过秘钥创建加密块
    block, err := des.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //获取每个块的大小
    blockSize := block.BlockSize()
    //对明文进行填充
    src = utils.ZeroPadding(src, blockSize)
    //构建初始化向量
    iv := []byte("12345678")
    //创建CBC加密模式
    blockMode := cipher.NewCBCEncrypter(block, iv)
    dst := make([]byte, len(src))
    blockMode.CryptBlocks(dst, src)
    return dst
}

//解密
func DecryptDES(src, key []byte) []byte {
    block, err := des.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //构建初始化向量
    iv := []byte("12345678")
    //创建CBC解密模式
    blockMode := cipher.NewCBCDecrypter(block, iv)
    dst := make([]byte, len(src))
    //解密
    blockMode.CryptBlocks(dst, src)
    return utils.ZeroUnPadding(dst)
}


package utils

import "bytes"

//填充最后一个分组
//src:待填充的明文
//blockSize:分组大小
func PaddingText(src []byte, blockSize int) []byte {
    //求出最后一个分组需要填充的字节数
    padding := blockSize - len(src)%blockSize
    padText := bytes.Repeat([]byte{byte(padding)}, padding)
    //将填充数据拼接到明文后面
    nextText := append(src, padText...)
    return nextText
}

//去除尾部填充数据
func UnPaddingText(src []byte) []byte {
    len := len(src)
    number := int(src[len-1])
    newText := src[:len-number]
    return newText
}

//ciphertext:待填充的明文,blocksize:每块的大小
func ZeroPadding(ciphertext []byte, blocksize int) []byte {
    //计算要填充的字节
    padding := blocksize - len(ciphertext)%blocksize
    padtext := bytes.Repeat([]byte{0}, padding)
    return append(ciphertext, padtext...)
}

//去除尾部填充数据
func ZeroUnPadding(origdata []byte) []byte {
    return bytes.TrimRightFunc(origdata, func(r rune) bool {
        return r == rune(0)
    })
}

你可能感兴趣的:(常用密码算法-DES)