За последние 24 часа нас посетили 17669 программистов и 1658 роботов. Сейчас ищут 868 программистов ...

3des php != 3des ASP.NET

Тема в разделе "PHP для новичков", создана пользователем joga_and, 12 авг 2008.

  1. joga_and

    joga_and Активный пользователь

    С нами с:
    12 авг 2008
    Сообщения:
    6
    Симпатии:
    0
    Дело вот в чем: мне нужно пересылать пароль, со страницы написаной на PHP на страницу ASP.NET. Код на асп хочет зашифрованый пароль(по алгоритму 3des). Проблема в том что результаты работы этих алгоритмов не совпадают(тоись то шо шифруецца в пхп не совпадает с тем что шифруецца на асп). Буду благодарен за любую помощь
     
  2. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Чем шифруете?
     
  3. joga_and

    joga_and Активный пользователь

    С нами с:
    12 авг 2008
    Сообщения:
    6
    Симпатии:
    0
    Код (Text):
    1. $key = pack("C*",105,59,136,46,23,234,61,102,4,128,113,251,240,154,110,235,143,68,60,15,99,6,70,237);
    2. $iv = pack("C*",139,18,215,96,74,203,57,148);
    3. $td = mcrypt_module_open ('tripledes', '', 'cbc', '');
    4. mcrypt_generic_init($td, $key, $iv);
    5. $encrypted_data = mcrypt_generic($td, "12345");
    6. mcrypt_generic_end($td);
    7. $pass=base64_encode($encrypted_data);
    [/code]
     
  4. joga_and

    joga_and Активный пользователь

    С нами с:
    12 авг 2008
    Сообщения:
    6
    Симпатии:
    0
    Решить проблему не решил, но совместить пхп и асп в этом вопросе я сумел.
    Код асп:
    Код (Text):
    1.           public static string Encrypt (string strData, byte[] key, byte[] iv) {
    2.                byte[] data = Encoding.UTF8.GetBytes(strData);
    3.                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    4.                tdes.Key = key;
    5.                tdes.IV = iv;
    6.                ICryptoTransform encryptor = tdes.CreateEncryptor();
    7.                MemoryStream ms = new MemoryStream();
    8.                CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
    9.                cs.Write(data, 0, data.Length);
    10.                cs.FlushFinalBlock();
    11.                ms.Position = 0;
    12.                byte[] result = new byte[ms.Length];
    13.                ms.Read(result, 0, (int)ms.Length);
    14.                cs.Close();
    15.                return Convert.ToBase64String(result);
    16.           }
    Несовместимость была вот в чем:
    TripleDESCryptoServiceProvider по-умолчанию использует System.Security.Cryptography.PaddingMode.PKCS7.
    Пояснение: 3des - это блочный алгоритм. Тоесть шифрование выполняется над блоком информации.
    PKCS7 - это способ дозаполнения неполных блоков.
    В пхп блоки дозаполняются нулями.
    Решение - tdes.Padding = System.Security.Cryptography.PaddingMode.Zeros;
    Новый код:
    Код (Text):
    1.         public static string Encrypt(string strData, byte[] key, byte[] iv)
    2.         {
    3.             byte[] data = Encoding.UTF8.GetBytes(strData);
    4.             TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    5.             tdes.Key = key;
    6.             tdes.IV = iv;
    7.             tdes.Padding = System.Security.Cryptography.PaddingMode.Zeros;
    8.             ICryptoTransform encryptor = tdes.CreateEncryptor();
    9.             MemoryStream ms = new MemoryStream();
    10.             CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
    11.             cs.Write(data, 0, data.Length);
    12.             cs.FlushFinalBlock();
    13.             ms.Position = 0;
    14.             byte[] result = new byte[ms.Length];
    15.             ms.Read(result, 0, (int)ms.Length);
    16.             cs.Close();
    17.             string qwe = Convert.ToBase64String(result);
    18.             byte[] qwe1 = Convert.FromBase64String(qwe);
    19.             return Convert.ToBase64String(result);
    20.         }
    Но вопрос остается - как сделать так чтобы результаты совпали без вмешательства в код асп, используя только пхп
     
  5. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
  6. Anonymous

    Anonymous Guest

  7. joga_and

    joga_and Активный пользователь

    С нами с:
    12 авг 2008
    Сообщения:
    6
    Симпатии:
    0
    Большое спасиба за помощь. Сам найти не смог бы, так как английский - не моя сильная сторона.

    Итог:

    При шифровании в ASP.NET, по-умолчанию используется способ дозаполнения неполных блоков System.Security.Cryptography.PaddingMode.PKCS7.
    В PHP - если говорить используя константы ASP.NET - System.Security.Cryptography.PaddingMode.Zeros.
    Для совместимости со стороны ASP.NET нужно использовать способ из сообщения №4.
    А для совместимости со стороны PHP - способы описаные в пятом и шестом сообщении.