一、数字签名流程图

二、实现场景描述

直接使用百度百科中关于数字签名的应用例子,如下:

假如现在 Alice 向 Bob 传送数字信息,为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为:

1.Alice 准备好要传送的数字信息(明文);

2.Alice 对数字信息进行哈希运算,得到一个信息摘要;

3.Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名,并将其附在数字信息上;

4.Alice 随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文;

5.Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密,将加密后的 DES 密钥连同密文一起传送给Bob;

6.Bob 收到 Alice 传送来的密文和加密过的 DES 密钥,先用自己的私钥对加密的 DES 密钥进行解密,得到 Alice随机产生的加密密钥;

7.Bob 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃;

8.Bob 用 Alice 的公钥对 Alice 的数字签名进行解密,得到信息摘要;

9.Bob 用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要;

10.Bob 将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。

假定Alice和Bob都已知对方的公钥。

以上过程使用的技术:

1、哈希运算:Go语言可以使用sha256哈希运算包将明文信息运算为256为位的哈希值,该值不可逆且唯一。

2、对称加密:使用DES对称加密对明文进行加密。

3、非对称加密:这里使用RSA非对称加密实现数字签名。

三、实现代码

1、DES对称加密代码如下:

package encrypimport ("bytes""crypto/des""crypto/cipher"
)func padding(src []byte,blocksize int) []byte {n:=len(src)padnum:=blocksize-n%blocksizepad:=bytes.Repeat([]byte{byte(padnum)},padnum)dst:=append(src,pad...)return dst
}func unpadding(src []byte) []byte {n:=len(src)unpadnum:=int(src[n-1])dst:=src[:n-unpadnum]return dst
}func EncryptDES(src []byte,key []byte) []byte {block,_:=des.NewCipher(key)src=padding(src,block.BlockSize())blockmode:=cipher.NewCBCEncrypter(block,key)blockmode.CryptBlocks(src,src)return src
}func DecryptDES(src []byte,key []byte) []byte {block,_:=des.NewCipher(key)blockmode:=cipher.NewCBCDecrypter(block,key)blockmode.CryptBlocks(src,src)src=unpadding(src)return src
}

2、RSA非对称加密代码如下:

package encrypimport ("crypto/rand"  "crypto/rsa"  "crypto/x509"  "encoding/pem"  "errors"
)var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDfw1/P15GQzGGYvNwVmXIGGxea8Pb2wJcF7ZW7tmFdLSjOItn9
kvUsbQgS5yxx+f2sAv1ocxbPTsFdRc6yUTJdeQolDOkEzNP0B8XKm+Lxy4giwwR5
LJQTANkqe4w/d9u129bRhTu/SUzSUIr65zZ/s6TUGQD6QzKY1Y8xS+FoQQIDAQAB
AoGAbSNg7wHomORm0dWDzvEpwTqjl8nh2tZyksyf1I+PC6BEH8613k04UfPYFUg1
0F2rUaOfr7s6q+BwxaqPtz+NPUotMjeVrEmmYM4rrYkrnd0lRiAxmkQUBlLrCBiF
u+bluDkHXF7+TUfJm4AZAvbtR2wO5DUAOZ244FfJueYyZHECQQD+V5/WrgKkBlYy
XhioQBXff7TLCrmMlUziJcQ295kIn8n1GaKzunJkhreoMbiRe0hpIIgPYb9E57tT
/mP/MoYtAkEA4Ti6XiOXgxzV5gcB+fhJyb8PJCVkgP2wg0OQp2DKPp+5xsmRuUXv
720oExv92jv6X65x631VGjDmfJNb99wq5QJBAMSHUKrBqqizfMdOjh7z5fLc6wY5
M0a91rqoFAWlLErNrXAGbwIRf3LN5fvA76z6ZelViczY6sKDjOxKFVqL38ECQG0S
pxdOT2M9BM45GJjxyPJ+qBuOTGU391Mq1pRpCKlZe4QtPHioyTGAAMd4Z/FX2MKb
3in48c0UX5t3VjPsmY0CQQCc1jmEoB83JmTHYByvDpc8kzsD8+GmiPVrausrjj4p
y2DQpGmUic2zqCxl6qXMpBGtFEhrUbKhOiVOJbRNGvWW
-----END RSA PRIVATE KEY-----
`) var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfw1/P15GQzGGYvNwVmXIGGxea
8Pb2wJcF7ZW7tmFdLSjOItn9kvUsbQgS5yxx+f2sAv1ocxbPTsFdRc6yUTJdeQol
DOkEzNP0B8XKm+Lxy4giwwR5LJQTANkqe4w/d9u129bRhTu/SUzSUIr65zZ/s6TU
GQD6QzKY1Y8xS+FoQQIDAQAB
-----END PUBLIC KEY-----
`) // 加密
func RsaEncrypt(origData []byte) ([]byte, error) {  //解密pem格式的公钥  block, _ := pem.Decode(publicKey)  if block == nil {  return nil, errors.New("public key error")  }  // 解析公钥  pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)  if err != nil {  return nil, err  }  // 类型断言  pub := pubInterface.(*rsa.PublicKey)  //加密  return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}  // 解密
func RsaDecrypt(ciphertext []byte) ([]byte, error) {  //解密  block, _ := pem.Decode(privateKey)  if block == nil {  return nil, errors.New("private key error!")  }  //解析PKCS1格式的私钥  priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)  if err != nil {  return nil, err  }  // 解密  return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
} 

3、服务器端Alice发送信息代码:

package main import ("encryp""crypto/sha256""fmt"
)type sgTure struct{info []byte   //数字信息(加密)sginfo []byte //签名信息 randKey string //对称加密的密钥,随机生成
}func main() {//发送的信息,Bob,你欠我的500元钱不用还了info:="hello,Bob,don't still owe me 500 yuan money"//将信息生成信息摘要data := []byte(info)sat:=sha256.Sum256(data)//用私钥对摘要进行加密,生成数字签名sginfo:=encryp.RsaEncrypt(sat)//将明文信息用随机密钥进行加密randkey=getRandStr()info:=encryp.EncryptDES(data,randkey)//以上信息打包发送给Bobsgture:=sgTure{info,sginfo:sginfo,randKey:randkey}sendToBob(sgture)
}

4、客户端Bob接收信息代码:

func main(){//获取Alice发送的信息valueAll:=getInfofromAlice()//使用Bob发送的随机对称密钥进行解密data:=encryp.DecryptDES(valueAll.info,valueAll.randKey)//将该信息生成哈希摘要sat:=sha256.Sum256(data)//使用Alice的公钥进行解密sat1:=encryp.RsaDecrypt(valueAll.sginfo)//如果哈希摘要相同,获取该信息if sat==sat1{value:=string(data)}}

Go语言代码实现数字签名过程相关推荐

  1. 【VS 2017 C语言 汇编语言】如何使用VS 2017,通过反汇编查看C语言代码对应的32位x86汇编语言 VS 2017单步调试的使用

    0 前言 本文适用于VS的大多数版本,本文以VS 2017为例进行讲解. 1 编辑C语言代码 首先,在VS编译器中,创建项目,敲一段C语言代码,这个过程不解释了,如果不会请百度. #include & ...

  2. Linux系统中使用vim编写C语言代码实现过程

    博主这里是阿里云CentOs7的系统,以下涉及到的yum软件安装命令,在其他Linux发行版上可能会有些许不同,望读者安装时注意,如出现命令无法识别请根据对应发行版自行百度. 使用Linux进行C语言 ...

  3. C语言 输入一行字符,统计其中有多少个单词 和 有三个字符串(网上找的代码有瑕疵已解决),找出其中最大者的完整代码及分析过程

    问题1:输入一行字符,统计其中有多少个单词 思考这一类问题的常用解决方法是什么?是这种形式的: ------>最终完整的代码:<------ #include <stdio.h> ...

  4. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  5. java 与c 运行效率_Java语言与C语言代码运行效率的比较

    <Java语言与C语言代码运行效率的比较>由会员分享,可在线阅读,更多相关<Java语言与C语言代码运行效率的比较(2页珍藏版)>请在人人文库网上搜索. 1.Java语言与C语 ...

  6. C语言的编译链接过程详解

    学过C语言的人都应该知道,我们所编辑的C语言程序是不能直接放到机器上运行的,它只不过是一个带".c"后缀的文件(也称为源代码)而已,需要经过一定的处理才能转换成机器上可运行的可执行 ...

  7. C语言代码规范(编程规范)

    首页 > 编程笔记 > C语言笔记 阅读:7,165 C语言代码规范(编程规范) C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学:一 ...

  8. 语言代码编程大赛简讯_精品干货:C语言的高效编程与代码优化

    在本篇文章中,我收集了很多经验和方法.应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码. 简介 在最近的一个项目中,我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级 ...

  9. javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...

最新文章

  1. 文巾解题 1433. 检查一个字符串是否可以打破另一个字符串
  2. void和void*详解 v2
  3. VHDL程序基本构建
  4. 2016蓝桥杯省赛---java---B---3(凑算式)
  5. JS prototype作用
  6. 遍历结构体_三菱ST语言编程(3)——结构体变量
  7. hud 3874 求区间内不同数字的和
  8. 长文 | HuggingFace实战 之 多语言命名实体识别
  9. gbq6什么软件能打开_GBQ5是啥文件,用哪个软件打开
  10. android分享截屏到微信,Android截屏分享功能
  11. Mac OS X Safari 插件存放位置
  12. 聊聊志愿填报那点事儿
  13. 练习篇:完整实践——实现一个简易日记本应用
  14. java控制台输出脚标上标下标,c – 如何在CLI上打印下标/上标?
  15. SAN和NAS的区别
  16. 论文综述:问答系统综述
  17. mysql create table as select from_CREATE TABLE 表名 AS SELECT 语句
  18. Win8.1自带“滑动关机” 小技巧教你开启隐藏功能
  19. 山东理工大学计算机学院社团联合会,山东理工大学——计算机科学与技术学院开展“十年之约·毕业班会”...
  20. 基于STM32的智能点餐系统

热门文章

  1. Brave 安全隐私浏览器
  2. 华裔计算机科学家图灵奖,首位获得图灵奖的华裔科学家-姚期智
  3. 分枝PEI修饰的PLGA纳米粒/载柚皮素的牛血清白蛋白修饰PLGA纳米粒/包封香豆素-6的PLGA纳米粒
  4. 常见英文专业名词缩写——未完待续
  5. 从你的全世界路过- 告白气球
  6. LeetCode 1079. 活字印刷
  7. 通过 汇编了解C语言 指针 悬垂指针概念
  8. 广域红外望远镜的最新发现:最冷的恒星
  9. 2017新媒体运营升职加薪指南:从内容到数据,如何走好新媒体的进阶之路?
  10. 基于javaweb+SpringBoot的汽车配件销售管理系统(java+SpringBoot+layui+html+maven+mysql)