Windows用git-bash openssl实现文件加密、签名和摘要操作

需求:工作中和外部机构传递文件,遇到了加文件签名这个概念。搜集了些资料,了解了基本含义和流程,在Windows中用git-bash做了加密、签名和摘要的简单操作,具体如下。

git-bash要安装git:https://git-scm.com/download

一、基本概念

1. RSA非对称算法:生成一对公钥和私钥,公钥给大家,私钥自己保存。

(1)原文经公钥加密后的密文,只有通过私钥解密才能还原成原文--实现加密传输

(2)原文经私钥加密后的密文,只有通过公钥解密才能还原成原文--实现身份验证

2. 摘要算法:常用算法:MD5SHA1

对文件计算出一段固定长度信息,称之为摘要信息。不同的文本或者文件摘要不同,摘要信息就如同文档的指纹一样,文档极小的变化也引起摘要的极大变化。--用于验证文档未被篡改

二、实现流程

1. 加密传输

场景:大家要向自己传输保密文件,为了保证信息不被泄露,文件要加密传输。

Windows用git-bash openssl实现文件加密、签名和摘要操作_第1张图片

 

2. 身份验证

场景:自己要向大家传送通知,大家想验证发送通知的人确实是你。

Windows用git-bash openssl实现文件加密、签名和摘要操作_第2张图片

 

3. 文件验证

场景:大家向自己发送文件,自己想验证收到的文件是否在传输过程中被篡改过。

Windows用git-bash openssl实现文件加密、签名和摘要操作_第3张图片

4. 电子签名 = 身份验证 + 文件验证

场景:对原文用公钥加密的速度太慢,降低传输速度。

解决方案:对原文的摘要(固定长度)进行加密,同时可实现身份验证 + 文件验证。

Windows用git-bash openssl实现文件加密、签名和摘要操作_第4张图片

 

三、git-bash中openssl操作

# 1. 生成私钥和公钥
$ ssh-keygen  # 输入命令后回车。
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): # 保存路径,保持默认回车。
Created directory '/c/Users/Administrator/.ssh'.
Enter passphrase (empty for no passphrase):  # 保持默认回车。
Enter same passphrase again:  # 保持默认回车。
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.  # 私钥文件保存路径。
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.  # 公钥文件保存路径。
The key fingerprint is:
SHA256:....  # 省略
The key's randomart image is:
+---[RSA 2048]----+
|            **O+B|
|           + B*@B|
|          . +oO=O|
|         . o *.X+|
|        S   o O E|
|               X.|
|                o|
|                 |
|                 |
+----[SHA256]-----+


# 2. 对文件加密与解密
$ echo -n "Hello Rocky!" > msg.bin    #创建测试文件
$ openssl rsautl -in msg.bin -out msg.bin.enc -inkey public.pem -pubin -encrypt -pkcs  #用公钥加密,输出加密文件
$ openssl rsautl -in msg.bin.enc -out msg.bin.dec -inkey private.pem -decrypt -pkcs  #用私钥解密,输出解密文件msg.bin.dec,对比msg.bin应一致

# 3. 文件签名与验签(对全文做加密,即身份认证)
$ echo -n "Nice to meet you, Kris!" > file    #创建测试文件
$ openssl rsautl -in file -out file.sign -inkey private.pem -sign -pkcs  #用私钥签名,输出签名文件
$ openssl rsautl -in file.sign -out file.verf -inkey public.pem -verify -pubin -pkcs  #用公钥验签,输出file.verf,对比file应一致

# 4. 生成文件摘要
$ echo -n "We have a cat!" > contract    #创建测试文件
$ openssl dgst -md5 -out contract.md5 contract  #用md5算法,输出摘要文件contract.md5

参考链接

1. 基本概念:

https://www.iteye.com/blog/wallimn-327799

https://blog.csdn.net/kezhen/article/details/39473799

2. git-bash openssl操作:

https://www.cnblogs.com/gordon0918/p/5382541.html

3. python实现:

https://blog.csdn.net/huanhuanq1209/article/details/80901707

 

你可能感兴趣的:(其他)