版权声明:本文为作者原创,如需转载,请注明出处
https://blog.youkuaiyun.com/weixin_42940826
非对称加密简介
什么是非对称加密
非对称加密,顾名思义,是相对于对称加密的一种加密方法,对称加密是指加密与解密使用的是同一把秘钥,而非对称加密有两把不同的秘钥,一个称之为公钥,另一个称之为私钥,使用公钥加密,私钥可以解密。或者使用私钥加密,公钥可以解密。大多数情况下,公钥可以公开,但是私钥只能自行持有,不可泄露。
常用的非对称密码算法有RSA、ECC椭圆形加密这两种。
本文亦将用go语言具体实现RSA的加密解密,关于椭圆形曲线加密,将在我的另一篇博文中作详细介绍。
为什么需要非对称加密
非对称加密可以说是密码学史上最伟大的发明之一,因为它解决了对称加密的秘钥配送问题,举个例子,A和B进行通信,A使用秘钥为123456,那么B如何知道秘钥为123456进行解密呢,如果直接发送,很容易被黑客抓取到,除了私底下交换秘钥,似乎没有更好的方法了。
但是非对称加密的出现解决了这一弊端,举个例子,还是A和B进行通信,A要给B发送信息,B把自己的公钥发送给A,然后A使用B的公钥对信息进行加密 发送给B,由于此信息使用的B的公钥进行加密,所以只有使用B的私钥才能解密,因此即使黑客知道B的公钥,也是没有任何办法的。
应用场景
信息加密,登陆认证,数字签名,数字证书等等,如今红极一时的区块链技术也是使用了非对称加密,还有包括网银U盾、二代居民身份证本质上也是使用了非对称加密。
关于数字签名将在我的另一篇博文中作详细介绍。
RSA加密解密流程一览
生成私钥流程
使用rsa中的GenerateKey方法生成私钥
func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)
- rand.Reader ->随机数生成器
- bits ->建议1024的整数倍
通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte
将私钥字符串设置到pem格式块中
初始化一个pem.Block块
type Block struct { Type string // 得自前言的类型(如"RSA PRIVATE KEY") Headers map[string]string // 可选的头项 Bytes []byte // 内容解码后的数据,一般是DER编码的ASN.1结构 }
通过pem将设置好的数据进行编码, 并写入磁盘文件中
func Encode(out io.Writer, b *Block) error
- out - 准备一个文件指针
- block- 将准备好的pem.block放入其中
生成公钥流程
从得到的私钥对象中将公钥信息取出
type PrivateKey struct { PublicKey // 公钥 D *big.Int // 私有的指数 Primes []*big.Int // N的素因子,至少有两个 // 包含预先计算好的值,可在某些情况下加速私钥的操作 Precomputed PrecomputedValues }
通过x509标准将得到 的rsa公钥序列化为字符串
func MarshalPKIXPublicKey(pub interface{ }) ([]byte,