赞
踩
非对称加密算法需要两个密钥:公开密钥(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;
}
}
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);
}
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; }
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);
}
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));
}
既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;
同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。
签名过程:发送者S同样也生成了一对秘钥,事先将公钥给到R,在发送消息之前,先用R给的公钥对报文加密,然后签名使用S自己私钥来签名,最后将加密的消息和签名一起发过去给R,接受者R在接收到发送者S发送的数据后,首先使用S的公钥对签名信息进行验签,确认身份信息,如果确认是发送者S,然后再R才利用私钥对加密消息进行解密,从而隔离非法数据包的接收。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。