C # TripleDES ECB-шифрование при переполнении стека

Я в основном работаю с PHP, но я отправляю данные в API, который использует C # для шифрования, поэтому я пытаюсь зашифровать пароль в PHP, используя тот же метод, который используется в следующем коде C #:

System.Security.Cryptography.TripleDESCryptoServiceProvider DES = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
System.Security.Cryptography.MD5CryptoServiceProvider hashMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Key));
DES.Mode = System.Security.Cryptography.CipherMode.ECB;
System.Security.Cryptography.ICryptoTransform DESEncrypt = DES.CreateEncryptor();
Buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(Plaintext);
string TripleDES = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
return TripleDES;

Это то, что я до сих пор в PHP:








C# TripleDES ECB Encryption in PHP - Stack Overflow














































Решение

Я в основном работаю с PHP, но я отправляю данные в API, который использует C # для шифрования, поэтому я пытаюсь зашифровать пароль в PHP, используя тот же метод, который используется в следующем коде C #:

System.Security.Cryptography.TripleDESCryptoServiceProvider DES = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
System.Security.Cryptography.MD5CryptoServiceProvider hashMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Key));
DES.Mode = System.Security.Cryptography.CipherMode.ECB;
System.Security.Cryptography.ICryptoTransform DESEncrypt = DES.CreateEncryptor();
Buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(Plaintext);
string TripleDES = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
return TripleDES;

Это то, что я до сих пор в PHP:

    function encryptData($key, $plainText)
{

$byte = mb_convert_encoding($key, 'ASCII');
$desKey = md5(utf8_encode($byte), true);
$data = mb_convert_encoding($plainText, 'ASCII');

// add PKCS#7 padding
$blocksize = mcrypt_get_block_size('tripledes', 'ecb');
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);

// encrypt password
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');

echo base64_encode($encData);
}

Я знаю, что мне нужно было добавить истинный аргумент для функции md5, и я знаю, что мне нужно было добавить заполнение PKCS7.

У меня не было возможности сравнить его с кодом C #, потому что я все еще устанавливаю Visual Studio на свой компьютер. Я что-то пропустил? Нужно ли добавлять IV?

РЕДАКТИРОВАТЬ: я проверил код C #, и увидел, что он не дает тот же результат. Я исправил некоторые вещи, и теперь в PHP есть переменные DES.Key и Buffer из C #, которые дают правильные результаты.

РЕДАКТИРОВАТЬ снова: это исправлено. Все, что мне нужно было сделать, это добавить первые 8 символов в конец хешированного ключа.

$desKey .= substr($desKey,0,8);
самый старый "data-shortcut =" O

Другие решения

Это то, что я в конце концов придумал. Пока это работает для меня на нескольких примерах, которые я пробовал.

function encryptData($key, $plainText)
{

$byte = mb_convert_encoding($key, 'ASCII');
$desKey = md5(utf8_encode($byte), true);
$desKey .= substr($desKey,0,8);

$data = mb_convert_encoding($plainText, 'ASCII');

// add PKCS#7 padding
$blocksize = mcrypt_get_block_size('tripledes', 'ecb');
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);

// encrypt password
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');

echo base64_encode($encData);
}

encryptData('key', 'pass');
голосует "data-shortcut =" V

1
По вопросам рекламы [email protected]