Тройное шифрование DES на C# и PHP дает разные результаты
Я пишу простую систему шифрования для входа в систему, но у меня небольшая проблема. Функция шифрования C#:
public static string EncryptString(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 encoder
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
// Step 4. Convert the input string to a byte[]
byte[] DataToEncrypt = UTF8.GetBytes(Message);
// Step 5. Attempt to encrypt the string
try
{
ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
TDESAlgorithm.Clear();
HashProvider.Clear();
}
// Step 6. Return the encrypted string as a base64 encoded string
return Convert.ToBase64String(Results);
}
EncryptString("test", "123456")
возвращает "Yjaqhc7RFds="
.
Тот же код в php:
<?php
$key = "123456";
function pkcs7_pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
$input = pkcs7_pad("test", 16);
$key = md5(utf8_encode($key), true);
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo base64_encode($encrypted_data);
?>
Возвращает "dybhiZYdKG8pNCgCFkbV6g=="
? Что я делаю не так?
1 answers
Вы столкнулись с этой проблемой, потому что размер ключа Triple DES составляет 168 бит (21 байт), но MD5 генерирует хэши длиной всего 16 байт (128 бит).
Это означает, что ключ должен быть расширен до 168 бит, чтобы тройной DES мог работать. Оказывается, что этот вывод от 128 бит до 168 бит работает в C# иначе, чем в PHP, поэтому эффективно используемый ключ отличается, что приводит к различным зашифрованным данным.
Теперь у вас есть два параметры:
Вариант 1: Выберите шифр, который напрямую поддерживает 128-битные ключи
Вы можете избежать всех проблем, связанных с различиями в размерах ключей i