2009-08-14 98 views
5

私は、単純なタスクを実行しようとしています。 PHPで値を暗号化し、VB.netアプリケーションで復号化します。 は、私は、これは簡単でなければならないのに、私はトリプルDESまたはRijdael 128または256PHP暗号化&復号化VB.net

Iを使用したい把握します。誰かが私を正しい方向に向けることができますか?

あなたは

+0

私のPHPコード:http://pastie.org/584230 – shaiss

答えて

6

我々は、.NETおよびPHPにC#の間に働くいくつかの暗号を持っています。私はVB.netに精通していません。私はそれが同じ暗号ライブラリSystem.Security.Cryptographyを使用すると仮定します。 PHP側で

いくつかのモードとパディングがmcryptのでサポートされていないので、我々は、OpenSSLにmcryptの切り替え。

同じアルゴリズム(DES、AESなど)、同じモード(CBC、ECBなど)、同じパディング(PKCS1、PKCS5)を使用する限り、暗号は両方のプラットフォームで機能するはずです。

mcryptのを使用してPHP側で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(初期ベクトル)を暗号文の前に付加します。他の場所に保存することもできますが、復号化する必要があります。ここで

は、私はまた、この問題の解決のために長いとハードに見えた設定に対応する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; 
+0

PHP側の詳細を少し教えてください。 C#側で何をしましたか? あなたが共有する任意のコードスニペットを持っていますか? ありがとうございます! – shaiss

+1

コードはパブリックドメインではないので、共有できません。私はいくつかのスニペットを投稿して、パラメータが両端でどのようにマッチするかを示しました。 PHPコードは、PKCS7パディングをサポートしていないmcryptを使用している古いバージョンのものです。したがって、mcryptを使用する場合は、パディング関数を記述する必要があります。アルゴリズムを理解すれば、それは本当に簡単です。 –

+0

ポーズを取っていただきありがとうございます。私は今これを試しています。 – shaiss

0

PHPのためにあなたが

+0

私のPHPコードは、mcryptのを使用しています。私が持っている問題はVB.netでそれを解読することです – shaiss

0

免責事項を指定した暗号のすべてをサポートするべき、mcrypt extensionをご覧くださいありがとう:私は実際には.NETで暗号がクラスを使用したことがありません。 .NETでラインダール復号化を行うには

、あなたはおそらくSystem.Security.Cryptography.RijndaelManagedクラスを探しています。

このページには、使用方法の例がいくつかありますが、RSACryptoServiceProviderのインスタンスも必要な場合があります。わかりません。

+0

私はあなたの最初の投稿されたリンクを探しています。それが働くかもしれないように見える、ちょうどそれを把握する必要がある。ありがとうございました。 – shaiss

8

。ここでは、あなたが探しているものを行う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

うわー、ありがとう、私は私の次のアプリでこの1つをテストする必要があります。 ありがとうございました! – shaiss

+0

これらの機能を忘れてしまった。いつも働いていません... – Racooon

+0

おかげさまで、私は私たちを探していて、あなたのコードを使っています。私はVBをC#に変換しました。 –