0

このC#クラスでエンコードされた文字列をPHPで復号化する必要があります(ここにあります)

システムを使用する;
System.Security.Cryptography の使用;
System.Text を使用します。

public static class 暗号化
{
   public static string Encrypt(文字列入力、文字列キー)
   {
      byte[] inputArray = UTF8Encoding.UTF8.GetBytes(入力);
      TripleDESCryptoServiceProvider tripleDES = 新しい TripleDESCryptoServiceProvider();
      tripleDES.Key = UTF8Encoding.UTF8.GetBytes(キー);
      tripleDES.Mode = CipherMode.ECB;
      tripleDES.Padding = PaddingMode.PKCS7;
      ICryptoTransform cTransform = tripleDES.CreateEncryptor();
      byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
      tripleDES.Clear();
      Convert.ToBase64String(resultArray, 0, resultArray.Length); を返します。
   }

   public static string Decrypt(文字列入力、文字列キー)
   {
      byte[] inputArray = Convert.FromBase64String(入力);
      TripleDESCryptoServiceProvider tripleDES = 新しい TripleDESCryptoServiceProvider();
      tripleDES.Key = UTF8Encoding.UTF8.GetBytes(キー);
      tripleDES.Mode = CipherMode.ECB;
      tripleDES.Padding = PaddingMode.PKCS7;
      ICryptoTransform cTransform = tripleDES.CreateDecryptor();
      byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
      tripleDES.Clear();
      UTF8Encoding.UTF8.GetString(resultArray) を返します。
   }
}

Web で見つけたさまざまな例を試してみましたが、何もうまくいかないようです。最初の問題は php mcrypt_generic_init の $iv パラメーターにあり、別の問題は php 関数にないパディングにあると思います。上記の c# Decrypt 関数を PHP に変換する方法を教えてください。ありがとうございました。

4

2 に答える 2

2

IV は ECB モードでは問題にならないため、無視できます。ただし、mcrypt はあまり寛大ではありません。偽物であっても、IV を提供する必要があります

// We'll be encrypting this data
    $key = 'password';
    $data = 'The quick brown fox jumped over the lazy dogs.';
    $encrypted = null;

// 3des in ECB mode
    $m = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null);
// Our IV will be enough NUL bytes to satisfy mcrypt.
    $fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($m));
    mcrypt_generic_init($m, $key, $fake_iv);
    $encrypted = mcrypt_generic($m, $data);
// "s/6HOXpVyMyFdSPYUgIgneMRY0o3Kubkwc++hSg9kC4Sw0TWsNTqzrhXY3z4PH9w"
    echo base64_encode($encrypted), "\n";
    unset($m);

// And now, in reverse!
    $n = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null);
// Another fake IV
    $fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($n));
    mcrypt_generic_init($n, $key, $fake_iv);
    $original = mdecrypt_generic($n, $encrypted);
// string(48) "The quick brown fox jumped over the lazy dogs."
    var_dump($original);

繰り返しますが、ECB モードに固執する場合にのみ、これを実行する必要があります。ECB モードはかなりひどい場合があります。詳細については、ブロック暗号モードに関するウィキペディアの記事を参照してください。

ここで扱わないのはパディングだけです。mcrypt ではパディング方法を選択できず、暗号に応じて異なる処理を行います。通常、パディングはまったく追加されません。

選択した埋め込み方法で NUL バイトを使用する場合は、相互運用性を確保するためにデータを自分で事前に埋め込む必要があります。とオプションを使用して、これを行うことができmcrypt_get_block_sizeますstr_padSTR_PAD_RIGHT

同様に、復号化した後、右側から NUL バイトを削除する必要がある場合があります。の 2 番目のパラメーターtrimが役立ちます。

于 2012-01-20T21:19:36.147 に答える