golang 私钥"加密"公钥"解密"
---恢复内容开始---
之前工作主要使用C/C++与银行/第三方支付对接,但C/C++无法满足客户”当天给协议明天实盘上载“的开发速度以及现公司一些特殊情况,所以决定用go来尝试实现。基本的框架已经按照原来C/C++非阻塞框架实现一次,内部涉及加密方式也用go重新实现一遍,但一个数字证书加密的方式着实坑爹了一把,同时这个问题,也看到了openssl的命名混乱。
关于这个加密方式的描述是:发送方用私钥进行rsa加密,接受方使用公钥进行rsa解密。看到这样的加密方式描述,感觉和自己的理解是有点不一样,不知道是不是自己对这方面了解不够深入,自己的理解是(之前使用过的加密方式):公钥是公开的,私钥是自己保存的,用私钥对数据进行签名,用公钥验证签名。感觉画风不一样,翻查一下openssl,的确也是存在这样的函数:
RSA_private_encrypt
和RSA_public_decrypt
,参考文档。用openssl很容易就实现这样一个加密解密。但用纯go语言实现,不可能再用cgo来调用c函数,翻查一下go的文档,存在在类似的函数(crypt/rsa
):
func DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)
和func EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) ([]byte, error)
。但仔细看,这里是使用公钥进行加密,使用私钥进行解密,和描述刚好相反。除了这两个涉及公私钥加密的函数外,似乎在go里面找不到其他类似的函数了。
在google(科学上网lanttern)里面,能够搜索到的答案似乎不多,最后在stackoverflow找到结果:Encrypt message with RSA private key (as in OpenSSL's RSA_private_encrypt。一哥们手工搞定,其代码放在goplaygound。看了一下代码,如果不是对go内部的数据结构非常熟悉,而且对rsa机制非常清楚,很难写出正常代码。难道go就没有现成的代码完成这个功能?后面,有人就说,这是什么狗屁加密,压根就是一rsa签名,就用crypt/rsa
里面,func SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)
实现的。尼玛的,测试结果还真是一样。后来,回头看一下openssl里面的参考文档说明,These functions handle RSA signatures at a low level.,这就是签名啊,既然是签名,为何命名encrypt/decrypt?是不是因为命名问题,广为传播为私钥"加密"公钥"解密"呢?
go不知道是不是受不了这样私钥"加密"公钥"解密"这种混乱的说法,不像其他语言一样提供类似的函数呢?至于公钥"解密",网上搜索不到满意答案,不过,既然私钥"加密"是rsa签名,那么公钥"解密"那么应该就是验证签名了。既然网上找不到满意的答案,那么只能修改一下go的func VerifyPKCS1v15(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error
函数。证实,这个想法是可行的。用openssl加密的数据,可以解密,加密的数据同时可以被openssl解密。
相关代码:https://github.com/buf1024/golib/tree/master/crypt 只简单导出PrivateEncrypt
和PublicDecrypt
两个函数。
最后,openssl的确存在一些非常混乱的命名方式,而其他语言/库,妥协这种混乱情况,那么混乱看起来即变为普遍。如不是非常熟悉,那么到一个不再妥协这种混乱时,那么及其容易使自己混乱啊。
---恢复内容结束---
之前工作主要使用C/C++与银行/第三方支付对接,但C/C++无法满足客户”当天给协议明天实盘上载“的开发速度以及现公司一些特殊情况,所以决定用go来尝试实现。基本的框架已经按照原来C/C++非阻塞框架实现一次,内部涉及加密方式也用go重新实现一遍,但一个数字证书加密的方式着实坑爹了一把,同时这个问题,也看到了openssl的命名混乱。
关于这个加密方式的描述是:发送方用私钥进行rsa加密,接受方使用公钥进行rsa解密。看到这样的加密方式描述,感觉和自己的理解是有点不一样,不知道是不是自己对这方面了解不够深入,自己的理解是(之前使用过的加密方式):公钥是公开的,私钥是自己保存的,用私钥对数据进行签名,用公钥验证签名。感觉画风不一样,翻查一下openssl,的确也是存在这样的函数:
RSA_private_encrypt
和RSA_public_decrypt
,参考文档。用openssl很容易就实现这样一个加密解密。但用纯go语言实现,不可能再用cgo来调用c函数,翻查一下go的文档,存在在类似的函数(crypt/rsa
):
func DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)
和func EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) ([]byte, error)
。但仔细看,这里是使用公钥进行加密,使用私钥进行解密,和描述刚好相反。除了这两个涉及公私钥加密的函数外,似乎在go里面找不到其他类似的函数了。
在google(科学上网lanttern)里面,能够搜索到的答案似乎不多,最后在stackoverflow找到结果:Encrypt message with RSA private key (as in OpenSSL's RSA_private_encrypt。一哥们手工搞定,其代码放在goplaygound。看了一下代码,如果不是对go内部的数据结构非常熟悉,而且对rsa机制非常清楚,很难写出正常代码。难道go就没有现成的代码完成这个功能?后面,有人就说,这是什么狗屁加密,压根就是一rsa签名,就用crypt/rsa
里面,func SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)
实现的。尼玛的,测试结果还真是一样。后来,回头看一下openssl里面的参考文档说明,These functions handle RSA signatures at a low level.,这就是签名啊,既然是签名,为何命名encrypt/decrypt?是不是因为命名问题,广为传播为私钥"加密"公钥"解密"呢?
go不知道是不是受不了这样私钥"加密"公钥"解密"这种混乱的说法,不像其他语言一样提供类似的函数呢?至于公钥"解密",网上搜索不到满意答案,不过,既然私钥"加密"是rsa签名,那么公钥"解密"那么应该就是验证签名了。既然网上找不到满意的答案,那么只能修改一下go的func VerifyPKCS1v15(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error
函数。证实,这个想法是可行的。用openssl加密的数据,可以解密,加密的数据同时可以被openssl解密。
相关代码:https://github.com/buf1024/golib/tree/master/crypt 只简单导出PrivateEncrypt
和PublicDecrypt
两个函数。
最后,openssl的确存在一些非常混乱的命名方式,而其他语言/库,妥协这种混乱情况,那么混乱看起来即变为普遍。如不是非常熟悉,那么到一个不再妥协这种混乱时,那么及其容易使自己混乱啊。
golang 私钥"加密"公钥"解密"的更多相关文章
- 基于私钥加密公钥解密的RSA算法C#实现
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...
- 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#
前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...
- RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...
- RSA 加密算法 Java 公钥加密私钥解密 和 私钥加密公钥解密 的特点
package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...
- 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!
最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...
- NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密
using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...
- RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例
前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密 私加 ===================== ...
- C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)
但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...
- 关于js私钥加密公钥解密的问题
博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...
随机推荐
- Java设计模式随笔
大家都知道Java23种设计模式,大神总结如下: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- NSLog (Log信息的输出)
概述 NSLog是 cocoa的框架中提供的一个方法 NSLog的定义 NSLog定义在NSObjCRuntime.h中 NSLog与printf的差异 1)NSLog传递进去的格式化字符是NSStr ...
- 如何在R中导入不同类型的数据
这个表格是我在datacamp学习R导入文件的课程的归纳 遇到的问题及解决方法(环境: Rv3.2.5,win7,32位) 1. 使用gdata中的read.xls时提示找不到Perl路径 >l ...
- 每天一道Java题[1]
问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个 ...
- MyBatis之级联——一对一关系
在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系 ...
- 2D游戏开发(1)
<外星人入侵> 通过pygame,入门python的2D游戏开发过程,通过教材制作一个打外星人游戏. 1.函数 run_game() import sys import pygame de ...
- 使用Post方法模拟登陆爬取网页
最近弄爬虫,遇到的一个问题就是如何使用post方法模拟登陆爬取网页.下面是极简版的代码: import java.io.BufferedReader; import java.io.InputStre ...
- jQuery选择器中的空格问题
前几天就遇到过这样的问题,明明我用的是('tr :even').css('background','#ccc')想改变表格中行的背景色,反复试了还是没改变.还问了度娘还是没找到原因所在(当时问题描述的 ...
- CTF 和 PHP ,数据库
引言 接触CTF 差不多一个月了,网上题目刷得也差不多,做了不少笔记,老想总结一下.当然,这种文章网上多得是. 正文笔记 少不了弱类型,松散比较,放一张图 2. mysql_real_escape_ ...
- 前端向后台的华丽转身 — PHP基础篇
这一次,本K带大家来看一下关于PHP中数组.字符串的一些注意事项和函数(方法). 一.PHP中的数组 (一)PHP中的数组简介 数组类型是PHP两种复合数据类型之一.根据下标的不同,可以将PHP中的数 ...