DES算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、DES是什么?

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
在这里插入图片描述

二、go语言实现

1.使用CBC模式

//   directory:  src/demo/1DES-cbc.go
package main

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

//使用des算法进行加密
//src:待加密的明文   key:秘钥
func EncryptDES(src, key []byte) []byte {
	//创建cipher.Block.接口,其对应的就是一个加密块
	block, err := des.NewCipher(key)
	if err != nil {
		panic(err)
	}
	//获取每个块的大小
	length := block.BlockSize()
	//对最后一组明文进行填充
	src = utils.PaddingText(src, length)
	//初始化向量
	iv := []byte("12345678")
	//创建cbc加密模式
	blockMode := cipher.NewCBCEncrypter(block, iv)
	//创建切片,用于存储加密之后的数据
	dst := make([]byte, len(src))
	blockMode.CryptBlocks(dst, src)
	return dst
}

//使用des进行解密
//src:待解密的密文    key:秘钥
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.UnPaddingText(dst)
}


func main() {
	src := []byte("wei")
	key := []byte("87654321")
	encrypt_msg := EncryptDES(src, key)
	//fmt.Println("encrypt_msg = ", encrypt_msg)
	fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))
	decrypt_msg := DecryptDES(encrypt_msg, key)
	fmt.Println("decrypt_msg = ", string(decrypt_msg))
}


// directory :       src/demo1/utils/utils.go
package utils

import "bytes"

//填充最后一个分组
//src:待填充的数据,   blockSize:分组大小
func PaddingText(src []byte, blockSize int) []byte {
	//求出最后一个分组需要填充的字节数
	padding := blockSize - len(src)%blockSize
	//创建新的切片,切片的字节数为padding。
	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
	//填充0
	padtext := bytes.Repeat([]byte{0}, padding)
	return append(ciphertext, padtext...)
}

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

1.使用ECB模式

package main

import (
	"crypto/des"
	"demo1/utils"
	"fmt"
	"encoding/hex"
)

//加密
func DesECBEncrypt(data, key []byte) []byte {
	block, err := des.NewCipher(key)
	if err != nil {
		panic(err)
	}
	length := block.BlockSize()
	data = utils.ZeroPadding(data,length)
	out := make([]byte, len(data))
	dst := out
	for len(data) > 0 {
		//每次加密8字节
		block.Encrypt(dst, data[:length])
		//去除已被加密的数据
		data = data[length:]
		dst = dst[length:]
	}
	return out
}

//解密
func DesECBDecrypt(data, key []byte) []byte{
	block, err := des.NewCipher(key)
	if err != nil {
		panic(err)
	}
	length := block.BlockSize()
	out := make([]byte, len(data))
	dst := out
	for len(data) > 0 {
		block.Decrypt(dst, data[:length])
		data = data[length:]
		dst = dst[length:]
	}
	out = utils.ZeroUnPadding(out)
	return out
}


func main() {
	key := []byte("12345678")
	data := []byte("wei")
	encrypt_msg := DesECBEncrypt(data, key)
	fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))
	decrypt_msg := DesECBDecrypt(encrypt_msg, key)
	fmt.Println("decrypt_msg = ", string(decrypt_msg))
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值