什么是非对称加密
非对称加密算法需要两个密钥:公开密钥(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;
}
}
机器码生成注册码
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);
}
根据公钥,原文,密文 验证是否一致?
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;
}
|