本帖最后由 msmvc 于 2024-9-19 13:31 编辑
说明:
共3部分
第1部分:RSA密钥
生成用于签名的私钥和公钥(2048位)
私钥用于生成签名,保存在软件开发者手中,如果泄露就可能随便生成注册码了
公钥用于验证签名,保存在软件中
第2部分:生成签名
一般软件注册时需要提供一些注册信息,如邮件,软件版本,有效期,机器码(机器码是为了绑定机器,使注册码只在当前机器上有效)等信息
注册信息+私钥生成签名也就是注册码(SIGN:后面的内容才是生成的签名)
第3部分:验证签名
使用公钥可以把签名还原,得到注册信息,一般验证注册信息中的机器码和本机机器码是否相同,有效期是否失效
以上代码使用FX4.8 + C# 实现
SoftwareLicenseDemo.zip
(28.29 KB, 下载次数: 54)
--2014/09/19更新------------------------------
在 RSA 加解密 中,可以根据具体的应用场景分别使用公钥加密,私钥解密,或私钥加密,公钥解密。
这两种方式有不同的目的和用途:
1. 公钥加密,私钥解密:用于数据加密这种方式用于加密敏感数据,确保只有拥有私钥的人可以解密。这个过程的安全性依赖于私钥的保密性。- 加密方:使用接收方的公钥加密数据。
- 解密方:只有接收方的私钥可以解密。
应用场景:- 机密数据的传输,例如发送加密信息,确保只有特定的接收者能够解密阅读。
工作原理:- 发送者使用接收者的公钥加密数据,任何人都可以获取这个公钥进行加密。
- 接收者使用自己的私钥解密数据,确保只有合法接收方可以读取信息。
[C#] 纯文本查看 复制代码 // 公钥加密,私钥解密
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. 私钥加密,公钥解密(验证):用于数字签名
这种方式用于创建数字签名,验证数据的真实性和完整性。它并不用于加密保密数据,而是用于签名验证,确保数据没有被篡改,并确认发送者的身份。- 加密方(签名方):使用自己的私钥对数据进行加密,生成数字签名。
- 解密方(验证方):使用发送者的公钥解密并验证签名,确保数据未被篡改。
应用场景:- 生成数字签名,验证发送者的身份和数据的完整性,广泛应用于数字证书、软件分发等场景。
工作原理:- 发送者使用自己的私钥生成签名(加密哈希值)。
- 接收者使用发送者的公钥验证签名,确认数据的真实性和发送者身份。
[C#] 纯文本查看 复制代码 // 私钥加密(签名),公钥解密(验证)
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);
}
}
|