Шифрование PHP и расшифровка VB.net

Я пытаюсь выполнить простую задачу. Закрепите значение в PHP и расшифруйте его в своем приложении VB.net. Я полагаю, что я буду использовать tripleDES или Rijdael 128 или 256

Хотя это должно быть просто. Может кто-то указать мне верное направление?

спасибо

У нас есть некоторые шифры, работающие между C # на .NET и PHP. Я не знаком с VB.net. Я предполагаю, что он использует ту же криптографическую библиотеку System.Security.Cryptography .

На стороне PHP мы переключились с mcrypt на OpenSSL, потому что некоторые режимы и paddings не поддерживаются mcrypt.

Если вы используете тот же алгоритм (DES, AES и т. Д.), Тот же режим (CBC, ECB и т. Д.), То же дополнение (PKCS1, PKCS5), шифр должен работать на обеих платформах.

Пример шифрования с использованием AES-128 на стороне PHP с использованием mcrypt,

  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128); $data = $this->paddingAlgorithm->padData($data, $blockSize); return $iv . mcrypt_encrypt($this->MCRYPT_DES, $keyBytes, $data, MCRYPT_MODE_CBC, $iv); 

Обратите внимание, что мы используем дополнение PKCS7, но mcrypt не поддерживает его, поэтому нам нужно написать алгоритм заполнения. Мы также добавляем текст IV (начальный вектор) в текст шифрования. Вы можете сохранить его в другом месте, но вам нужно его расшифровать.

Вот соответствующий код C # для настройки шифрования для дешифрования,

  // create the underlying symmetric algorithm with the given name algorithm = (SymmetricAlgorithm)CryptoConfig.CreateFromName("RIJNDAEL"); // set cipher mode algorithm.Mode = CipherMode.CBC; // set padding mode algorithm.Padding = PaddingMode.PKCS7; 

Я также долго и долго искал решения этой проблемы. Вот полный набор кодов для php и vb.net, которые будут делать то, что вы ищете. Должно быть довольно легко перевести на C #.

 ######################################## # BEGIN PHP CODE ######################################## <?php ini_set('display_errors', 1); error_reporting(E_ALL); // I blantantly stole, tweaked and happily used this code from: // Lord of Ports http://www.experts-exchange.com/M_1736399.html $ky = 'lkirwf897+22#bbtrm8814z5qq=498j5'; // 32 * 8 = 256 bit key $iv = '741952hheeyy66#cs!9hjv887mxx7@8y'; // 32 * 8 = 256 bit iv $text = "Here is my data to encrypt!!!"; $from_vb = "QBlgcQ2+v3wd8RLjhtu07ZBd8aQWjPMfTc/73TPzlyA="; // enter value from vb.net app here to test $etext = encryptRJ256($ky, $iv, $text); $dtext = decryptRJ256($ky, $iv, $etext); $vtext = decryptRJ256($ky, $iv, $from_vb); echo "<HR>orignal string: $text"; echo "<HR>encrypted in php: $etext"; echo "<HR>decrypted in php: $dtext"; echo "<HR>encrypted in vb: $from_vb"; echo "<HR>from vb decrypted in php: $vtext"; echo "<HR>If you like it say thanks! richard dot varno at gmail dot com"; exit; function decryptRJ256($key,$iv,$string_to_decrypt) { $string_to_decrypt = base64_decode($string_to_decrypt); $rtn = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_decrypt, MCRYPT_MODE_CBC, $iv); $rtn = rtrim($rtn, "\0\4"); return($rtn); } function encryptRJ256($key,$iv,$string_to_encrypt) { $rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_encrypt, MCRYPT_MODE_CBC, $iv); $rtn = base64_encode($rtn); return($rtn); } ?> ######################################## # END PHP CODE ######################################## ######################################## # BEGIN VB.NET CODE (console app) ######################################## Imports System Imports System.Text Imports System.Security.Cryptography Imports System.IO Module Module1 ' I blantantly stole, tweaked and happily used this code from: ' Lord of Ports http://www.experts-exchange.com/M_1736399.html Sub Main() 'Shared 256 bit Key and IV here Dim sKy As String = "lkirwf897+22#bbtrm8814z5qq=498j5" '32 chr shared ascii string (32 * 8 = 256 bit) Dim sIV As String = "741952hheeyy66#cs!9hjv887mxx7@8y" '32 chr shared ascii string (32 * 8 = 256 bit) Dim sTextVal As String = "Here is my data to encrypt!!!" Dim eText As String Dim dText As String eText = EncryptRJ256(sKy, sIV, sTextVal) dText = DecryptRJ256(sKy, sIV, eText) Console.WriteLine("key: " & sKy) Console.WriteLine() Console.WriteLine(" iv: " & sIV) Console.WriteLine("txt: " & sTextVal) Console.WriteLine("encrypted: " & eText) Console.WriteLine("decrypted: " & dText) Console.WriteLine("If you like it say thanks! richard dot varno at gmail dot com") Console.WriteLine("press any key to exit") Console.ReadKey(True) End Sub Public Function DecryptRJ256(ByVal prm_key As String, ByVal prm_iv As String, ByVal prm_text_to_decrypt As String) Dim sEncryptedString As String = prm_text_to_decrypt Dim myRijndael As New RijndaelManaged myRijndael.Padding = PaddingMode.Zeros myRijndael.Mode = CipherMode.CBC myRijndael.KeySize = 256 myRijndael.BlockSize = 256 Dim key() As Byte Dim IV() As Byte key = System.Text.Encoding.ASCII.GetBytes(prm_key) IV = System.Text.Encoding.ASCII.GetBytes(prm_iv) Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV) Dim sEncrypted As Byte() = Convert.FromBase64String(sEncryptedString) Dim fromEncrypt() As Byte = New Byte(sEncrypted.Length) {} Dim msDecrypt As New MemoryStream(sEncrypted) Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read) csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length) Return (System.Text.Encoding.ASCII.GetString(fromEncrypt)) End Function Public Function EncryptRJ256(ByVal prm_key As String, ByVal prm_iv As String, ByVal prm_text_to_encrypt As String) Dim sToEncrypt As String = prm_text_to_encrypt Dim myRijndael As New RijndaelManaged myRijndael.Padding = PaddingMode.Zeros myRijndael.Mode = CipherMode.CBC myRijndael.KeySize = 256 myRijndael.BlockSize = 256 Dim encrypted() As Byte Dim toEncrypt() As Byte Dim key() As Byte Dim IV() As Byte key = System.Text.Encoding.ASCII.GetBytes(prm_key) IV = System.Text.Encoding.ASCII.GetBytes(prm_iv) Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV) Dim msEncrypt As New MemoryStream() Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write) toEncrypt = System.Text.Encoding.ASCII.GetBytes(sToEncrypt) csEncrypt.Write(toEncrypt, 0, toEncrypt.Length) csEncrypt.FlushFinalBlock() encrypted = msEncrypt.ToArray() Return (Convert.ToBase64String(encrypted)) End Function End Module ######################################## # END VB.NET CODE ######################################## 

Для PHP вы должны посмотреть расширение mcrypt , которое должно поддерживать все указанные шифры

Отказ от ответственности: я никогда не использовал классы Crytography в .NET.

Чтобы сделать расшифровку Rijndael в .NET, вы, вероятно, ищете класс System.Security.Cryptography.RijndaelManaged .

На этой странице также есть некоторые примеры того, как ее использовать, хотя вам также может понадобиться экземпляр RSACryptoServiceProvider … Я не уверен.