Я пытаюсь достичь той же самой концепции DES, что и у C # кода, но на PHP.
Код C # выглядит следующим образом:
public static string EncriptarCadena(string strEncriptar) { DESCryptoServiceProvider provider; MemoryStream stream; CryptoStream stream2; string str2; string str = "29393651"; byte[] buffer2 = new byte[] { 0x45, 50, 0xa5, 0x18, 0x67, 0x58, 0xac, 0xba }; byte[] bytes = new byte[0]; try { bytes = Encoding.UTF8.GetBytes(str.Substring(0, 8)); provider = new DESCryptoServiceProvider(); byte[] buffer = Encoding.UTF8.GetBytes(strEncriptar); stream = new MemoryStream(); stream2 = new CryptoStream(stream, provider.CreateEncryptor(bytes, buffer2), CryptoStreamMode.Write); stream2.Write(buffer, 0, buffer.Length); stream2.FlushFinalBlock(); str2 = Convert.ToBase64String(stream.ToArray()); } catch (Exception) { str2 = ""; } finally { provider = null; stream = null; stream2 = null; } return str2; }
И код, который я делал до сих пор в PHP, следующий:
function encrypt($string) { //Key $key = "29393651"; $ivArray=array( 0x45, 50, 0xa5, 0x18, 0x67, 0x58, 0xac, 0xba ); $iv=null; foreach ($ivArray as $element) $iv.=CHR($element); echo "Key: $key IV: $iv<br>"; $encrypted_string = mcrypt_encrypt(MCRYPT_DES, $key, $string, MCRYPT_MODE_CBC, $iv); return base64_encode($encrypted_string); }
Но я не могу найти, где проблема, поскольку они не дают того же результата для одного и того же ввода.
Любая помощь будет очень приветствуется 🙂
Проверьте наложение . PHP внутренне заполняет данные, которые будут зашифрованы с помощью двоичных NULL \x00
по умолчанию, который по умолчанию не является стандартным по умолчанию в .NET (скорее всего, они используют по умолчанию PKCS7).
Большое спасибо, ребята. Помог мне с той же проблемой. PKCS7 padding здесь: Как добавить / удалить дополнение PKCS7 из зашифрованной строки AES? просто измените ecb на cbc
вот краткий снимок, который я использовал:
$key = "29393651"; $iv = $key; $pass_enc = $mypassword; $block = mcrypt_get_block_size('des', 'cbc'); $pad = $block - (strlen($pass_enc) % $block); $pass_enc .= str_repeat(chr($pad), $pad); $pass_enc = mcrypt_encrypt(MCRYPT_DES, $key, $pass_enc, MCRYPT_MODE_CBC, $iv); $pass_enc = base64_encode ($pass_enc);