当前位置:   article > 正文

RSA非对称加密方式,公钥加密私钥解密,私钥签名公钥认证_ras 私钥加密,公钥解密

ras 私钥加密,公钥解密

什么是非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;
公钥给

非对称加密的优缺点

非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
  非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

适用场景

软件注册
机器码

注册码

流程: 用户把机器码告诉给软件服务方,软件服务方生成注册码后告知用户。

代码

生成一对公钥私钥

private void GenerateKey()
{
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        // 公钥 
        string pubkey = rsa.ToXmlString(false);
        this.txtPublicKey.Text = pubkey;
        // 私钥 
        string prikey = rsa.ToXmlString(true);
        this.txtPrivateKey.Text = prikey;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

RSA私钥签名,机器码生成注册码

		using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
		{ 
			rsa.FromXmlString(this.PrivateKey); //私钥签名
		
			RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa); 
			f.SetHashAlgorithm("SHA1");
            string machineCode = GetMachineCode();

			byte[] source = ASCIIEncoding.ASCII.GetBytes(machineCode); 
			SHA1Managed sha = new SHA1Managed(); 
			byte[] result = sha.ComputeHash(source); 
			byte[] b = f.CreateSignature(result);  
			this.txtRegisterCode.Text = Convert.ToBase64String(b); 
		} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

RSA公钥验证,根据公钥,机器码,注册码 验证是否一致?

public static bool Validate(string publicKey, string originalString, string encrytedString)
{
	bool bPassed = false;
	using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
	{ 
		try
		{
			rsa.FromXmlString(publicKey); //公钥验证
			RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa);  
			f.SetHashAlgorithm("SHA1");  
			byte[] key = Convert.FromBase64String(encrytedString); //验证
			SHA1Managed sha = new SHA1Managed(); 
			byte[] name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(originalString)); 
			if(f.VerifySignature(name,key))
			{
				bPassed = true;
			}
		}
		catch
		{ }
	} 
	return bPassed;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

RSA公钥加密

 using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                byte[] cipherbytes;
                rsa.FromXmlString(PublicKey);
                cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(txtMachineCode.Text), false);

                textBox1.Text = Convert.ToBase64String(cipherbytes);
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

RSA私钥解密

 using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {

                rsa.FromXmlString(this.PrivateKey);

                byte[] cipherbytes;

                cipherbytes = rsa.Decrypt(Convert.FromBase64String(textBox1.Text), false);

                Console.WriteLine(Encoding.UTF8.GetString(cipherbytes));
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;

同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

签名过程:发送者S同样也生成了一对秘钥,事先将公钥给到R,在发送消息之前,先用R给的公钥对报文加密,然后签名使用S自己私钥来签名,最后将加密的消息和签名一起发过去给R,接受者R在接收到发送者S发送的数据后,首先使用S的公钥对签名信息进行验签,确认身份信息,如果确认是发送者S,然后再R才利用私钥对加密消息进行解密,从而隔离非法数据包的接收。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/446956
推荐阅读
相关标签
  

闽ICP备14008679号