2017-02-11 3 views
0

Я написал 3 функции на C++, используя Crypto ++ для генерации пар ключей, шифрования и расшифровки строки. Crypto++ side:Расшифровка Crypto ++ RSA шифрованный текст в C# вызывает исключение

//Decode public key 
RSA::PublicKey pbKeyDecoded; 
StringSource ss2(publicKey, true, new Base64Decoder); 
pbKeyDecoded.BERDecode(ss2); 

Integer m = Integer((const byte*)plaintext.data(), plaintext.size()); 
Integer crypted = pbKeyDecoded.ApplyFunction(m); 
... 

Что я делаю, генерировать ключ, DER закодировать его, а затем кодировать его в Base64. После этого я шифрую открытый текст через открытый ключ и сохраняю как закрытый ключ, так и шифр как закодированные в base64 строки в двух отдельных файлах.

Теперь на C#. Я читаю строку base64, расшифровывая их и загружаю их через AsnParser, которые, похоже, загружаются просто отлично. Затем я звоню Decrypt. C# side:

AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der"); 
RSAParameters publicKey = keyParser.ParseRSAPublicKey(); 

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

RSACryptoServiceProvider rsp = new RSACryptoServiceProvider(csp); 
rsp.PersistKeyInCsp = false; 
rsp.ImportParameters(privateKey); 

//Causes exception here.. 
var data = rsp.Decrypt(cipherArr, true); 
... 

Но я получаю ошибку исключения при попытке расшифровать его с fOAEP = true: Произошла ошибка при декодировании OAEP отступов: CryptographicException. Если я пройду fOAEP = false, тогда я получаю CryptographicException: этот параметр неверен.

Почему я получаю исключение в C# при попытке расшифровать шифрованный текст Crypto ++?

+1

Пожалуйста, разместите свой код в вопросе вместо ссылки на pastebin, иначе ваш вопрос скорее всего будет закрыт. Кроме того, если вы не можете сделать MCVE (http://stackoverflow.com/help/mcve), то удалите все ненужные коды перед публикацией здесь. –

ответ

1

... Я получаю ошибку исключения, когда пытаюсь ее расшифровать: CryptographicException: Ошибка при декодировании OAEP. Это если я передаю true для fOAEP bool, если я передаю false, я получаю CryptographicException: параметр неверен.

Вы с той же проблемой, как и Encrypt and Decrypt a message using raw RSA algorithim in Crypto++?How to sync Crypto++ RSA with C# RSA crypto service provider? Он должен быть нашим месяцем для схем «Raw RSA» ...

На Криптовальной ++ стороне уравнения, you are performing raw RSA. Вы просто применяя вперед функцию, которая экспоненцирование, и вы не форматировать сообщение:

//Decode public key 
RSA::PublicKey pbKeyDecoded; 
StringSource ss2(publicKey, true, new Base64Decoder); 
pbKeyDecoded.BERDecode(ss2); 

Integer m = Integer((const byte*)plaintext.data(), plaintext.size()); 
Integer crypted = pbKeyDecoded.ApplyFunction(m); 
... 

На C# стороне вещей, you are performing RSA decryption с помощью PKCS # 1 или с PKCS # 1.5 пропиткой или OAEP обивка:

Его непонятно, если версия C# вашего кода может выполнять отладку OAEP, поскольку для нее требуется определенная версия CLR. У вас может быть только дополнение PKCS.


Я считаю, что у вас есть два варианта. Во-первых, вы можете использовать стандартный метод шифрования RSA в Crypto ++. Криптовальная ++ вики перечисляет их на RSA Cryptography и RSA Encryption Schemes:

typedef RSAES<PKCS1v15>::Decryptor RSAES_PKCS1v15_Decryptor; 
typedef RSAES<PKCS1v15>::Encryptor RSAES_PKCS1v15_Encryptor; 

typedef RSAES<OAEP<SHA> >::Decryptor RSAES_OAEP_SHA_Decryptor; 
typedef RSAES<OAEP<SHA> >::Encryptor RSAES_OAEP_SHA_Encryptor; 

Во-вторых, вам необходимо выполнить Raw RSA в C#. Для выполнения Raw RSA в C# вам нужно будет получить класс BigInteger и применить обратную функцию вручную.

Я бы посоветовал вам использовать RSA Encryption с дополнением OAEP. Если OAEP недоступен, то вторым вариантом будет заполнение PKCS. Наконец, если у вас есть Raw RSA, я бы поискал еще одну систему шифрования, потому что Raw RSA настолько небезопасен.

+0

Хорошо, теперь я чувствую себя глупо. Чтобы все исправить, я просто пошел на Crypto ++ и использовал, как вы сказали RSAES_OAEP_SHA_Encryptor & Decryptor, и теперь все работает отлично! – Kyojin

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