2009-08-14 19 views
5

Estoy tratando de hacer una tarea simple. Encypt un valor en PHP y descifrarlo en mi aplicación VB.net. Me imagino que usaría tripleDES o Rijdael 128 o 256Cifrado PHP y descifrado VB.net

Pensé que esto debería ser simple. ¿Alguien puede señalarme en la dirección correcta?

Gracias

+0

Mi código PHP: http://pastie.org/584230 – shaiss

Respuesta

6

Tenemos algunas cifras trabajando entre C# en .NET y PHP. No estoy familiarizado con VB.net. Supongo que usa la misma biblioteca de cifrado System.Security.Cryptography.

En el lado de PHP, cambiamos de mcrypt a OpenSSL porque mcrypt no admite algunos modos y rellenos.

Siempre que use el mismo algoritmo (DES, AES, etc.), el mismo modo (CBC, ECB, etc.), el mismo relleno (PKCS1, PKCS5), el cifrado debería funcionar en ambas plataformas.

Ejemplo de cifrado usando un algoritmo AES-128 en el lado PHP usando 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); 

Tenga en cuenta que utilizamos el relleno PKCS7 pero mcrypt no lo soporte por lo que tiene que escribir el algoritmo de relleno. También anteponemos el IV (Vector inicial) al texto de cifrado. Puede guardarlo en otro lugar, pero lo necesita para descifrarlo.

Aquí está el correspondiente código C# para configurar el sistema de cifrado para descifrar,

// 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

¿Podría dar un poco más de detalles para el lado de PHP? ¿Qué hiciste en el lado C#? ¿Le gustaría compartir algún fragmento de código? ¡gracias! – shaiss

+1

El código no está en el dominio público, así que no puedo compartirlo. Publiqué algunos fragmentos para mostrarle cómo se combinan los parámetros en ambos extremos. El código PHP es de una versión anterior que usa mcrypt, que no admite el relleno PKCS7. Entonces, debe escribir la función de relleno si usa mcrypt. Es realmente simple una vez que entiendes el algoritmo. –

+0

Gracias por posar. Estoy probando esto ahora. – shaiss

0

Para PHP usted debe buscar en la mcrypt extension, que debe soportar todos los sistemas de cifrado que ha especificado

+0

Mi código PHP utiliza mcrypt. El problema que tengo es decodificación en VB.net – shaiss

0

de responsabilidad: En realidad nunca he utilizado las clases Criptografía en .NET.

Para descifrar Rijndael en .NET, probablemente esté buscando la clase System.Security.Cryptography.RijndaelManaged.

Esa página también tiene algunos ejemplos de cómo usarla, aunque también puede necesitar una instancia de RSACryptoServiceProvider ... No estoy seguro.

+0

Estoy buscando su primer enlace publicado. Parece que podría funcionar, solo necesita resolverlo. Gracias. – shaiss

8

También parecía largo y difícil para las soluciones a este problema. Aquí hay un conjunto completo de códigos para php y vb.net que harán lo que estás buscando. Debería ser bastante fácil de traducir a C# también.

######################################## 
# 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, gracias, tendré que probarlo en mi próxima aplicación. ¡Gracias! – shaiss

+0

olvide estas funciones. No funcionaría siempre ... – Racooon

+0

Solo quería decir gracias, he estado buscando el nuestro y usé su código. Sin embargo, había convertido el VB a C#. –

Cuestiones relacionadas