软件注册码RSA签名实现Demo(C#)
本帖最后由 msmvc 于 2024-9-19 13:31 编辑说明:
共3部分
第1部分:RSA密钥
生成用于签名的私钥和公钥(2048位)
私钥用于生成签名,保存在软件开发者手中,如果泄露就可能随便生成注册码了
公钥用于验证签名,保存在软件中
第2部分:生成签名
一般软件注册时需要提供一些注册信息,如邮件,软件版本,有效期,机器码(机器码是为了绑定机器,使注册码只在当前机器上有效)等信息
注册信息+私钥生成签名也就是注册码(SIGN:后面的内容才是生成的签名)
第3部分:验证签名
使用公钥可以把签名还原,得到注册信息,一般验证注册信息中的机器码和本机机器码是否相同,有效期是否失效
以上代码使用FX4.8 +C# 实现
--2014/09/19更新------------------------------
在 RSA 加解密 中,可以根据具体的应用场景分别使用公钥加密,私钥解密,或私钥加密,公钥解密。
这两种方式有不同的目的和用途:
1. 公钥加密,私钥解密:用于数据加密这种方式用于加密敏感数据,确保只有拥有私钥的人可以解密。这个过程的安全性依赖于私钥的保密性。
[*]加密方:使用接收方的公钥加密数据。
[*]解密方:只有接收方的私钥可以解密。
应用场景:
[*]机密数据的传输,例如发送加密信息,确保只有特定的接收者能够解密阅读。
工作原理:
[*]发送者使用接收者的公钥加密数据,任何人都可以获取这个公钥进行加密。
[*]接收者使用自己的私钥解密数据,确保只有合法接收方可以读取信息。
// 公钥加密,私钥解密
public static string EncryptWithPublicKey(string plainText, RSAParameters publicKey)
{
byte[] data = Encoding.UTF8.GetBytes(plainText);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(publicKey);
byte[] encryptedData = rsa.Encrypt(data, false);
return Convert.ToBase64String(encryptedData);
}
}
public static string DecryptWithPrivateKey(string encryptedText, RSAParameters privateKey)
{
byte[] data = Convert.FromBase64String(encryptedText);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(privateKey);
byte[] decryptedData = rsa.Decrypt(data, false);
return Encoding.UTF8.GetString(decryptedData);
}
}
2. 私钥加密,公钥解密(验证):用于数字签名
这种方式用于创建数字签名,验证数据的真实性和完整性。它并不用于加密保密数据,而是用于签名验证,确保数据没有被篡改,并确认发送者的身份。
[*]加密方(签名方):使用自己的私钥对数据进行加密,生成数字签名。
[*]解密方(验证方):使用发送者的公钥解密并验证签名,确保数据未被篡改。
应用场景:
[*]生成数字签名,验证发送者的身份和数据的完整性,广泛应用于数字证书、软件分发等场景。
工作原理:
[*]发送者使用自己的私钥生成签名(加密哈希值)。
[*]接收者使用发送者的公钥验证签名,确认数据的真实性和发送者身份。
// 私钥加密(签名),公钥解密(验证)
public static string SignData(string data, RSAParameters privateKey)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(privateKey);
byte[] signature = rsa.SignData(dataBytes, new SHA256CryptoServiceProvider());
return Convert.ToBase64String(signature);
}
}
public static bool VerifySignature(string data, string signature, RSAParameters publicKey)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
byte[] signatureBytes = Convert.FromBase64String(signature);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(publicKey);
return rsa.VerifyData(dataBytes, new SHA256CryptoServiceProvider(), signatureBytes);
}
}
源码呢?现在这样是违规的 放错区域了。看你不知道我才告诉你的 wyl0205 发表于 2024-9-18 19:02
源码呢?现在这样是违规的
忘放了,明天放上来 Say 发表于 2024-9-18 19:37
放错区域了。看你不知道我才告诉你的
应该放在哪个版块? 好东东,期待放上来 感谢楼主分享 收藏了 签名这种不参与计算的,可能会被人爆菊
建议还是留一两个参数是解密出来的比较好 感谢楼主分享 收藏 有源码看看了。现在学习阶段