msmvc 发表于 2024-9-18 18:39

软件注册码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

放错区域了。看你不知道我才告诉你的

msmvc 发表于 2024-9-18 20:13

wyl0205 发表于 2024-9-18 19:02
源码呢?现在这样是违规的

忘放了,明天放上来

msmvc 发表于 2024-9-18 20:14

Say 发表于 2024-9-18 19:37
放错区域了。看你不知道我才告诉你的

应该放在哪个版块?

lml0126 发表于 2024-9-18 21:46

好东东,期待放上来

justwz 发表于 2024-9-18 21:48

感谢楼主分享 收藏了

艾莉希雅 发表于 2024-9-18 22:25

签名这种不参与计算的,可能会被人爆菊
建议还是留一两个参数是解密出来的比较好

zmingzhi 发表于 2024-9-18 22:40

感谢楼主分享 收藏

redapple2015 发表于 2024-9-19 08:33

有源码看看了。现在学习阶段
页: [1] 2 3
查看完整版本: 软件注册码RSA签名实现Demo(C#)