Ошибки шифрования / дешифрования сертификата на C # - PullRequest
1 голос
/ 08 июля 2011

Следующая команда используется для создания хранилища ключей с именем myalias.p12 и экспорта сертификата с именем myalias2.cer.

Java Keytool - это утилита управления ключами и сертификатами. Он позволяет пользователям управлять своими собственными парами открытого и закрытого ключей и сертификатами.

E:\>keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias myalias2 -keystore myalias.p12 -storetype pkcs12 -dname "cn=www.myalias.com, ou=myalias2, o=myalias2, l=tp, st=tp, c=tw" -storepass 123456 -keypass 123456

E:\>keytool -export -alias myalias2 -keystore myalias.p12 -storetype pkcs12 -rfc -file myalias2.cer -storepass 123456

Шифрование:

string input="hello";            
X509Certificate2 myCertificate = GetCertFromCerFile("e:\\myalias2.cer");
RSACryptoServiceProvider provider1 = (RSACryptoServiceProvider)myCertificate.PublicKey.Key;
byte[] buffer1 = Encoding.UTF8.GetBytes(input);
byte[] result = provider1.Encrypt(buffer1, false);
string data= Convert.ToBase64String(result); 

дешифрование:

44.  RSACryptoServiceProvider provider2 = (RSACryptoServiceProvider)myCertificate.PrivateKey;
45.  byte[] buffer2 = Convert.FromBase64String(data);
46.  byte[] result2 = provider2.Decrypt(buffer2, false); // <-- error here
47.  String decryptedMessage = Encoding.UTF8.GetString(result2);

Обычно он может выполнять операции шифрования. Но я обнаружил некоторые ошибки в строке 46 (при расшифровке):

Первое исключение типа 'System.NullReferenceException' произошло в CertTest.exe поток '' (0xcc8) вышел с кодом 0 (0x0). в CertTest.Program.Decrypt (Строковые данные) в D: \ vsworkspace \ CertTest \ CertTest \ Program.cs: линия 46 в CertTest.Program.Main (String [] args) в D: \ vsworkspace \ CertTest \ CertTest \ Program.cs: линия 29

У кого-нибудь есть идея? Потому что я не знаю, как решить эту проблему. Большое спасибо!

1 Ответ

0 голосов
/ 07 августа 2011

Исключение NullReferenceException, которое вы получаете, заключается в том, что PrivateKey имеет значение null.Это связано с тем, что файлы .cer содержат только один сертификат .X509, который включает в себя только открытый ключ.

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

Вы можете получить доступ к закрытому ключу, используя файл .p12 (или .pfx).Этот файл PKCS # 12 включает (как правило) как закрытый ключ (защищенный паролем), так и сертификаты.

Существует несколько конструкторов X509Certificate [2], которые примут пароль и автоматически расшифруют закрытый ключ.,После загрузки из файла .p12 ваш код получит действительный (не нулевой) экземпляр RSACryptoServiceProvider, и вы сможете расшифровать данные.

Кстати, вам не следует шифровать строку (или данные) таким способом, используяRSA :-) Для более подробной информации читайте http://pages.infinit.net/ctech/20031101-0151.html

...