如何在不更改 C# 中的密钥的情况下将 RSAParameters 密钥导入和导出到文件
How import and export RSAParameters keys to file without making a change to the keys in C#
我正在使用 C#
编写数字签名程序,我使用 RSACryptoServiceProvider
class 生成 public 以及根据文件生成的私钥和签名。如果在程序中,我使用 public 密钥、签名和文件检查签名,它工作正常,但如果我将我的密钥保存为文件中的任何格式,换句话说,我将更改它们的格式和 return到第一个状态是不行的。因为我不能把它正确地变成 RSAParameters
。请指导我?
显示更改的简单示例测试:
var publicParams = rsaWrite.ExportParameters(false); // Generate the public key.
var testpublicParams = publicParams;
string st = Encoding.ASCII.GetString(publicParams.Modulus);
testpublicParams.Modulus = Encoding.ASCII.GetBytes(st);
if(publicParams.Modulus != testpublicParams.Modulus) {
Console.WriteLine("The key has been changed.");
}
这段代码有两个问题:
- 使用
Encoding.ASCII.GetBytes
是错误的,因为它可能有一个非ASCII字符,所以我们使用Convert.ToBase64String
。
publicParams.Modulus
是 C# 字节数组所以 !=
可能不是正确的答案所以我们使用 SequenceEqual
.
并且密钥不会改变。
var rsaWrite = new RSACryptoServiceProvider();
var publicParams = rsaWrite.ExportParameters(false); // Generate the public key.
var testpublicParams = publicParams;
string st = Convert.ToBase64String(publicParams.Modulus);
testpublicParams.Modulus = Convert.FromBase64String(st);
if (!publicParams.Modulus.SequenceEqual(testpublicParams.Modulus))
{
Console.WriteLine("The key has been changed.");
}
else
{
Console.WriteLine("The key has not been changed. :D");
}
您可以获取字符串格式的公钥并将其保存在另一个文本文件中。
public static string PublicKey(string certSubject)
{
var my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
my.Open(OpenFlags.ReadOnly);
RSACryptoServiceProvider csp = null;
byte[] publicKeyByte = null;
foreach (var cert in my.Certificates)
{
if (cert.Subject.Contains(certSubject))
{
csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
publicKeyByte = cert.PublicKey.EncodedKeyValue.RawData;
}
}
if (csp == null)
{
throw new Exception("No valid cert was found");
}
var publicKey = new StringBuilder();
publicKey.AppendLine("-----BEGIN PUBLIC KEY-----");
publicKey.AppendLine(Convert.ToBase64String(publicKeyByte, Base64FormattingOptions.InsertLineBreaks));
publicKey.AppendLine("-----END PUBLIC KEY-----");
return publicKey.ToString();
}
我正在使用 C#
编写数字签名程序,我使用 RSACryptoServiceProvider
class 生成 public 以及根据文件生成的私钥和签名。如果在程序中,我使用 public 密钥、签名和文件检查签名,它工作正常,但如果我将我的密钥保存为文件中的任何格式,换句话说,我将更改它们的格式和 return到第一个状态是不行的。因为我不能把它正确地变成 RSAParameters
。请指导我?
显示更改的简单示例测试:
var publicParams = rsaWrite.ExportParameters(false); // Generate the public key.
var testpublicParams = publicParams;
string st = Encoding.ASCII.GetString(publicParams.Modulus);
testpublicParams.Modulus = Encoding.ASCII.GetBytes(st);
if(publicParams.Modulus != testpublicParams.Modulus) {
Console.WriteLine("The key has been changed.");
}
这段代码有两个问题:
- 使用
Encoding.ASCII.GetBytes
是错误的,因为它可能有一个非ASCII字符,所以我们使用Convert.ToBase64String
。 publicParams.Modulus
是 C# 字节数组所以!=
可能不是正确的答案所以我们使用SequenceEqual
.
并且密钥不会改变。
var rsaWrite = new RSACryptoServiceProvider();
var publicParams = rsaWrite.ExportParameters(false); // Generate the public key.
var testpublicParams = publicParams;
string st = Convert.ToBase64String(publicParams.Modulus);
testpublicParams.Modulus = Convert.FromBase64String(st);
if (!publicParams.Modulus.SequenceEqual(testpublicParams.Modulus))
{
Console.WriteLine("The key has been changed.");
}
else
{
Console.WriteLine("The key has not been changed. :D");
}
您可以获取字符串格式的公钥并将其保存在另一个文本文件中。
public static string PublicKey(string certSubject)
{
var my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
my.Open(OpenFlags.ReadOnly);
RSACryptoServiceProvider csp = null;
byte[] publicKeyByte = null;
foreach (var cert in my.Certificates)
{
if (cert.Subject.Contains(certSubject))
{
csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
publicKeyByte = cert.PublicKey.EncodedKeyValue.RawData;
}
}
if (csp == null)
{
throw new Exception("No valid cert was found");
}
var publicKey = new StringBuilder();
publicKey.AppendLine("-----BEGIN PUBLIC KEY-----");
publicKey.AppendLine(Convert.ToBase64String(publicKeyByte, Base64FormattingOptions.InsertLineBreaks));
publicKey.AppendLine("-----END PUBLIC KEY-----");
return publicKey.ToString();
}