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

  之前工作主要使用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. 最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二

    写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术 ...

  2. MarkDown本地图片上传工具制作总结

    引言:开始尝试使用MarkDown语法写文档,发现图片必须用外链的形式才能插入到文章中,而自己平时最常用的插入图片方式就是QQ截屏,觉得很不方便所以制作的小工具辅助上传,因为时间和水平有限,其实代码写 ...

  3. 一个栗子上手CSS3动画

    最近杂七杂八的事情很多,很多知识都没来得及总结,是时候总结总结,开启新的篇章- 本篇文章不一一列举CSS3动画的属性,若需要了解API,可前往MDN 在开始栗子前,我们先补补基础知识. css3动画分 ...

  4. 微软Build 2017第二天 .NET Standard 2.0 Preview 的客户端跨平台

    微软公司一年一度的开发者大会,即“Microsoft Build 2017”在总部西雅图正式开幕.按照官方安排,本次大会将持续 3 天,主题围绕微软公司各项最新技术成果的展示和研讨,包括与微软相关的产 ...

  5. C++ 中的一些错觉

    1. 默认构造函数和不带参数的构造函数之间无联系 默认构造函数是编译器发现类不存在显式构造函数时自动生成的无参数的构造函数.同样,用户可以定义显示的无参数构造函数. 2. 在构造函数.析构函数中调用v ...

  6. ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap实现原理 ConcurrentHashMap源码分析 总结 ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对Ha ...

  7. DDD领域驱动 (一)

    说道DDD不得不说传统的架构与DDD的架构区别. 传统的架构不外乎就是三层,而在这三层里面又不断的细分,始终没有达到想要的效果,那么为什么当时还是采用三层. 当然在DDD没有提出的时候三层是大多数人的 ...

  8. web 直播&即时聊天------阿里云、融云

    随着直播越来越火,所在公司也打算制作自己的直播,所以去了解了这方面,使用后发现还是有些问题需要记录的. 经过分析,制作直播应该是分为两块来做,即直播与实时评论.这里先去制作实时评论,等直播ok后,也会 ...

  9. RabbitMQ 3.6.1集群搭建

    MQ的集群首先需要搭建erlang集群1.把cat /root/.erlang.cookie 内容改为一致 cat /root/.erlang.cookie 2.更改cookie文件权限 chmod ...

  10. TP框架 命名空间 与第三方类

    命名空间 相当于虚拟目录 所有类文件都放在虚拟目录 功能:实现自动加载类 TP框架的命名空间要更复杂 内容=> 命名空间中定义和使用 都用\1初始命名空间 相当于 根目录 如:Library文件 ...