2009-08-14 17 views
5

Próbuję wykonać proste zadanie. Wpisz wartość w PHP i odszyfruj ją w mojej aplikacji VB.net. Myślę, że użyłbym tripleDES lub Rijdael 128 lub 256Szyfrowanie PHP i deszyfrowanie VB.net

Myślę, że to powinno być proste. Czy ktoś może wskazać mi właściwy kierunek?

Dziękuję

+0

Mój kod PHP: http://pastie.org/584230 – shaiss

Odpowiedz

6

Mamy kilka szyfrów pracujących między C# na .NET i PHP. Nie znam VB.net. Zakładam, że używa tej samej biblioteki kryptograficznej System.Security.Cryptography.

Po stronie PHP przełączyliśmy się z mcrypt na OpenSSL, ponieważ niektóre tryby i paddings nie są obsługiwane przez mcrypt.

Dopóki używasz tego samego algorytmu (DES, AES itp.), Tego samego trybu (CBC, ECB itp.), Tego samego wypełnienia (PKCS1, PKCS5), szyfr powinien działać na obu platformach.

Przykład szyfrowania z wykorzystaniem AES-128 po stronie PHP przy użyciu 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); 

Należy pamiętać, że używamy PKCS7 wyściółkę ale mcrypt nie obsługuje więc musimy napisać algorytm wypełniania. Dodajemy również wektor IV (początkowy wektor) do tekstu zaszyfrowanego. Możesz go przechowywać gdzie indziej, ale musisz to odszyfrować.

Oto odpowiedni kod C do konfiguracji szyfr do odszyfrowania #,

// 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; 
+0

Czy mógłbyś podać nieco więcej szczegółów dla strony PHP? Co zrobiłeś po stronie C#? Czy masz jakieś urywki kodu do udostępnienia? dziękuję! – shaiss

+1

Kod nie znajduje się w domenie publicznej, więc nie mogę udostępnić. Opublikowałem kilka fragmentów, aby pokazać, jak parametry są dopasowane na obu końcach. Kod PHP pochodzi ze starszej wersji, używającej mcrypt, która nie obsługuje dopełnienia PKCS7. Więc musisz napisać funkcję dopełnienia, jeśli używasz mcrypt. To naprawdę proste, gdy zrozumiesz algorytm. –

+0

Dziękuję za pozowanie. Próbuję tego teraz. – shaiss

0

dla PHP należy spojrzeć na mcrypt extension, który powinien obsługiwać wszystkich szyfrów określono

+0

Mój kod php używa mcrypt. Problemem jest dekodowanie go w VB.net – shaiss

0

Oświadczenie: Ja nigdy nie używany klas Crytography w .NET.

Aby wykonać deszyfrowanie Rijndael w .NET, prawdopodobnie szukasz klasy System.Security.Cryptography.RijndaelManaged.

Ta strona zawiera również kilka przykładów korzystania z tej funkcji, chociaż może być również konieczne wykonanie instancji RSACryptoServiceProvider ... Nie jestem pewien.

+0

Zajmuję się twoim pierwszym opublikowanym linkiem. Wygląda na to, że to może zadziałać, po prostu trzeba to rozgryźć. Dziękuję Ci. – shaiss

8

Ja też wyglądał długo i ciężko dla rozwiązania tego problemu. Oto kompletny zestaw kodu dla php i vb.net, który zrobi to, czego szukasz. Powinien być również łatwy do przetłumaczenia na język 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#[email protected]'; // 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#[email protected]" '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 
######################################## 
+0

Wow, dziękuję, będę musiał przetestować to na mojej następnej aplikacji. Dziękujemy! – shaiss

+0

zapomnieć o tych funkcjach. Nie będę pracował zawsze ... – Racooon

+0

Chciałbym tylko podziękować, szukałem naszego i użyłem twojego kodu. Jednak przekonwertowałem VB na C#. –