Дело вот в чем: мне нужно пересылать пароль, со страницы написаной на PHP на страницу ASP.NET. Код на асп хочет зашифрованый пароль(по алгоритму 3des). Проблема в том что результаты работы этих алгоритмов не совпадают(тоись то шо шифруецца в пхп не совпадает с тем что шифруецца на асп). Буду благодарен за любую помощь
Код (Text): $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); $iv = pack("C*",139,18,215,96,74,203,57,148); $td = mcrypt_module_open ('tripledes', '', 'cbc', ''); mcrypt_generic_init($td, $key, $iv); $encrypted_data = mcrypt_generic($td, "12345"); mcrypt_generic_end($td); $pass=base64_encode($encrypted_data); [/code]
Решить проблему не решил, но совместить пхп и асп в этом вопросе я сумел. Код асп: Код (Text): public static string Encrypt (string strData, byte[] key, byte[] iv) { byte[] data = Encoding.UTF8.GetBytes(strData); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = key; tdes.IV = iv; ICryptoTransform encryptor = tdes.CreateEncryptor(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); ms.Position = 0; byte[] result = new byte[ms.Length]; ms.Read(result, 0, (int)ms.Length); cs.Close(); return Convert.ToBase64String(result); } Несовместимость была вот в чем: TripleDESCryptoServiceProvider по-умолчанию использует System.Security.Cryptography.PaddingMode.PKCS7. Пояснение: 3des - это блочный алгоритм. Тоесть шифрование выполняется над блоком информации. PKCS7 - это способ дозаполнения неполных блоков. В пхп блоки дозаполняются нулями. Решение - tdes.Padding = System.Security.Cryptography.PaddingMode.Zeros; Новый код: Код (Text): public static string Encrypt(string strData, byte[] key, byte[] iv) { byte[] data = Encoding.UTF8.GetBytes(strData); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = key; tdes.IV = iv; tdes.Padding = System.Security.Cryptography.PaddingMode.Zeros; ICryptoTransform encryptor = tdes.CreateEncryptor(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); ms.Position = 0; byte[] result = new byte[ms.Length]; ms.Read(result, 0, (int)ms.Length); cs.Close(); string qwe = Convert.ToBase64String(result); byte[] qwe1 = Convert.FromBase64String(qwe); return Convert.ToBase64String(result); } Но вопрос остается - как сделать так чтобы результаты совпали без вмешательства в код асп, используя только пхп
Насколько я понял, mcrypt просто не умеет pkcs7 http://mishu666.wordpress.com/2007/08/2 ... eprovider/ Может пригодится?
Большое спасиба за помощь. Сам найти не смог бы, так как английский - не моя сильная сторона. Итог: При шифровании в ASP.NET, по-умолчанию используется способ дозаполнения неполных блоков System.Security.Cryptography.PaddingMode.PKCS7. В PHP - если говорить используя константы ASP.NET - System.Security.Cryptography.PaddingMode.Zeros. Для совместимости со стороны ASP.NET нужно использовать способ из сообщения №4. А для совместимости со стороны PHP - способы описаные в пятом и шестом сообщении.