У меня есть программа, которая шифрует пароли, используя открытый ключ 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.
Окончательным решением было использование imap_binary ($ decryptedText) для преобразования обратно.
Редактировать :
С тех пор мне было доведено до сведения, что лучший способ сделать это – заменить 2 вещи
C #
plainBytes = Convert.FromBase64String(data);
Изменился на
plainBytes = Encoding.UTF8.GetBytes(data);
и PHP
imap_binary($decryptedText)
Изменился на
utf8_decode($decryptedText)