간단한 작업을하려고합니다. PHP에서 값을 암호화하고 내 VB.net 앱에서 암호 해독하십시오. tripleDES 또는 Rijdael 128 또는 256을 사용하고 싶습니다.PHP 암호화 및 VB.net 해독
하지만 간단해야합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
는간단한 작업을하려고합니다. PHP에서 값을 암호화하고 내 VB.net 앱에서 암호 해독하십시오. tripleDES 또는 Rijdael 128 또는 256을 사용하고 싶습니다.PHP 암호화 및 VB.net 해독
하지만 간단해야합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
는우리는 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;
PHP쪽에 대해 좀 더 자세히 설명해 주시겠습니까? C# 쪽에서 무엇을 했습니까? 코드 스 니펫을 공유 하시겠습니까? 감사합니다. – shaiss
공유 할 수 없기 때문에 코드가 공개되어 있지 않습니다. 매개 변수가 양쪽에서 일치하는 방법을 보여주기 위해 일부 스 니펫을 게시했습니다. PHP 코드는 PKCS7 패딩을 지원하지 않는 mcrypt를 사용하는 이전 버전의 코드입니다. 따라서 mcrypt를 사용한다면 패딩 기능을 작성해야합니다. 알고리즘을 이해하면 정말 간단합니다. –
포즈를 가져 주셔서 감사합니다. 나는 지금 이것을 시험하고있다. – shaiss
책임의 한계와 법적 고지 지정된 암호를 모두 지원해야하는의 mcrypt extension 봐야한다 감사 : 사실은 .NET에서 Crytography 클래스를 사용한 적이 없으니까.
.NET에서 Rijndael 암호 해독을 수행하려면 System.Security.Cryptography.RijndaelManaged 클래스가 필요합니다.
이 페이지에는 사용 방법에 대한 몇 가지 예가 있지만 RSACryptoServiceProvider 인스턴스가 필요할 수도 있습니다. 확실하지 않습니다.
나는 처음 게시 된 링크를 찾고 있습니다. 그것이 작동 할 것 같은데, 단지 그것을 알아낼 필요가있다. 고맙습니다. – shaiss
난이 문제에 대한 해결책 긴 하드 보았다 설정에 대응하는 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
########################################
내 PHP 코드 : http://pastie.org/584230 – shaiss