---恢复内容开始---

  之前工作主要使用C/C++与银行/第三方支付对接,但C/C++无法满足客户”当天给协议明天实盘上载“的开发速度以及现公司一些特殊情况,所以决定用go来尝试实现。基本的框架已经按照原来C/C++非阻塞框架实现一次,内部涉及加密方式也用go重新实现一遍,但一个数字证书加密的方式着实坑爹了一把,同时这个问题,也看到了openssl的命名混乱。

  关于这个加密方式的描述是:发送方用私钥进行rsa加密,接受方使用公钥进行rsa解密。看到这样的加密方式描述,感觉和自己的理解是有点不一样,不知道是不是自己对这方面了解不够深入,自己的理解是(之前使用过的加密方式):公钥是公开的,私钥是自己保存的,用私钥对数据进行签名,用公钥验证签名。感觉画风不一样,翻查一下openssl,的确也是存在这样的函数:
RSA_private_encryptRSA_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 只简单导出PrivateEncryptPublicDecrypt两个函数。

  最后,openssl的确存在一些非常混乱的命名方式,而其他语言/库,妥协这种混乱情况,那么混乱看起来即变为普遍。如不是非常熟悉,那么到一个不再妥协这种混乱时,那么及其容易使自己混乱啊。

---恢复内容结束---

  之前工作主要使用C/C++与银行/第三方支付对接,但C/C++无法满足客户”当天给协议明天实盘上载“的开发速度以及现公司一些特殊情况,所以决定用go来尝试实现。基本的框架已经按照原来C/C++非阻塞框架实现一次,内部涉及加密方式也用go重新实现一遍,但一个数字证书加密的方式着实坑爹了一把,同时这个问题,也看到了openssl的命名混乱。

  关于这个加密方式的描述是:发送方用私钥进行rsa加密,接受方使用公钥进行rsa解密。看到这样的加密方式描述,感觉和自己的理解是有点不一样,不知道是不是自己对这方面了解不够深入,自己的理解是(之前使用过的加密方式):公钥是公开的,私钥是自己保存的,用私钥对数据进行签名,用公钥验证签名。感觉画风不一样,翻查一下openssl,的确也是存在这样的函数:
RSA_private_encryptRSA_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 只简单导出PrivateEncryptPublicDecrypt两个函数。

  最后,openssl的确存在一些非常混乱的命名方式,而其他语言/库,妥协这种混乱情况,那么混乱看起来即变为普遍。如不是非常熟悉,那么到一个不再妥协这种混乱时,那么及其容易使自己混乱啊。

golang 私钥"加密"公钥"解密"的更多相关文章

  1. 基于私钥加密公钥解密的RSA算法C#实现

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  2. 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#

    前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...

  3. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  4. RSA 加密算法 Java 公钥加密私钥解密 和 私钥加密公钥解密 的特点

    package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...

  5. 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!

    最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...

  6. NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密

    using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...

  7. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  8. C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)

    但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...

  9. 关于js私钥加密公钥解密的问题

    博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...

随机推荐

  1. 斗牛app上架应用宝、牛牛手机游戏推广、百人牛牛app应用开发、棋牌游戏上传、手游APP优化

    联系QQ:305-710439斗牛app上架应用宝.牛牛手机游戏推广.百人牛牛app应用开发.棋牌游戏上传.手游APP优化 iOS开发iPhone/iPad平台安卓手机软件开发机型覆盖范围 超过113 ...

  2. Java学习笔记——设计模式之二.策略模式

    明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...

  3. .Net程序员学用Oracle系列(26):PLSQL 之类型、变量和结构

    1.类型 1.1.属性类型 1.2.记录类型 2.变量 2.1.变量类型 2.2.变量定义 2.3.变量赋值 3.结构 3.1.顺序结构 3.2.选择结构 3.3.循环结构 4.总结 1.类型 在&l ...

  4. dubbo在企业中用得多吗?

    看了阿里的dubbo,据说是一个不错的服务框架, 不过,好像Minglisoft.technology搞研发希望各位可以指点学习 想知道其他的公司用这个框架多吗?遇到的问题能否快速解决呢?抉择中...

  5. ng-class改变css样式

    而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key ...

  6. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  7. java 空指针异常造成的原因有哪些

    实际上 空指针异常   也就是你用了一个没有实际值的对象 1. 某一对象没有被实例化,就拿来使用,如调用此对象的方法,会抛空指针异常. 2. 获取从别的对象传过来的对象为空 3. 数据库查询方面的空指 ...

  8. OpenStack云平台的网络模式及其工作机制

    网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分.经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件.下面根据自己的理解,谈一谈OpenSt ...

  9. 【面向对象设计原则】之接口隔离原则(ISP)

    接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...

  10. 一起学习java

    一.Servlet学习      下面是Servlet一个整体的继承结构       首先说一下Servlet这个接口这个主要包含的有init,service,destroy等方法,这里主要介绍这3个 ...