2009-08-14 80 views
5

Tôi đang cố gắng thực hiện một tác vụ đơn giản. Encypt một giá trị trong PHP và giải mã nó trong ứng dụng VB.net của tôi. Tôi muốn sử dụng tripleDES hoặc Rijdael 128 hoặc 256Mã hóa PHP & Giải mã VB.net

Mặc dù điều này đơn giản. ai đó có thể chỉ cho tôi phương hướng đúng không?

Cảm ơn bạn

+0

Mã PHP của tôi: http://pastie.org/584230 – shaiss

Trả lời

6

Chúng tôi có một số mật mã hoạt động giữa C# trên .NET và PHP. Tôi không quen thuộc với VB.net. Tôi giả sử nó sử dụng cùng một thư viện mật mã System.Security.Cryptography.

Về phía PHP, chúng tôi chuyển từ mcrypt sang OpenSSL vì một số chế độ và đệm không được hỗ trợ bởi mcrypt.

Miễn là bạn sử dụng cùng một thuật toán (DES, AES vv), cùng một chế độ (CBC, ECB, vv), cùng đệm (PKCS1, PKCS5), mật mã sẽ hoạt động trên cả hai nền tảng.

Ví dụ về mã hóa bằng AES-128 trên PHP bên sử dụng 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); 

Xin lưu ý rằng chúng tôi sử dụng PKCS7 đệm nhưng Mcrypt không hỗ trợ nó vì vậy chúng tôi phải viết các thuật toán đệm. Chúng tôi cũng thêm IV (Vector ban đầu) vào văn bản mã hóa. Bạn có thể lưu trữ nó ở một nơi khác nhưng bạn cần điều đó để giải mã.

Dưới đây là mã C# tương ứng để thiết lập mật mã để giải mã,

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

Bạn có thể cung cấp thêm một chút chi tiết cho phía PHP không? Bạn đã làm gì ở bên C#? Bạn có đoạn mã nào để chia sẻ không? cảm ơn bạn! – shaiss

+1

Mã không nằm trong miền công cộng nên tôi không thể chia sẻ. Tôi đã đăng một số đoạn trích để cho bạn biết cách các tham số được đối sánh trên cả hai đầu. Mã PHP là từ một phiên bản cũ hơn sử dụng mcrypt, không hỗ trợ đệm PKCS7. Vì vậy, bạn phải viết chức năng đệm nếu bạn sử dụng mcrypt. Nó thực sự đơn giản khi bạn hiểu thuật toán. –

+0

Cảm ơn bạn đã đặt ra. Tôi đang cố gắng này ra ngay bây giờ. – shaiss

0

Đối với PHP bạn nên nhìn vào mcrypt extension, mà nên hỗ trợ tất cả các thuật toán mã hóa mà bạn chỉ định

+0

Mã php của tôi sử dụng mcrypt. Vấn đề tôi có là giải mã nó trong VB.net – shaiss

0

Disclaimer: Tôi chưa bao giờ thực sự sử dụng các lớp Crytography trong .NET.

Để thực hiện giải mã Rijndael trong .NET, có thể bạn đang tìm kiếm lớp System.Security.Cryptography.RijndaelManaged.

Trang đó cũng có một số ví dụ về cách sử dụng, mặc dù bạn cũng có thể cần một phiên bản RSACryptoServiceProvider ... Tôi không chắc chắn.

+0

Tôi đang tìm kiếm liên kết được đăng đầu tiên của bạn. Có vẻ như nó có thể hoạt động, chỉ cần tìm ra. Cảm ơn bạn. – shaiss

8

Tôi cũng nhìn lâu dài và khó khăn cho các giải pháp cho vấn đề này. Đây là một bộ mã hoàn chỉnh cho cả php và vb.net sẽ làm những gì bạn đang tìm kiếm. Nên khá dễ dàng để dịch C# là tốt.

######################################## 
# 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, cảm ơn bạn, tôi sẽ phải thử nghiệm điều này trên ứng dụng tiếp theo của mình. Cảm ơn bạn! – shaiss

+0

quên các chức năng này. Sẽ không làm việc luôn ... – Racooon

+0

Chỉ muốn nói lời cảm ơn, tôi đã tìm kiếm và sử dụng mã của bạn. Tôi đã chuyển đổi VB để C# mặc dù. –