Как расшифровать в PHP строку, зашифрованную с помощью 3DES в C #? - PullRequest
2 голосов
/ 20 октября 2011

Я использую следующий код для декодирования строки в моей программе на C #, но мне также нужно иметь возможность расшифровывать ту же строку на стороне сервера с помощью PHP. Есть ли в PHP эквивалент следующего кода на c #?

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

    }

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Чтобы получить хеш MD5 в PHP, используйте $key = md5($passphrase, true).Второй параметр дает необработанный вывод вместо его шестнадцатеричной кодировки.

Для шифрования / дешифрования с использованием Triple DES вы можете использовать модуль mcrypt.В простейшем виде:

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

Замечания:

  • Triple DES использует 192-битные ключи, но у вас есть 128-битный ключ.PHP дополняет ключ значениями NULL, но .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_encode и base64_decode()

0 голосов
/ 19 апреля 2014

Я хочу расшифровать код из .net в php. Мои .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));/// 
    }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...