一、我们先介绍一下数字签名的简单步骤:
- 发送方先将信息(明文)进行单向散列加密生成散列值
- 发送方将散列值和RSA私钥进行签名操作生成签名密文
- 发送 <数据+签名密文>
- 接收方用发送方的公钥对密文进行解密(验证发送方的身份)
- 接收方使用数据进行单向散列生成散列值(验证数据是否被篡改)
- 验证
二、具体实现步骤:
1、生成对应RSA加密算法的公钥和私钥
1.1 生成私钥
- rsa.GenerateKey 生成私钥
- 对生成的私钥进行X509规范序列化
- 构建pem的Block
- 创建pem文件,将序列化后的私钥存储到pem块中:pem.Ecode
1.2 生成公钥(公钥信息在私钥中)
- 获取公钥信息publicKey
- 同上进行X509规范序列化并创建pem块
- 并生成public文件,将密文进行填充pem块内
——————————————数据签名 ——————————————————
2、先对明文信息进行单向散列
- 两种方式选择即:sha256.Sum256【适合短信息散列】 和 sha256.New【适合长信息散列】
3、使用从private.pem中进行解密
- 打开private.pem文件进行获取对私钥信息message【pem类型】
- 对message进行pem中的剥离pem.Decode中的block.Bytes的b数组
- 对数组进行依据X509规范进行解析得出私钥privateKey
4、使用私钥对散列后的值进行加密
- 这里的hashed是采用了第一个散列方法对明文数据进行加密
- 使用rsa的SignPKCS1v15进行签名
——————————————数据签名验证——————————————————
5、使用从public.pem中进行解密
- 打开public.pem文件进行获取对私钥信息message【pem类型】
- 对message进行pem中的剥离pem.Decode中的block.Bytes的b数组
- 对数组进行依据X509规范进行解析得出私钥key
- 这里需要一个类型断言,强转
6、使用公钥对散列后的值进行加密
- 这里的hashed是采用了第一个散列方法对明文数据进行加密
- 使用rsa的VerifyPKCS1v15进行签名
——————————结束——————————————————————————