PHP Şifreleme &

4 Cevap php

I'm trying to do a simple task. Encypt a value in PHP and Decrypt it in my VB.net app. I figure I'd use tripleDES or Rijdael 128 or 256

Ama bu basit olmalıdır. Herkes bana doğru yönde işaret edebilir?

Teşekkür ederim

4 Cevap

Biz. NET ve PHP C # arasındaki çalışan bazı şifreleri var. Ben VB.net aşina değilim. Ben System.Security.Cryptography aynı kripto kütüphanesini kullanır varsayılmaktadır.

Bazı modları ve altlıkları mcrypt tarafından desteklendiği için PHP tarafında, biz OpenSSL'ye mcrypt geçti.

Sürece aynı algoritma (DES, AES, vb), aynı modu (CBC, ECB vb), aynı padding (PKCS1, PKCS5) kullanmak gibi, şifre hem platformlarda çalışması gerekir.

Mcrypt kullanarak PHP tarafında AES-128 şifreleme kullanarak örneği,

    $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);

Biz PKCS7 dolgu kullanabilirsiniz ama biz doldurma algoritması yazmak zorunda mcrypt bunu desteklemiyor unutmayın. Biz de şifre metne IV (İlk Vector) Önlerine. Bunu başka bir yerde saklamak olabilir ama şifresini ihtiyacımız var.

İşte kurulum için gelen C # kodu şifresini şifre olduğunu,

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

Ben de bu sorunun çözümü için uzun ve zor görünüyordu. Burada php ve aradığınız ne yapacak vb.net hem kod bütünüdür. De C # çevirmek oldukça kolay olmalıdır.

########################################
# 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#cs!9hjv887mxx7@8y'; // 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#cs!9hjv887mxx7@8y"  '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 için size belirtilen şifrelerin tüm destek gereken, mcrypt extension bakmak gerekir

Yasal Uyarı:. Aslında NET'te Crytography sınıfları hiç kullanmadım.

. NET'te Rijndael şifre çözme yapmak için, muhtemelen System.Security.Cryptography.RijndaelManaged sınıf arıyoruz.

Ayrıca RSACryptoServiceProvider ... Ben emin değilim bir örneğini gerekebilir ancak bu sayfa da, bunu kullanmak için bazı örnekler vardır.