RSA加密解密及制作软件license

Posted 楚兴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RSA加密解密及制作软件license相关的知识,希望对你有一定的参考价值。

1 RSA算法

倘若在加解密信息的过程中,能让加密密钥(公钥)与解密密钥(私钥)不同,即:

  1. 甲要传密信给乙,乙先根据某种算法得出本次与甲通信的公钥与私钥;
  2. 乙将公钥传给甲(公钥可以让任何人知道,即使泄露也没有任何关系);
  3. 甲使用乙传给的公钥加密要发送的信息原文m,发送给乙密文c;
  4. 乙使用自己的私钥解密密文c,得到信息原文m。

就可以很好的克服对称加密算法的弱点,这种新的加密模式被称为“非对称加密算法”。可以观察到,从始至终,私钥一直都在信息接收方乙处,只要乙自己不泄露出去,私钥就没有泄露的可能。

1977年,三位数学家Rivest、Shamir和Adleman设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字首字母命名,叫做RSA算法,RSA算法非常可靠,密钥越长,它就越难破解。

2 生成公钥私钥

openssl生成私钥

openssl genrsa -out rsa_private_key.pem 1024

openssl生成公钥

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

3 Go实现公钥加密私钥解密

// 公钥加密
func RsaEncrypt(publicKey, originData []byte) ([]byte, error) 
	block, _ := pem.Decode(publicKey)
	if block == nil 
		return nil, errors.New("public key error")
	

	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil 
		return nil, err
	

	pub := pubInterface.(*rsa.PublicKey)
	return rsa.EncryptPKCS1v15(rand.Reader, pub, originData)


// 私钥解密
func RsaDecrypt(privateKey, cipherData []byte) ([]byte, error) 
	block, _ := pem.Decode(privateKey)
	if block == nil 
		return nil, errors.New("private key error")
	

	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil 
		return nil, err
	

	return rsa.DecryptPKCS1v15(rand.Reader, priv, cipherData)

4 Go制作license(私钥签名公钥验证)

如果需要为软件制作一个license,那么公钥加密私钥解密还无法达到目的。而Go官方API不支持私钥加密公钥解密,因此可以采用私钥签名公钥验证的方案。具体步骤如下:

  1. 确定要签名的信息。如授权开始时间、授权结束时间、软件版本等信息。
  2. 生成签名。对要签名的信息计算hash,然后使用私钥对hash结果制作签名。
  3. 生成license。license内容由被签名信息和签名两部分组成。
  4. 验证license。使用公钥验证签名,验证通过则说明被签名信息没有被篡改。签名验证通过后再比对其他信息,例如当前时间是否在授权时间范围内等。
//私钥签名
func RsaSign(privateKey, data []byte) ([]byte, error) 
	h := sha256.New()
	h.Write(data)
	hashed := h.Sum(nil)

	block, _ := pem.Decode(privateKey)
	if block == nil 
		return nil, errors.New("private key error")
	

	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil 
		return nil, err
	
	return rsa.SignPKCS1v15(rand.Reader, priv, crypto.SHA256, hashed)


//公钥验证
func RsaSignVer(publicKey, data, signature []byte) error 
	hashed := sha256.Sum256(data)
	block, _ := pem.Decode(publicKey)
	if block == nil 
		return errors.New("public key error")
	

	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil 
		return err
	
	// 类型断言
	pub := pubInterface.(*rsa.PublicKey)
	//验证签名
	return rsa.VerifyPKCS1v15(pub, crypto.SHA256, hashed[:], signature)

以上是关于RSA加密解密及制作软件license的主要内容,如果未能解决你的问题,请参考以下文章

企业内部即时通讯软件哪个最好用呢?

有多少个素数(可用于 RSA 加密)?

微信上线“密信”新功能:聊天可以加密了?

APP自动登录加密流程

RSA加密解密及RSA签名和验证

RSA加密解密及RSA加签验签