数字签名、证书,RSA加密、解密

本文介绍了数字签名和数字证书的概念,强调了它们在数据安全中的作用,防止公钥被伪造。详细阐述了证书链的原理,并探讨了如何在Go语言中实现RSA加密解密操作,包括公钥加密、私钥解密和签名验证。同时,文章提供了golang解析数字证书和PEM格式私钥的实例。
摘要由CSDN通过智能技术生成

一、相关知识扫盲篇

数字签名、数字证书

A与B的交互,通过一方的公私密钥,实现数据的加密,解密,验证数据签名,以保证其数据是对的。

但是存在比如B处存放的A的公钥被别人替换为如C的公钥可能性,这样C去发送信息给B,B会误以为是A发的,达到欺骗的效果
由此出现了,中心证书的CA(Certificate authority)机构,做中间人,把公钥持有人的信息,再用机构的私钥对A的信息进行加密。

B拿到数据,先用证书持有机构的公钥进行解密,证明是A的数据,然后再用A的公钥进行验签

引申:既然道格可以替换鲍勃的公钥,为什么不能故技重施,伪造CA的公钥,然后用自己的私钥伪造成CA的数字证书,从而达到欺骗苏珊的目的呢?

解释:CA的公钥是公开的,是可查的,他们的公钥在自己网站上提供下载,因此无法伪造

总结:公私钥用于加密、验证之间的数据,证书(中心媒介)用于证明其拿到的是正确的交互方的公钥。

防止证书伪造 之 证书链-Digital Certificates

文档地址,点击跳转

SHA256withRSA 先用RAS加密,在执行SHA256的哈希运算,主要用在签名验证操作

二、公私钥格式、协议规范

主要涉及的go包:

  • x509 x509包解析X.509(密码学里公钥证书的格式标准)编码的证书和密钥
  • pem包,pem包实现了PEM数据编码(源自保密增强邮件协议 Privacy Enbanced Mail)。目前PEM编码主要用于TLS密钥和证书
  • crypto/rsa rsa包实现了PKCS#1规定的RSA加密算法

三、golang RSA加密、解密具体实现

RSA加密、解密

  • RSA加密数据
  • 再配合 SHA256哈希 获得不可修改的签名signature

RSA公钥加密

// 公钥加密-分段

func RsaEncryptBlock(src, publicKeyByte []byte) (bytesEncrypt []byte, err error) {
   
    // 解码公钥文件,返回block结构
    // The encoded form is:
    //    -----BEGIN Type-----
    //    Headers
    //    base64-encoded Bytes
    //    -----END Type-----
	block, _ := pem.Decode(publicKeyByte)
	if block == nil {
   
		return nil, errors.New("Decode PublicKey Fail")
	}
	
	// 解析 PKIX 格式的公钥,返回 *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey 等格式的struct
	publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
   
		return nil, err
	}
	
	//根据自己具体使用的格式做推测
	pub, keySize :=  publicKey.(*rsa.PublicKey), publicKey.(*rsa.PublicKey).Size()
	srcSize := len(src)
	
    fmt.Println("密钥长度:", keySize, "\t明文长度:\t", srcSize)
	//单次加密的长度需要减掉padding的长度,PKCS1为11
	

    // 按需加密
	offSet, once := 0, keySize-11
	buffer := bytes.Buffer{
   }
	for offSet < srcSize {
   
		endIndex := offSet + once
		if endIndex > srcSize {
   
			endIndex = srcSize
		}
		// 加密一部分
		bytesOnce, err := rsa.EncryptPKCS1v15(myrand.Reader, pub, src[offSet:endIndex])
		if err != nil {
   
			return nil, err
		}
		buffer.Write(bytesOnce)
		offSet = endIndex
	}
	bytesEncrypt = buffer.Bytes()
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值