一.简单了解下RSA非对称加密
RSA是一种广泛使用的非对称加密算法,用于加密和签名数据。在RSA中,有两种常见的格式:PKCS#1和PKCS#8。
PKCS#1是一种RSA密钥的标准格式,PKCS#8是一种更通用的密钥格式,它可以用来表示RSA、DSA、DHP、ElGamal和其他非对称密钥。
二.代码
1.生成PEM密钥对
// 创建RSA密钥对生成器
RsaKeyPairGenerator generator = new RsaKeyPairGenerator();
generator.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
AsymmetricCipherKeyPair keyPair = generator.GenerateKeyPair();
// 生成PKCS1格式的私钥
using (var textWriter = new StringWriter())
{
var pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(keyPair.Private);
pemWriter.Writer.Flush();
string pkcs1PrivateKey = textWriter.ToString();
Console.WriteLine("PKCS#1 Private Key: \n{0}", pkcs1PrivateKey);
}
// 生成PKCS8格式的私钥
using (var textWriter = new StringWriter())
{
Pkcs8Generator pkcs8 = new Pkcs8Generator(keyPair.Private);
var pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(pkcs8.Generate());
pemWriter.Writer.Flush();
string pkcs8PrivateKey = textWriter.ToString();
Console.WriteLine("PKCS#8 Private Key: \n{0}", pkcs8PrivateKey);
}
// 生成PKCS1格式的公钥
using (var textWriter = new StringWriter())
{
var pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(keyPair.Public);
pemWriter.Writer.Flush();
string pkcs1PublicKey = textWriter.ToString();
Console.WriteLine("Public Key: \n{0}", pkcs1PublicKey);
}
利用BouncyCastle库生成PE密钥对,注意这里的PemWriter用此Org.BouncyCastle.OpenSsl.PemWriter命名空间,对WriterObject封装的重载。
2.用私钥加密数据:
var rsa = new RSACryptoServiceProvider();
try
{
rsa.ImportFromPem(PrivateKey);
}
catch (ArgumentException ex)
{
MessageBox.Show("私钥错误!");
return;
}
byte[] data = ne byte[]
{
xx
}; ...//写入需加密的数据
var dataLen = data.Length;
var dataLenByte = new byte[] { (byte)(dataLen >> 8), (byte)dataLen };
var dataSigned = rsa.SignData(data, new SHA512CryptoServiceProvider());
var dataCombined = new byte[dataLenByte.Length + data.Length + dataSigned.Length];
dataLenByte.CopyTo(dataCombined, 0);
data.CopyTo(dataCombined, dataLenByte.Length);
dataSigned.CopyTo(dataCombined, dataLenByte.Length + data.Length);
//签名
var dataSigned = rsa.SignData(data, new SHA512CryptoServiceProvider());
var license = Convert.ToBase64String(data);//转成加密字符码
3.用公钥钥解密数据
var rsa = new RSACryptoServiceProvider();
try
{
rsa.ImportFromPem(PublicKey);
}
catch (ArgumentException)
{
MessageBox.Show("公钥错误!");
return;
}
byte[] licenseDecode;
try
{
licenseDecode = Convert.FromBase64String(License);
}
catch (Exception e)
{
MessageBox.Show("激活码错误!");
return;
}
// 头两个字节是授权信息的长度
var dataLen = (licenseDecode[0] << 8) + licenseDecode[1];
// 授权信息
var data = licenseDecode[2..(dataLen + 2)];
// 授权信息的签名
var dataSigned = licenseDecode[(dataLen + 2)..];
// 验证签名与原始信息是否匹配
//这里的字节流结构与上文私钥加密相匹配
if (!rsa.VerifyData(data, new SHA512CryptoServiceProvider(),dataSigned))
{
MessageBox.Show("激活码错误!请检查激活码后重试");
return;
}
//根据业务对授权信息data再验证
.....
记录一下,防止后面再花时间找。
954

被折叠的 条评论
为什么被折叠?



