Шифрование в PHP не работает должным образом - PullRequest
2 голосов
/ 26 августа 2009

У меня очень глупая ситуация, я получаю зашифрованную строку из VB.NET на PHP. Я могу расшифровать ключ. Но когда я хочу зашифровать результат и получить зашифрованную строку, я получаю несоответствие. Может кто-нибудь помочь мне, пожалуйста ....

Ниже приведен код PHP.

<?php

//$syscode=$_REQUEST['syscode'];
//The actual string is "blueberry" which is encrypted in VB.NET and sent to PHP
$syscode = "8yN73RDmMFuXo9ux8QKC6w=="; //This is the encrypted string as received from VB.NET
echo "Original Encrypted String Received from VB.NET: <br>".$syscode;
echo "<br><br>";
Decrypt($syscode);
echo "<br><br>";
Encrypt("blueberry");


function Decrypt($strToDecrypt){
global $strD;
$key64 = "cPSQAC05GBXzMhRRz7tm8cqg+vHdHyN5";
$iv64 = "jIShBJVBfXo=";
$encryptedString64 = $strToDecrypt;
$keybytes = base64_decode($key64);
$ivbytes = base64_decode($iv64);

$encryptedStringbytes = base64_decode($encryptedString64);

// use mcrypt library for encryption
$decryptRaw = mcrypt_decrypt(MCRYPT_3DES, $keybytes, $encryptedStringbytes, MCRYPT_MODE_CBC, $ivbytes);
$decryptString=trim($decryptRaw,"\x00..\x1F");
print "Decrypted by PHP:<br>$decryptString<br/>"; //The decrypted string should be "blueberry"
}

function Encrypt($strToEncrypt){
$key64 = "cPSQAC05GBXzMhRRz7tm8cqg+vHdHyN5";
$iv64 = "jIShBJVBfXo=";
$keybytes = base64_decode($key64);
$ivbytes = base64_decode($iv64);

// use mcrypt library for encryption
$encryptRaw = mcrypt_encrypt(MCRYPT_3DES, $keybytes, $strToEncrypt, MCRYPT_MODE_CBC, $ivbytes);
$encryptString=trim($encryptRaw,"\x00..\x1F");
$encryptString=(base64_encode(trim($encryptRaw)));

print "Encrypted in PHP:<br>$encryptString<br/>"; //This where the PHP encrypted result is not matching the VB.NET encryption result.
}
?>

Ответы [ 2 ]

0 голосов
/ 26 августа 2009

Код VB.NET, который я использую на стороне приложения, приведен ниже ...

Imports System
Imports System.Text
Imports System.Security.Cryptography
Imports System.IO

Module Crypto
    Public Function Decrypt(ByVal strToDecrypt As String) As String
        Try

            'initialize our key
            Dim tripleDESKey As SymmetricAlgorithm = SymmetricAlgorithm.Create("TripleDES")
            tripleDESKey.Key = Convert.FromBase64String("cPSQAC05GBXzMhRRz7tm8cqg+vHdHyN5")
            tripleDESKey.IV = Convert.FromBase64String("jIShBJVBfXo=")

            'load our encrypted value into a memory stream
            Dim encryptedValue As String = strToDecrypt
            Dim encryptedStream As MemoryStream = New MemoryStream()
            encryptedStream.Write(Convert.FromBase64String(encryptedValue), 0, Convert.FromBase64String(encryptedValue).Length)
            encryptedStream.Position = 0

            'set up a stream to do the decryption
            Dim cs As CryptoStream = New CryptoStream(encryptedStream, tripleDESKey.CreateDecryptor, CryptoStreamMode.Read)
            Dim decryptedStream As MemoryStream = New MemoryStream()
            Dim buf() As Byte = New Byte(2048) {}
            Dim bytesRead As Integer

            'keep reading from encrypted stream via the crypto stream
            'and store that in the decrypted stream
            bytesRead = cs.Read(buf, 0, buf.Length)
            While (bytesRead > 0)
                decryptedStream.Write(buf, 0, bytesRead)
                bytesRead = cs.Read(buf, 0, buf.Length)
            End While

            'reassemble the decrypted stream into a string    
            Dim decryptedValue As String = Encoding.ASCII.GetString(decryptedStream.ToArray())


            Return (decryptedValue.ToString())

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function

    Public Function Encrypt(ByVal strToEncrypt As String) As String
        Dim sa As SymmetricAlgorithm = SymmetricAlgorithm.Create("TripleDES")
        sa.Key = Convert.FromBase64String("cPSQAC05GBXzMhRRz7tm8cqg+vHdHyN5")
        sa.IV = Convert.FromBase64String("jIShBJVBfXo=")

        Dim inputByteArray() As Byte = Encoding.ASCII.GetBytes(strToEncrypt)
        Dim mS As MemoryStream = New MemoryStream()

        Dim trans As ICryptoTransform = sa.CreateEncryptor
        Dim buf() As Byte = New Byte(2048) {}
        Dim cs As CryptoStream = New CryptoStream(mS, trans, CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()

        Return Convert.ToBase64String(mS.ToArray).ToString
    End Function
End Module
0 голосов
/ 26 августа 2009

Используете ли вы тот же iv для VB, а также шифрование PHP? Также попробуйте удалить обрезку после шифрования - она ​​не нужна. Вам нужно обрезать только после расшифровки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...