私は、単純なタスクを実行しようとしています。 PHPで値を暗号化し、VB.netアプリケーションで復号化します。 は、私は、これは簡単でなければならないのに、私はトリプルDESまたはRijdael 128または256PHP暗号化&復号化VB.net
Iを使用したい把握します。誰かが私を正しい方向に向けることができますか?
あなたは私は、単純なタスクを実行しようとしています。 PHPで値を暗号化し、VB.netアプリケーションで復号化します。 は、私は、これは簡単でなければならないのに、私はトリプルDESまたはRijdael 128または256PHP暗号化&復号化VB.net
Iを使用したい把握します。誰かが私を正しい方向に向けることができますか?
あなたは我々は、.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;
PHP側の詳細を少し教えてください。 C#側で何をしましたか? あなたが共有する任意のコードスニペットを持っていますか? ありがとうございます! – shaiss
コードはパブリックドメインではないので、共有できません。私はいくつかのスニペットを投稿して、パラメータが両端でどのようにマッチするかを示しました。 PHPコードは、PKCS7パディングをサポートしていないmcryptを使用している古いバージョンのものです。したがって、mcryptを使用する場合は、パディング関数を記述する必要があります。アルゴリズムを理解すれば、それは本当に簡単です。 –
ポーズを取っていただきありがとうございます。私は今これを試しています。 – shaiss
免責事項を指定した暗号のすべてをサポートするべき、mcrypt extensionをご覧くださいありがとう:私は実際には.NETで暗号がクラスを使用したことがありません。 .NETでラインダール復号化を行うには
、あなたはおそらくSystem.Security.Cryptography.RijndaelManagedクラスを探しています。
このページには、使用方法の例がいくつかありますが、RSACryptoServiceProviderのインスタンスも必要な場合があります。わかりません。
私はあなたの最初の投稿されたリンクを探しています。それが働くかもしれないように見える、ちょうどそれを把握する必要がある。ありがとうございました。 – shaiss
。ここでは、あなたが探しているものを行う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
########################################
私のPHPコード:http://pastie.org/584230 – shaiss