PHP中的加密无法按预期工作

时间:2009-08-26 11:12:30

标签: php vb.net encryption

我有一个非常愚蠢的情况,我在PHP中从VB.NET接收加密字符串。我能够解密密钥。但是,当我想加密结果并获得加密字符串时,我得到了不匹配。任何人都可以帮助我....

以下是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 :(得分:0)

您是否在VB和PHP加密中使用相同的iv?此外,尝试在加密后删除修剪 - 不需要它。只有在解密后才需要修剪。

答案 1 :(得分:0)

我在appliation方面使用的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