Как импортировать и экспортировать ключи RSAParameters в файл без внесения изменений в ключи в C # - PullRequest
0 голосов
/ 25 февраля 2019

Я пишу программу цифровой подписи, используя C#, и использую класс RSACryptoServiceProvider, который генерирует открытый и закрытый ключи и подписи в зависимости от файла.Если в программе я проверяю подпись с помощью открытого ключа, подписи и файла, она работает правильно, но если я сохраню свои ключи в любом формате в файле, другими словами, я изменю их формат и вернусь в первое состояние.не работаетпотому что я не могу превратить его в 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.");
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете получить PublicKey в виде строкового формата и сохранить его в другом текстовом файле.

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();
        }
0 голосов
/ 25 февраля 2019

В этом коде есть две проблемы: 1. Использование Encoding.ASCII.GetBytes неправильно, поскольку в нем могут быть символы, отличные от ASCII, поэтому мы используем Convert.ToBase64String.2. 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");
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...