rsacryptoserviceprovider с использованием сертификатов x509 c # - PullRequest
7 голосов
/ 26 октября 2009

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

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

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

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); 

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

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

Ответы [ 4 ]

5 голосов
/ 04 октября 2010

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

Вот моя полная команда makecert, которая работает:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange
4 голосов
/ 26 октября 2009

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

        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?

2 голосов
/ 17 мая 2011

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

1 голос
/ 28 октября 2009

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

...