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

  之前工作主要使用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. java中构造方法和this,static关键字

    构造方法: 构造方法是一种特殊的方法,用于创建该类的对象,对对象的数据进行初始化 格式如下: [修饰符] 类名(形参列表){ 方法体 } 特点 A:方法名和类名相同  B:没有返回值类型,连void都 ...

  2. GitHub的实践

    GitHub的实践 2017-05-08,晴,来小米已经一周的时间了,感谢领导能给我一周的时间来熟悉 ubuntu.spring boot.maven.docker.github .大家会问,这些不都 ...

  3. elasticsearch系列(二) esrally压测

    环境准备 linux centOS(工作环境) python3.4及以上 pip3 JDK8 git1.9及以上 gradle2.13级以上 准备过程中的坑 这些环境准备没什么太大问题,都是wget下 ...

  4. TCP协议简介

    1.TCP协议的特点 TCP是面向连接的运输层协议 每一条TCP连接只能有两个端点.TCP只能进行点对点通信 TCP提供可靠交付的服务.通过TCP连接传输的数据,无差错.不丢失.不重复.并且按序到达 ...

  5. SQL server 用命令行更改数据库

    (计应154兰家才) CREATE  DATABASE  数据库名 ON [PRIMARY] ( <数据文件参数> [,…n]  [<文件组参数>] ) [LOG ON] ( ...

  6. TDE: Transparent Data Encryption brief introduction

    1. What is TDE? Briefly speaking, TDE is used to encrypted data. 2. The benifits: Belows are come fr ...

  7. Day5模块-random模块

    random:随机数 >>> import random>>> print(random.random()) #生成随机小数0.6906362176182085 & ...

  8. 使用Html5下WebSocket搭建简易聊天室

    一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...

  9. 开涛spring3(4.4) - 资源 之 4.4 Resource通配符路径

    4.4.1  使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...

  10. GRPC在NET上的实践(记录篇)

    GRPC是什么? GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffer ...