如何在PHP中解密c#中使用3DES加密的字符串


How to decrypt in PHP a string encrypted with 3DES in C#?

我使用以下代码来解码我的c#程序中的字符串,但我还需要能够用PHP解密相同的字符串服务器端。下面的c#代码在PHP中是否有等价的?

public static string DecryptString(string Message, string Passphrase)
    {
        byte[] Results;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        // Step 1. We hash the passphrase using MD5
        // We use the MD5 hash generator as the result is a 128 bit byte array
        // which is a valid length for the TripleDES encoder we use below
        MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
        byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
        // Step 2. Create a new TripleDESCryptoServiceProvider object
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
        // Step 3. Setup the decoder
        TDESAlgorithm.Key = TDESKey;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        // Step 4. Convert the input string to a byte[]
        byte[] DataToDecrypt = Convert.FromBase64String(Message);
        // Step 5. Attempt to decrypt the string
        try
        {
            ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
            Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
        }
        finally
        {
            // Clear the TripleDes and Hashprovider services of any sensitive information
            TDESAlgorithm.Clear();
            HashProvider.Clear();
        }
        // Step 6. Return the decrypted string in UTF8 format
        return UTF8.GetString(Results);
    }

在PHP中使用$key = md5($passphrase, true)获取MD5哈希值。第二个参数给出原始输出,而不是十六进制编码。

要使用Triple DES加密/解密,可以使用mcrypt模块。最简单的形式:

$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CBC);

注意事项:

  • 三重DES使用192位密钥,但你有一个128位密钥。PHP用空填充键,但是。net不允许这样的键。相反,它将前8个字节附加到末尾。
  • 。. NET使用PCKS7填充,PHP使用零填充。
为了避免这些不兼容,您必须对标准代码进行一些修改。这是从php.net上的一篇文章中摘录的:
function encryptNET3DES($key, $vector, $text){
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    // Complete the key
    $key_add = 24 - strlen($key);
    $key .= substr($key, 0, $key_add);
    // Padding the text
    $text_add = strlen($text)%8;
    for ($i=$text_add; $i<8; $i++){
        $text .= chr(8-$text_add);
    }
    mcrypt_generic_init($td, $key, $vector);
    $encrypt64 = mcrypt_generic($td, $text);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
     // Return the encrypt text in 64 bits code
    return $encrypt64;
}

最后,要编码/解码base64字符串,使用base64_encodebase64_decode()

我想解密代码从.netphp。我的.net加解密方法如下:

public class EncryptDecrypt
{
    private byte[] TDES_Key = { 0x01, 0x04, 0x01, 0x01, 0x01, 0x09, 0x07, 0x08, 0x01, 0x09, 0x07, 0x08, 0x01, 0x01, 0x02, 0x04 };
    private byte[] tdesIV;
    public string Encrypt(string textToEncrypt,string KeyVI)
    {
        tdesIV = GetLegalKey(KeyVI);
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = TDES_Key;
        tdes.IV = tdesIV;
        byte[] buffer = Encoding.ASCII.GetBytes(textToEncrypt); 
        return Convert.ToBase64String(tdes.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));/// 
    }