2017-02-14 22 views
1

Итак, что мне нужно, это следующее:RSA Шифрование и дешифрование с X509Certificate2

  1. Создать certifiactes для развития, получить один для клиента и один для сервера
  2. Получить пароль через API, закодированный от клиента и расшифровать его на сервере

Теперь мне удалось создать сертификаты после this link. Девочка дала пошаговые инструкции о том, как получить самоподписанные сертификаты, поместить их в магазин и т. Д. Теперь у меня возникла проблема с:

Мне удалось зашифровать мои данные, используя эту код:

public static string Encrypt(string stringForEncription, string PathToPrivateKey) 
    { 
     X509Certificate2 myCertificate; 
     try 
     { 
      myCertificate = new X509Certificate2(PathToPrivateKey, "Test123"); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to open key file."); 
     } 

     RSACryptoServiceProvider rsaObj; 
     if (myCertificate.HasPrivateKey) 
     { 
      rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 
     } 
     else 
      throw new CryptographicException("Private key not contained within certificate."); 

     if (rsaObj == null) 
      return String.Empty; 

     byte[] decryptedBytes; 
     byte[] array = Encoding.UTF8.GetBytes(stringForEncription); 
     try 
     { 
      decryptedBytes = rsaObj.Encrypt(array, false); 
      //decryptedBytes = rsaObj.Encrypt(Convert.FromBase64String(Base64EncryptedData), false); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to encrypt data."); 
     } 

     // Check to make sure we decrpyted the string 
     if (decryptedBytes.Length == 0) 
      return String.Empty; 
     else 
      return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    } 

Для переменного ключа PathToPrivate Я использую путь к моему клиенту ClientCert.pfx. Я не знаю, если я должен использовать любой другой, но вот оснастки папки со всеми сертификатами, которые я сделал:

enter image description here

Теперь, для расшифровки, я использую следующий код:

public static string DecryptEncryptedData(string Base64EncryptedData, string PathToPrivateKey) 
    { 
     X509Certificate2 myCertificate; 
     try 
     { 
      myCertificate = new X509Certificate2(PathToPrivateKey, "Test123"); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to open key file."); 
     } 

     RSACryptoServiceProvider rsaObj; 
     if (myCertificate.HasPrivateKey) 
     { 
      rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 
     } 
     else 
      throw new CryptographicException("Private key not contained within certificate."); 

     if (rsaObj == null) 
      return String.Empty; 

     byte[] decryptedBytes; 
     try 
     { 
      decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData), false); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to decrypt data."); 
     } 

     // Check to make sure we decrpyted the string 
     if (decryptedBytes.Length == 0) 
      return String.Empty; 
     else 
      return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    } 

И все, что я пытаюсь сделать, это дает мне исключение:

{"The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. "} 

бы действительно apreciate кто-то помогает мне.

+0

@KayLee Пробовал, что не работает, сертификаты в порядке, ключи есть, я думаю, что проблема заключается в преобразовании в Base64String и из Base64String –

+0

Попробуйте протестировать DecryptEncryptedData («hello», string PathToPrivateKey); Возможно, такое же сообщение об исключении будет показано в моем опыте. Это означает, что аргумент неправильно отформатирован (неправильно зашифрован). Надеюсь, это дает некоторую подсказку. Я уверен, что все это касается формата в виде байта, base64string, decryptedplainstring. Проанализируйте примерный блог, как MSDN, и это не сложно. –

+0

Я вернусь завтра утром после просмотра моего кода. Вот поздняя ночь. –

ответ

0

Причина, по которой вы получаете ошибку, - это строка, которую вы пытаетесь присвоить Convert.FromBase64String из значения, которое на самом деле не является базой-64.

После шифрования данных вы должны преобразовать массив байтов в строку base-64. Используйте для этого Convert.ToBase64String.

return Convert.ToBase64String(decryptedBytes); 

Тогда ваша расшифровывать линия будет работать:

decryptedBytes = rsaObj.Decrypt (Convert.FromBase64String (Base64EncryptedData), ложь);

+0

Convert.ToBase64String (stringForEncription); возвращает строку, а не байт [], любые предложения? –

+0

Хорошо, получилось, что вы имели в виду, я вернулся Convert.ToBase64String (decryptedBytes); и после этого в методе decrtypt я получаю: {"Неверный параметр. \ r \ n"} –

+0

На какой строке вы получаете эту ошибку? – Zesty

0

Это не точный ответ, который вы могли бы ожидать, но я пишу здесь, поскольку он слишком длинный, как комментарий.

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

Я также пытался понять безопасность в течение нескольких месяцев, и теперь я использую симметричные (AES) и асимметричные (RSA) вместе. Понимание действительно важно, и всем требуется время.

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

Ответ от Zesty является правильным только с точки зрения форматирования.Вам также необходимо понять форматирование. Нам нужно Convert.ToBase64String и Convert.FromBase64String в шифровании и расшифровке с байта на base64string и наоборот. Однако это base64string не просто как «привет», но «SABlAGwAbABvACAAVwBvAHIAbABkAA ==», как вы видите here

И я любезно рекомендую использовать полное решение (не половина один, такие как шифрование PHP) как этот blog так, что шифрование и дешифрование и все в гармонии.

И, как я уже сказал, вам необходимо подумать о том, как предотвратить использование черных пользователей, если шифрование выполняется с клиентской стороны, и у вас нет только хороших пользователей.

Надеюсь, мой опыт помогает понять безопасность, которая имеет наибольшее значение.

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

  • Нет связанных вопросов^_^