go语言实现des go语言实现登录页面

什么是3DES对称加密算法?

DES加密经过下面的步骤

创新互联建站于2013年创立,先为达日等服务建站,达日等地企业,进行企业商务咨询服务。为达日企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

1、提供明文和密钥,将明文按照64bit分块(对应8个字节),不足8个字节的可以进行填充(填充方式多种),密钥必须为8个字节共64bit

填充方式:

当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。

* NoPadding

API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim

* PKCS5Padding

加密前:数据字节长度对8取余,余数为m,若m0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8

解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。

例如:加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

* PKCS7Padding

PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。

2、选择加密模式

**ECB模式** 全称Electronic Codebook模式,译为电子密码本模式

**CBC模式** 全称Cipher Block Chaining模式,译为密文分组链接模式

**CFB模式** 全称Cipher FeedBack模式,译为密文反馈模式

**OFB模式** 全称Output Feedback模式,译为输出反馈模式。

**CTR模式** 全称Counter模式,译为计数器模式。

3、开始加密明文(内部原理--加密步骤,加密算法实现不做讲解)

image

1、将分块的64bit一组组加密,示列其中一组:将此组进行初始置换(IP置换),目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。

2、开始Feistel结构的16次转换,第一次转换为:右侧数据R0和子密钥经过轮函数f生成用于加密左侧数据的比特序列,与左侧数据L0异或运算,

运算结果输出为加密后的左侧L0,右侧数据则直接输出为右侧R0。由于一次Feistel轮并不会加密右侧,因此需要将上一轮输出后的左右两侧对调后才正式完成一次Feistel加密,

3、DES算法共计进行16次Feistel轮,最后一轮输出后左右两侧无需对调,每次加密的子密钥不相同,子密钥是通过秘钥计算得到的。

4、末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入

DES解密经过下面的步骤

1、拿到密文和加密的密钥

2、解密:DES加密和解密的过程一致,均使用Feistel网络实现,区别仅在于解密时,密文作为输入,并逆序使用子密钥。

3、讲解密后的明文去填充 (padding)得到的即为明文

Golang实现DES加密解密

package main

import (

"fmt"

"crypto/des"

"bytes"

"crypto/cipher"

)

func main() {

var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))

fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最后5位是补码

var txt,_ = DESDecode(miwen,[]byte("12345678"))

fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明码

fmt.Printf("%s",txt) // hello world

}

// 加密函数

func DESEncode(orignData, key []byte)([]byte,error){

// 建立密码块

block ,err:=des.NewCipher(key)

if err!=nil{ return nil,err}

// 明文分组,不足的部分加padding

txt := PKCS5Padding(orignData,block.BlockSize())

// 设定加密模式,为了方便,初始向量直接使用key充当了(实际项目中,最好别这么做)

blockMode := cipher.NewCBCEncrypter(block,key)

// 创建密文长度的切片,用来存放密文字节

crypted :=make([]byte,len(txt))

// 开始加密,将txt作为源,crypted作为目的切片输入

blockMode.CryptBlocks(crypted,txt)

// 将加密后的切片返回

return crypted,nil

}

// 加密所需padding

func PKCS5Padding(ciphertext []byte,size int)[]byte{

padding := size - len(ciphertext)%size

padTex := bytes.Repeat([]byte{byte(padding)},padding)

return append(ciphertext,padTex...)

}

// 解密函数

func DESDecode(cripter, key []byte) ([]byte,error) {

// 建立密码块

block ,err:=des.NewCipher(key)

if err!=nil{ return nil,err}

// 设置解密模式,加密模式和解密模式要一样

blockMode := cipher.NewCBCDecrypter(block,key)

// 设置切片长度,用来存放明文字节

originData := make([]byte,len(cripter))

// 使用解密模式解密,将解密后的明文字节放入originData 切片中

blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分

strByt := UnPKCS5Padding(origenData)

return strByt,nil

}

// 解密所需要的Unpadding

func UnPKCS5Padding(origin []byte) []byte{

// 获取最后一位转为整型,然后根据这个整型截取掉整型数量的长度

// 若此数为5,则减掉转换明文后的最后5位,即为我们输入的明文

var last = int(origin[len(origin)-1])

return origin[:len(origin)-last]

}

注意:在设置加密模式为CBC的时候,我们需要设置一个初始化向量,这个量的意思 在对称加密算法中,如果只有一个密钥来加密数据的话,明文中的相同文字就会也会被加密成相同的密文,这样密文和明文就有完全相同的结构,容易破解,如果给一个初始化向量,第一个明文使用初始化向量混合并加密,第二个明文用第一个明文的加密后的密文与第二个明文混合加密,这样加密出来的密文的结构则完全与明文不同,更加安全可靠。CBC模式图如下

CBC

3DES

DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。

对比DES,发现只是换了NewTripleDESCipher。不过,需要注意的是,密钥长度必须24byte,否则直接返回错误。关于这一点,PHP中却不是这样的,只要是8byte以上就行;而Java中,要求必须是24byte以上,内部会取前24byte(相当于就是24byte)。另外,初始化向量长度是8byte(目前各个语言都是如此,不是8byte会有问题)

Go语言设计与实现(上)

基本设计思路:

类型转换、类型断言、动态派发。iface,eface。

反射对象具有的方法:

编译优化:

内部实现:

实现 Context 接口有以下几个类型(空实现就忽略了):

互斥锁的控制逻辑:

设计思路:

(以上为写被读阻塞,下面是读被写阻塞)

总结,读写锁的设计还是非常巧妙的:

设计思路:

WaitGroup 有三个暴露的函数:

部件:

设计思路:

结构:

Once 只暴露了一个方法:

实现:

三个关键点:

细节:

让多协程任务的开始执行时间可控(按顺序或归一)。(Context 是控制结束时间)

设计思路: 通过一个锁和内置的 notifyList 队列实现,Wait() 会生成票据,并将等待协程信息加入链表中,等待控制协程中发送信号通知一个(Signal())或所有(Boardcast())等待者(内部实现是通过票据通知的)来控制协程解除阻塞。

暴露四个函数:

实现细节:

部件:

包: golang.org/x/sync/errgroup

作用:开启 func() error 函数签名的协程,在同 Group 下协程并发执行过程并收集首次 err 错误。通过 Context 的传入,还可以控制在首次 err 出现时就终止组内各协程。

设计思路:

结构:

暴露的方法:

实现细节:

注意问题:

包: "golang.org/x/sync/semaphore"

作用:排队借资源(如钱,有借有还)的一种场景。此包相当于对底层信号量的一种暴露。

设计思路:有一定数量的资源 Weight,每一个 waiter 携带一个 channel 和要借的数量 n。通过队列排队执行借贷。

结构:

暴露方法:

细节:

部件:

细节:

包: "golang.org/x/sync/singleflight"

作用:防击穿。瞬时的相同请求只调用一次,response 被所有相同请求共享。

设计思路:按请求的 key 分组(一个 *call 是一个组,用 map 映射存储组),每个组只进行一次访问,组内每个协程会获得对应结果的一个拷贝。

结构:

逻辑:

细节:

部件:

如有错误,请批评指正。

国密算法

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。

SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。

国家密码管理局公布的公钥算法,其加密强度为256位

SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。

SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

分组密码算法(DES和SM4)、将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,

公钥密码算法(RSA和SM2)、公开加密算法本身和公开公钥,保存私钥

摘要算法(SM3 md5) 这个都比较熟悉,用于数字签名,消息认证,数据完整性,但是sm3安全度比md5高

总得来说国密算法的安全度比较高,2010年12月推出,也是国家安全战略,现在银行都要要求国际算法改造,要把国际算法都给去掉

C 语言实现

Go 语言

Java 语言

Go语言实现,调用 gmsm


网站标题:go语言实现des go语言实现登录页面
新闻来源:http://hbruida.cn/article/hijiod.html