Intereting Posts
получение ошибки Предупреждение: mcrypt_decrypt (): параметр IV должен быть до тех пор, пока размер блока Переименование дубликатов строк в MySQL Красноречивое соединение / отсоединение / синхронизация срабатывает в любом случае? Yii: выполнять действия с использованием разной компоновки, чем макет контроллера PHP – условный оператор не работает должным образом Простой маршрут с картой Zend 1.12 Как написать хранимую процедуру в phpMyAdmin? Посмотрите, прослушивает ли сервер порт на PHP? array_intersect выдает ошибки, когда массивы имеют подматрицы Объект не уничтожается до конца скрипта, если он регистрирует spl_autoload_register (); Обнаружить «общий средний» цвет изображения Php посылает байты массива в веб-сокете Построение байтового массива в PHP с вариантами? Проблема при отправке нескольких изображений на сервер в android PHP GD не корректно отображает шрифты unicode

Дешифрование данных с помощью RSA Private Key

У меня есть программа, которая шифрует пароли, используя открытый ключ ac # rsa, который выводит массив байтов.

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

Я пытаюсь использовать http://phpseclib.sourceforge.net/, на который я был указан этот пост. Расшифровка RSA с использованием закрытого ключа . Документация по этому вопросу очень неопределенная, и я не знаю, какие данные / тип decrypt () следует принимать ,

<?php include('Crypt/RSA.php'); if (isset($_POST['Password'])) { $Password = $_POST['Password']; $crypttext = pack("H*",$Password); echo $cryptext; $rsa = new Crypt_RSA(); $rsa->loadKey('key.priv'); $decryptedText =$rsa->decrypt($cryptext); echo "Pass = >" . $decryptedText; } ?> 

Обратите внимание, что это не дает ошибок, но $decryptedText пуст.

EDIT: добавление дополнительной информации.

Это мой метод шифрования c #.

 public static string Encrypt(string data, string keyLocation, string keyName) { Console.WriteLine("-------------------------BEGIN Encrypt--------------------"); // Variables CspParameters cspParams = null; RSACryptoServiceProvider rsaProvider = null; string publicKeyText = ""; string result = ""; byte[] plainBytes = null; byte[] encryptedBytes = null; try { // Select target CSP cspParams = new CspParameters(); cspParams.ProviderType = 1; // PROV_RSA_FULL rsaProvider = new RSACryptoServiceProvider(2048, cspParams); // Read public key from Server WebClient client = new WebClient(); Stream stream = client.OpenRead(keyLocation + "/" + keyName); StreamReader reader = new StreamReader(stream); publicKeyText = reader.ReadToEnd(); // //Console.WriteLine("Key Text : {0}",publicKeyText); // Import public key rsaProvider.FromXmlString(publicKeyText); // Encrypt plain text plainBytes = Convert.FromBase64String(data); Console.WriteLine("inputlength : {0}",plainBytes.Length); encryptedBytes = rsaProvider.Encrypt(plainBytes, false); result = ByteArrayToString(encryptedBytes); Console.WriteLine("Encrypted Hex string : {0}", result); } catch (Exception ex) { // Any errors? Show them Console.WriteLine("Exception encrypting file! More info:"); Console.WriteLine(ex.Message); } rsaProvider.Dispose(); Console.WriteLine("-------------------------END Encrypt--------------------"); return result; } // Encrypt public static byte[] StringToByteArray(String hex) { int NumberChars = hex.Length / 2; byte[] bytes = new byte[NumberChars]; using (var sr = new StringReader(hex)) { for (int i = 0; i < NumberChars; i++) bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16); } return bytes; } public static string ByteArrayToString(byte[] ba) { StringBuilder hex = new StringBuilder(ba.Length * 2); foreach (byte b in ba) hex.AppendFormat("{0:x2}", b); return hex.ToString(); } 

Я изменил php на этот

 <?php include('Crypt/RSA.php'); if (isset($_POST['Password'])) { $Password = $_POST['Password']; $crypttext = pack("H*",$Password); echo $cryptext; $rsa = new Crypt_RSA(); $rsa->loadKey(file_get_contents('key.priv')); // Added file_get_contents() which fixed the key loading $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); // Added this which is essential thank you guys/gals $decryptedText =$rsa->decrypt($cryptext); echo "Pass = >" . $decryptedText; // gives unsual data. This needs to be converted from binary data to base64string I think echo "Pass = >" . base64_encode($decryptedText); // gives no data. echo "Pass = >" . base64_decode($decryptedText); // gives no data. } ?> в <?php include('Crypt/RSA.php'); if (isset($_POST['Password'])) { $Password = $_POST['Password']; $crypttext = pack("H*",$Password); echo $cryptext; $rsa = new Crypt_RSA(); $rsa->loadKey(file_get_contents('key.priv')); // Added file_get_contents() which fixed the key loading $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); // Added this which is essential thank you guys/gals $decryptedText =$rsa->decrypt($cryptext); echo "Pass = >" . $decryptedText; // gives unsual data. This needs to be converted from binary data to base64string I think echo "Pass = >" . base64_encode($decryptedText); // gives no data. echo "Pass = >" . base64_decode($decryptedText); // gives no data. } ?> 

Я искал вокруг и пробовал несколько вещей, чтобы преобразовать обратно в текст, и я пробовал base64_encode () и base64_decode (), но ничего не получаю, и в противном случае я получаю gobbledey gook.

Solutions Collecting From Web of "Дешифрование данных с помощью RSA Private Key"

Окончательным решением было использование imap_binary ($ decryptedText) для преобразования обратно.

Редактировать :

С тех пор мне было доведено до сведения, что лучший способ сделать это – заменить 2 вещи

C #

 plainBytes = Convert.FromBase64String(data); 

Изменился на

 plainBytes = Encoding.UTF8.GetBytes(data); 

и PHP

 imap_binary($decryptedText) 

Изменился на

 utf8_decode($decryptedText)