我需要为客户生成一个新的许可证文件。该系统使用 RSA 密钥验证,其中公钥位于数据库中,并且有一个 license.lic 文件,其中包含域、到期日期等信息,最后一个字段是另一个密钥。
license file: 87b6fe89-c0b6-431d-96ad-449d055755eb#2020/11/08#True#True#True#True#True#True#True#True#True#True#False#True#True#True#True#True#http://sitesample.com,http://www.sitesample.com,http://localhost#SiIQ6U50tHrfuZD8yCTDq1VJ3teSYnCEDzdJ4RpsLOBMEUcvgn5WiphHFKwYDrKlGUfgnO2iyMRVf2pkFY0c0yuMklBfd31TGlEdZ1uMEFG+WTY42+K5UZzxEs8Y16sNSXKok5fRtF3WRAqckkT3Xkm893zJcr+vcXqdk6rK3r4=
DB row: <RSAKeyValue>Modulus>s0TTPk5n7yS+7gp7VDNZCOnAPYbb24sLGmIviZpayS5aCpxsPKR/R53gbNMII3vBUXyLXg4V99rPffvmTuJuAxw4OPFcGc4cF5w2wiPd7uSCkkjuY9wbyK8YeF4Ge18Zmsl/1ewFM5nVS95XYKQJNR5SY1PAyRVwIfrdtBWTqWk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
验证码是:
byte[] bytes = Encoding.ASCII.GetBytes(string.Concat(new string[]
{
values[0],
"#",
values[1],
"#",
values[2],
"#",
values[3],
"#",
values[4],
"#",
values[5],
"#",
values[6],
"#",
values[7],
"#",
values[8],
"#",
values[9],
"#",
values[10],
"#",
values[11],
"#",
values[12],
"#",
values[13],
"#",
values[14],
"#",
values[15],
"#",
values[16],
"#",
values[17],
"#",
values[18],
"#"
}));
SHA1Managed sHA1Managed = new SHA1Managed();
byte[] rgbHash = sHA1Managed.ComputeHash(bytes);
RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
rSACryptoServiceProvider.FromXmlString(registration.public_key);
byte[] rgbSignature = Convert.FromBase64String(values[19]);
bool flag = rSACryptoServiceProvider.VerifyHash(rgbHash, CryptoConfig.MapNameToOID("SHA1"), rgbSignature);
return flag;
此验证工作正常,但我需要在许可证文件中插入一个新域,因此我必须生成新密钥。
我不会更改验证代码,因为它是实时的,而且我只有 dll 文件(使用 ILSpy 获取此代码),所以对我来说最好的方法是创建一个新的许可证文件并在数据库中插入。
我下载了这些互联网样本并尝试使用生成的密钥,但验证总是返回 false,我认为我的代码中的 SHA1 可能是问题所在。
http://www.codeproject.com/Articles/10877/Public-Key-RSA-Encryption-in-C-NET 和 http://www.codeproject.com/Articles/38739/RSA-Private-Key-Encryption
有人可以帮我一把吗?
谢谢!