化工行业在股市属于什么板块? 化工行业股票有哪些
2023-08-25
很多朋友对除氧器的工作原理及作用是什么,DES加密原理和作用是什么不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。
【简介】本文介绍了DES加密的原理和功能,以及golang中相应的DES加解密机制的实现。概念理解DES以64位为单位对明文进行加密,生成64位密文。DES是一种分组密码算法,因为它一次只能处理一段特定长度的数据。cypto/des包提供了des加密的功能。模型
由于分组密码算法只能加密固定长度的分组,当加密的明文超过分组密码的长度时,就需要对分组密码算法进行迭代,这种迭代方式称为分组密码模式。主要有五种模式:ECB(电子码本)、CBC(密码分组链接模式)、CTR(计数器模式)、OFB(输出反馈模式)和CFB(密码反馈模式)。下面简单介绍一下前两种:
ECB(电子码本)是最简单的方式,直接把明文块的加密结果变成密文块。优缺点:模式操作简单;明文中的重复会在密文中表现出来,特别是对于图像数据和明文变化不大的数据;适用于短消息的加密传输。
CBC(cipher block chaining)的原理是加密算法的输入是当前明文包和前一个密文包的异或,第一个明文包和一个初始向量进行异或,这样当同一个明文包重复出现时就会产生不同的密文包。
特点:同一明文组重复出现时产生不同的密文组;加密函数的输入是当前明文分组和先前密文分组的异或;每个明文分组的加密函数的输入和明文分组之间没有固定的关系;适合加密长消息。填充方法
按8字节加密或解密DES时,如果最后一个字节小于8位,则需要补充数据。即使加密或解密的数据只是8的倍数,也要增加8位。举个栗子的例子。如果最后只是出现了一个1,那么你就无法判断这个1是原始数据还是补位得到的1。因此,可以增加8位用于识别。有几种填充方法:pkcs 7填充、pkcs 5填充、零填充、ISO 10126、 ANXIX 923。
Pkcs7padding和pkcs5padding的填充方式相同,填充字节的值等于填充字节数。比如需要填充4个字节,那么填充的值就是“4 4 4 4”。零填充填充字节的值都是0。密码DES的密钥长度是64比特,但是由于每7比特设置一个用于错误检测的比特,所以它的实际密钥长度是56比特。抵消
在上述模式下,如CBC,再次加密第一个明文包时,由于没有“前密文包”,需要事先准备一个长度为一个包的比特序列来替换“前密文包”,这个比特序列就成为一个初始化向量,也叫offset,通常缩写为IV。一般来说,每次加密都会随机产生一个不同的比特序列作为初始化向量。偏移量的长度必须与块的大小相同。输出
加密字节可以用十六进制和base64代码显示,十六进制是十六进制代码,base64是一种基于64个可打印字符识别二进制数据的方法。让我们以上面提到的模式和填充方法为例来演示如何在代码中使用它们。加密方式为ECB,填充方式为pkcs5padding,密码为“12345678”,输出为十六进制编码。你可以通过一些在线测试工具自己测试一下,看看结果是否一致。包mainimport ("crypto/des"
“qiniupkg。com/x/错误。V7""bytes""fmt""encoding/hex")func main(){ data:=[]byte("hello world")key:=[]byte("12345678")result,err:=desecbcencrypt(data,key)if err!=零{fmt .println(err)} a:=十六进制。编码字符串(结果)fmt .println(a)} func desecbcencrypt(data,key []byte) ([]byte,error) {//NewCipher创建一个新的加密块块,err :=des .NewCipher(key)if err!=零{
返回nil,err}bs :=block .块大小()数据=pkcs 5填充(数据,bs)if len(数据)%bs!=0 {返回零,错误.新(“需要块大小的倍数"")out :=make([]byte,len(data))dst:=outfor len(data)"0 {//Encrypt加密第一个块,将其结果保存到dstblock .Encrypt(dst,data[:bs])data=data[bs:]dst=dst[bs:]} return out,nil}
Func Pkcs5Padding (ciphertext []byte, block size int) [] byte {padding:=block size-len (ciphertext) %blockSizepadtext :=bytes. Repeat([]byte{byte(padding)}, padding)return append (ciphertext, padtext). )} The following encryption mode adopts full blood cell count, and the filling mode adopts pkcs 5. The password is"12345678"and the offset is"43218765", and it is output in hexadecimal. You can test yourself through some online testing tools to see if the results are consistent with the package owner.
import("crypto/des""bytes""fmt""encoding/hex""crypto/cipher")func main(){ data:=[]byte("hello world")key:=[]byte("12345678")iv:=[]byte("43218765")结果,err:=desbcencrypt(data,key,iv)if err!=零{fmt .Println(err)}b :=十六进制。编码字符串(结果)fmt .println(b)} func desbcencrypt(data,key,iv []byte) ([]byte,error) {
块,err :=des .NewCipher(key)if err!=nil {return nil,err}data=pkcs5Padding(data,block .block size())crypt text:=make([]byte,len(data))blockMode :=cipher .NewCBCEncrypter(block,iv)blockMode .CryptBlocks(cryptText,data)return cryptText,nil}func pkcs5Padding(密文[]byte,block size int)[]byte { padding:=block size-len(密文)%块大小
padText :=bytes.Repeat(byte{byte(padding)}, padding)
return append(cipherText, padText.)
}
第三方包
github.com/marspere/goencrypt包实现了多种加密算法,包括对称加密和非对称加密等。
package main
import (
“fmt”
“github.com/marspere/goencrypt”
)
func main() {
//key为12345678
//iv为空
//采用ECB分组模式
//采用pkcs5padding填充模式
//输出结果使用base64进行加密
cipher :=goencrypt.NewDESCipher(byte(“12345678”), byte(“”), goencrypt.ECBMode, goencrypt.Pkcs5, goencrypt.PrintBase64)
cipherText, err :=cipher.DESEncrypt(byte(“hello world”))
if err !=nil {
fmt.Println(err)
return
}
fmt.Println(cipherText)
}
以上知识分享希望能够帮助到大家!
版权声明:本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们
推荐阅读
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
2023-08-25
栏目热点
化工行业在股市属于什么板块? 化工行业股票有哪些
LilyGoT手表键盘C3迷你电脑套件
索泰ZBOXEdgeCI342迷你电脑正式上市
谷歌在最新的视频预告片中展示了PixelWatch的独特设计
三星与设计师Juun.J合作推出限量版可折叠产品和配件
从2023年起Fitbit设备将需要Google帐户
TOKKCAMC2+智能WiFi独立日 夜视摄像头
三星正在与全球时尚品牌JUUN.J合作
OnePlusNordWatch的颜色选项通过泄露的渲染揭示
就在第一款Nothing手机发布之前一种新的TWS芽设计浮出水面