2017-02-11 3 views
1

У меня есть DER закодированная RSA-клавиатура, созданная в Crypto ++, а также шифр. Это строка Base64Encoded. Я сначала декодирую данные из Base64 в массив байтов, но я не уверен, как их загрузить в RSACryptoServiceProvider.Загрузить ASN.1/DER закодированную пару ключей RSA в C#

static void Main() 
{ 
    string pbkeystr = "mypublickey"; 
    string pvkeystr = "myprivatekey"; 
    string cipherstr = "mycipher"; 

    byte[] pbkey = Convert.FromBase64String(pbkeystr); 
    byte[] pvkey = Convert.FromBase64String(pvkeystr); 
    byte[] cipher = Convert.FromBase64String(cipherstr); 

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

    //Set keys here.. 

    //Decrypt the cipher using private key 
    rsa.Decrypt(pvkey, false); 
} 

Нет функций для установки ключей. Единственное, что я нашел, это метод ImportParameters, который принимает класс RSAParameters, который состоит из p, q, n, модуля, экспонента и т. Д. У меня нет доступа к ним.

Есть ли способ загрузить ключи в виде строки? Как загрузить ключ в RSACryptoServiceProvider?

+1

Что находится внутри строки в кодировке Base64? Ключ DER/PEM ASN.1 или что-то еще? – yaakov

+0

Это DER от Crypto ++ – Kyojin

ответ

1

Есть ли способ загрузить ключи в виде строки? Как загрузить ключ в RSACryptoServiceProvider?

От другого вопроса Crypto ++, How to load Base64 RSA keys in Crypto++, похоже, у вас есть только государственные и частные ключи, потому что вы использовали DEREncode и BERDecode. То есть у вас есть параметры RSA, а не информация о публичном ключе и информация о закрытом ключе. Ваши ключи не имеют идентификаторов OID и номеров версий. Все в порядке.

От Cryptographic Interoperability: Keys от проекта кода вам понадобится класс C#, который анализирует ASN.1/DER после того, как вы его декодируете Base64. Статья CodeProject предоставляет класс C# с именем AsnKeyParser для чтения ASN.1/DER и возвращает RSAParameters для загрузки в CSP.

Код для класса AsnKeyParser составляет около 800 строк, и есть пять других поддерживающих файлов, чтобы все это происходило, поэтому его не очень удобно размещать здесь. Вы должны скачать его сами. Интересующий файл называется CSInteropKeys.zip.

Как только вы подключаетесь к классу AsnKeyParser, для открытого ключа RSA это будет так же просто, как указано ниже. Закрытый ключ будет аналогичным, и код будет указан на сайте CodeProject.

// Your ASN.1/DER parser class 
AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der"); 
RSAParameters publicKey = keyParser.ParseRSAPublicKey(); 

// .Net class 
CspParameters csp = new CspParameters; 
csp.KeyContainerName = "RSA Test (OK to Delete)";  
csp.ProviderType = PROV_RSA_FULL; // 1 
csp.KeyNumber = AT_KEYEXCHANGE;  // 1 

// .Net class 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 
rsa.PersistKeyInCsp = false; 
rsa.ImportParameters(publicKey); 

Ссылка на файлы на другом сайте неодобрительно, но я не знаю, как предоставить информацию в противном случае. В ответе есть слишком много исходного кода.


Для полноты .Net делает не делают Interop легко. Они не принимают ASN.1/DER или PEM. Скорее, .Net принимает XML-представление ключей. Я считаю, вы можете найти его в RFC 3275, XML-Signature Syntax and Processing. Microsoft does not state that for you. Я как-то собрал его, когда написал статью Code Project.

Может быть, мы должны добавить класс в Crypto ++ для сглаживания XML в дополнение к ASN.1/DER и PEM.

+0

Хорошо, что я сделал, я прочитал строку Base64 и преобразовал ее в байтовые данные (преобразован из Base64 обратно в исходные DEREncoded байты). Написал его в файл под названием «rsa-private.der» и передал его в AsnKeyParser, как в вашем примере, но я получаю исключение: CryptographicException: параметр был недействителен. http://pastebin.com/hLwErEfp Что я сделал неправильно? – Kyojin

+0

@Kyojin - Из ваших заметок в PasteBin, похоже, что исключение происходит в 'var data = rsp.Decrypt (cipherArr, false)'. Это верно? Если это так, я считаю, что это означает, что закрытый ключ загружен, как ожидалось. Я предполагаю, что проблема заключается либо в 'csp.KeyNumber = AT_KEYEXCHANGE', либо в его дополнении RSA. Возможно, вы можете попробовать ['Decrypt Method (Byte [], RSAEncryptionPadding)'] (https://msdn.microsoft.com/en-us/library/mt132683 (v = vs.110) .aspx). Если это больше, чем заполнение, то вам, вероятно, следует задать новый вопрос. Stack Overflow любит держать вопросы и ответы узкими по охвату. – jww

+0

Да, я сделал rsa.ToXmlString() и проверил, и все правильно, и так же, как строка base64 в файле. Так почему он не расшифровал шифр? Думаю, теперь оффтоп. – Kyojin

Смежные вопросы