2009-06-24 14 views
2

私は一端にPHP暗号化アルゴリズムを持ち、もう片方に.Net暗号化アルゴリズムを持っています。私はmcrypt_decryptをPHPコードの解読目的で使用しており、.Netのmcrypt_encryptに相当するものを探しています。具体的には、私は.NETに変換するPHPコードは以下の通りです:.Net内のMCRYPT

$cipher_alg = MCRYPT_RIJNDAEL_128; 
$iv = mcrypt_create_iv (mcrypt_get_iv_size ($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND); 

$encrypted_string = mcrypt_encrypt ($cipher_alg, $sessionkey, $string, MCRYPT_MODE_CBC, $iv); 
$hex_encrypted_string = bin2hex ($encrypted_string); 

は、.NETのmcrypt_encryptの同等はありますか?

+0

'mcrypt_create_iv()' + 'MCRYPT_MODE_ECB'は高価' NOP'です。 –

答えて

3

私はa solution in my blogと出てきました。ここで

は抜粋です。もう一つ注意すべきは、

private static string CreateEncryptedString(string myString, string hexiv, string key) 
    { 
     RijndaelManaged alg = new RijndaelManaged(); 
     alg.Padding = PaddingMode.Zeros; 
     alg.Mode = CipherMode.CBC; 
     alg.BlockSize = 16 * 8; 
     alg.Key = ASCIIEncoding.UTF8.GetBytes(key); 
     alg.IV = StringToByteArray(hexiv); 
     ICryptoTransform encryptor = alg.CreateEncryptor(alg.Key, alg.IV); 

     MemoryStream msStream = new MemoryStream(); 
     CryptoStream mCSWriter = new CryptoStream(msStream, encryptor, CryptoStreamMode.Write); 
     StreamWriter mSWriter = new StreamWriter(mCSWriter); 
     mSWriter.Write(myString); 
     mSWriter.Flush(); 
     mCSWriter.FlushFinalBlock(); 

     var EncryptedByte = new byte[msStream.Length]; 
     msStream.Position = 0; 
     msStream.Read(EncryptedByte, 0, (int)msStream.Length); 

     return ByteArrayToHexString(EncryptedByte); 

    } 

    public static byte[] StringToByteArray(String hex) 
    { 
     int NumberChars = hex.Length; 
     byte[] bytes = new byte[NumberChars/2]; 
     for (int i = 0; i < NumberChars; i += 2) 
      bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
     return bytes; 
    } 

    public static string ByteArrayToHexString(byte[] ba) 
    { 
     StringBuilder hex = new StringBuilder(ba.Length * 2); 
     foreach (byte b in ba) 
      hex.AppendFormat("{0:x2}", b); 
     return hex.ToString(); 
    } 

があります。キーサイズは16でなければなりません。つまり、キーパラメータは16文字の文字列でなければなりません。そうしないと、暗号化が機能せず、CryptographicExceptionがスローされます。 PHP側の

は、ここにあなたがデコードを行う方法は次のとおりです。

$cipher_alg = MCRYPT_RIJNDAEL_128; 
$decrypted_string = mcrypt_decrypt($cipher_alg, $key, 
$encrypted_string , MCRYPT_MODE_CBC, trim(hex2bin(trim($hexiv)))); 
1

直接的には対応していませんが、128ビットのRijndaelがサポートされています(そしておそらく他の多くの暗号が必要です)。詳細と例については、Rijndaelクラスを参照してください。

基本的にフレームワークの暗号化部分は、暗号を名前で指定するのではなく、基本クラス(CryptoStreamSymmetricAlgorithmなど)の適切なインスタンスを指定することに基づいていますが、必要な作業を行うことができます。