Шифрование PHP, совместимое с шифрованием C #

у меня есть этот код шифрования c #:

 public class Cryptor_Engine
{
/// <summary>
/// Encrypt a string using dual encryption method. Return a encrypted cipher Text
/// </summary>
/// <param name="toEncrypt">string to be encrypted</param>
/// <param name="useHashing">use hashing? send to for extra secirity</param>
/// <returns></returns>
public static string Encrypt(string toEncrypt, string key, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(key);

TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;

ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
/// </summary>
/// <param name="cipherString">encrypted string</param>
/// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
/// <returns></returns>
public static string Decrypt(string cipherString, string key, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = Convert.FromBase64String(cipherString);

System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
//Get your key from config file to open the lock!
//string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
}
else
keyArray = UTF8Encoding.UTF8.GetBytes(key);

TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;

ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

tdes.Clear();
return UTF8Encoding.UTF8.GetString(resultArray);
}
}

Приведенный выше код шифрует и дешифрует текст на основе предоставленного ключа. Мне нужен совместимый код PHP, который даст мне тот же ключ, что и приведенный выше алгоритм? Можно ли использовать как php, так и c #, чтобы иметь одинаковый зашифрованный текст?

-1

Решение

шифрование

Во-первых, если $useHashing это правда, нам нужно запустить алгоритм MD5 на $key

function encrypt($toEncrypt, $key, $useHashing) {
if ($useHashing) {
$key = md5($key);
}

Далее нам нужно дополнить его, используя алгоритм PKCS7. В PKCS7 последний байт строки определяет длину заполнения, поэтому нам нужно выяснить, какой объем заполнения требуется, а затем добавить его.

    $blockSize = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
$len = strlen($toEncrypt);
$pad = $blockSize - ($len % $blockSize);
$toEncrypt .= str_repeat(chr($pad), $pad);

Далее мы делаем шифрование с использованием расширения Mcrypt.

    $encrypted = mcrypt_encrypt(MCRYPT_3DES, $key, $toEncrypt, MCRYPT_MODE_ECB);

Наконец, закодируйте зашифрованную строку как Base64.

    return base64_encode($encrypted);

Таким образом, полная функция выглядит так:

function encrypt($toEncrypt, $key, $useHashing) {
if ($useHashing) {
$key = md5($key);
}

$blockSize = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
$len = strlen($toEncrypt);
$pad = $blockSize - ($len % $blockSize);
$toEncrypt .= str_repeat(chr($pad), $pad);

$encrypted = mcrypt_encrypt(MCRYPT_3DES, $key, $toEncrypt, MCRYPT_MODE_ECB);

return base64_encode($encrypted);
}

Дешифрирование

Сначала вы получаете зашифрованный шифр как Base64, поэтому вам нужно его расшифровать.

function decrypt($cipherString, $key, $useHashing) {
$decoded = base64_decode($cipherString);
...

Тогда, если useHashing верно, нам нужно запустить алгоритм md5 на ключе.

    if ($useHashing) {
$key = md5($key);
}

Теперь у нас есть наш ключ и декодированная строка, мы можем фактически расшифровать данные.

    $decrypted = mcrypt_decrypt(MCRYPT_3DES, $key, $decoded, MCRYPT_MODE_ECB);

$decrypted содержит расшифрованную строку с дополнением. Чтобы удалить заполнение, нам нужно найти целочисленное значение последнего байта:

    $len = strlen($decrypted);
$pad = ord($decrypted[$len-1]);

Сейчас $pad является целым числом, которое указывает, насколько велик отступ, так что просто верните часть строки перед заполнением.

    return substr($decrypted, 0, $len - $pad);

Итак, сложив все вместе, мы имеем:

function decrypt($cipherString, $key, $useHashing) {
$decoded = base64_decode($cipherString);

if ($useHashing) {
$key = md5($key);
}

$decrypted = mcrypt_encrypt(MCRYPT_3DES, $key, $decoded, MCRYPT_MODE_ECB);

$len = strlen($decrypted);
$pad = ord($decrypted[$len-1]);

return substr($decrypted, 0, $len - $pad);
}

Безопасность

Если это вообще возможно, вы должны посмотрите на использование AES, а не 3DES а также более безопасный режим шифрования, чем ECB.

2

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

Других решений пока нет …

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