2009-10-26 4 views
6

Я использую сертификат, сгенерированный makecert, который имеет как закрытый, так и открытый ключ. Эта часть Java использует этот открытый ключ для шифрования данных и .net расшифровывает его.rsacryptoserviceprovider с использованием сертификатов x509 C#

Я пытаюсь расшифровать зашифрованную в 64-битной кодированной строке Java и получить плохие данные.

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

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine); 
RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; 

if (cert.HasPrivateKey) 
    MessageBox.Show("Got private key"); 

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false); 
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

Даже здесь я получаю сообщение об ошибке. Я что-то упускаю?

Этот сертификат выглядит действительным как с открытым, так и с закрытым ключом.

+0

Какая ошибка? и на какой линии? –

+0

Исключение: Плохие данные .. Никакого внутреннего внутреннего исключения , когда byte [] decryptedBytes = поставщик.Decrypt (зашифрованный, ложный); называется – bkhanal

ответ

1

Я, наконец, нашел проблему. Я не ставил ключ в makecert, чтобы определить его как ключ RSA Crypto.

4

Следующий код работает для меня:

 RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider(); 
     privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>"); 
     RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 
     publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"); 

     { 
      string text = "foo"; 
      byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false); 
      byte[] decryptedBytes = privateKey.Decrypt(encrypted, false); 
     } 

Вы можете перепроверить, что экспортируемый закрытый ключ из cert.PrivateKey и открытый ключ от cert.PublicKey.Key?

+0

, когда сертификат возвращается обратно, он уже генерирует симметричный ключ aes. Я не использую реализацию, где мы должны делать Сначала создайте открытый секретный ключ и создайте на основе этого провайдера. Это использует makecert. Код, приведенный выше, не дает ошибки, но имеет 128 символьных модулей ... – bkhanal

+1

«Когда сертификат возвращается, он уже генерирует симметричный ключ aes». Я не совсем понимаю, что это значит. Где генерируется ключ AES? Я не вижу его нигде в вашем коде. –

+0

, если вы делаете сертификат с помощью инструмента makecert. у него есть частный и открытый ключ. Таким образом, вы можете пойти в магазин, чтобы получить закрытый публичный ключ. I не поместил его код, чтобы получить закрытый и открытый ключ – bkhanal

4

У меня была такая же проблема с самозаверяющим CERT, этот вопрос, что я генерации сертификата с помощью переключателя -sky signature вместо -sky exchange (использовать подпись для подписания и обмена для шифрования/дешифрования)

Здесь моя полная команда MakeCert, которая работает:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange 
2

Я наткнулся на этой странице, когда я пытался найти примеры использования makcert с x509 сертификатами и RSA с использованием C#, и, к сожалению, только при условии, части решения. Я поместил все биты в запись в блоге, которую могут заинтересовать люди, и ее можно найти здесь: http://nick-howard.blogspot.com/2011/05/makecert-x509-certificates-and-rsa.html

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