2009-08-14 3 views
5

간단한 작업을하려고합니다. PHP에서 값을 암호화하고 내 VB.net 앱에서 암호 해독하십시오. tripleDES 또는 Rijdael 128 또는 256을 사용하고 싶습니다.PHP 암호화 및 VB.net 해독

하지만 간단해야합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

+0

내 PHP 코드 : http://pastie.org/584230 – shaiss

답변

6

우리는 C# on .NET과 PHP 사이에서 작동하는 몇 가지 암호가 있습니다. 나는 VB.net에 익숙하지 않다. 동일한 암호화 라이브러리 System.Security.Cryptography을 사용한다고 가정합니다.

PHP 쪽에서 mcrypt는 일부 모드와 패딩을 지원하지 않기 때문에 mcrypt를 OpenSSL로 전환했습니다.

동일한 알고리즘 (DES, AES 등), 동일한 모드 (CBC, ECB 등), 동일한 패딩 (PKCS1, PKCS5)을 사용하는 경우 암호는 두 플랫폼 모두에서 작동해야합니다. PHP 측 사용 Mcrypt 라이브러리에 AES-128을 사용하여 암호화

예,

$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 (초기 벡터)를 추가합니다. 다른 곳에 저장할 수도 있지만 암호를 해독해야합니다. 여기

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

PHP쪽에 대해 좀 더 자세히 설명해 주시겠습니까? C# 쪽에서 무엇을 했습니까? 코드 스 니펫을 공유 하시겠습니까? 감사합니다. – shaiss

+1

공유 할 수 없기 때문에 코드가 공개되어 있지 않습니다. 매개 변수가 양쪽에서 일치하는 방법을 보여주기 위해 일부 스 니펫을 게시했습니다. PHP 코드는 PKCS7 패딩을 지원하지 않는 mcrypt를 사용하는 이전 버전의 코드입니다. 따라서 mcrypt를 사용한다면 패딩 기능을 작성해야합니다. 알고리즘을 이해하면 정말 간단합니다. –

+0

포즈를 가져 주셔서 감사합니다. 나는 지금 이것을 시험하고있다. – shaiss

0

PHP를 들어 당신이

+0

내 PHP 코드는 mcrypt를 사용합니다. 내가 가진 문제는 VB.net에서 그것을 디코딩하는 것입니다. – shaiss

0

책임의 한계와 법적 고지 지정된 암호를 모두 지원해야하는의 mcrypt extension 봐야한다 감사 : 사실은 .NET에서 Crytography 클래스를 사용한 적이 없으니까.

.NET에서 Rijndael 암호 해독을 수행하려면 System.Security.Cryptography.RijndaelManaged 클래스가 필요합니다.

이 페이지에는 사용 방법에 대한 몇 가지 예가 있지만 RSACryptoServiceProvider 인스턴스가 필요할 수도 있습니다. 확실하지 않습니다.

+0

나는 처음 게시 된 링크를 찾고 있습니다. 그것이 작동 할 것 같은데, 단지 그것을 알아낼 필요가있다. 고맙습니다. – shaiss

8

난이 문제에 대한 해결책 긴 하드 보았다 설정에 대응하는 C# 코드 해독하는 암호이다. 다음은 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#[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

와우, 고맙습니다. 다음 앱에서이 앱을 테스트해야합니다. 감사합니다. – shaiss

+0

이 기능을 잊어 버리십시오. 항상 작동하지 않을 것입니다 ... – Racooon

+0

감사를 말하고 싶습니다. 저는 우리를 찾고 있었고 코드를 사용했습니다. VB에서 C#으로 변환했다. –