2011-08-09 66 views
0

PHPでこの関数を使用してデータを暗号化し、C#の他の関数で解読しようとしました。しかし、私は同じ文字列を取得しません。PHPでAESを暗号化し、C#で解読する

//php function 
    public function onCrypt($text) 
    { 
    $key=md5('DFDFDFDFDFDFDFDFDFDFDFDF',true); 

    $crypttext = urldecode(trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 

    $text_crp =base64_encode($crypttext); 


    return $text_crp; 
      } 

// C#の機能

//パブリック静的な無効DecryptFile パラメータ: strKey:復号化に選びましキー。 PathPlainTextFile:暗号化されたファイルのパス PathPlainTextFile:復号化された元のファイル。一目で

public static void DecryptFile(string strKey, string pathPlainTextFile, string pathCypheredTextFile)  
    { 

//crypt key with md5 function   
System.Security.Cryptography.MD5 alg = System.Security.Cryptography.MD5.Create(); 
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
byte[] md5val = alg.ComputeHash(enc.GetBytes(strKey)); 


StreamReader fsPlainTextFile = File.OpenText(pathPlainTextFile);  
FileInfo t = new FileInfo(pathCypheredTextFile); 
StreamWriter Tex =t.CreateText(); 
string input = null; 
while ((input = fsPlainTextFile.ReadLine()) != null) 
{ 


     byte[] cipheredData = Convert.FromBase64String(input); 

      RijndaelManaged rijndaeld = new RijndaelManaged(); 

      // define the used mode 
      rijndaeld.Mode = CipherMode.ECB; 

      // create the cipher AES - Rijndael 
      ICryptoTransform decryptor = rijndaeld.CreateDecryptor(md5val,null); 

      // Write the ciphered data in MemoryStream 
      MemoryStream ms= new MemoryStream(cipheredData); 
      CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); 

       // Insert the ciphered data in a byte array 
       byte[] plainTextData = new byte[cipheredData.Length]; 

      int decryptedByteCount = cs.Read(plainTextData, 0, plainTextData.Length); 

      ms.Close(); 
      cs.Close(); 


    // Insert the ciphered data in string encoded on Base64   
Tex.WriteLine (Encoding.UTF8.GetString(plainTextData, 0, decryptedByteCount)); 





} 

Tex.Close();  


    } 

答えて

0

、あなたがC#の解読にIVを供給していない:

ICryptoTransform decryptor = rijndaeld.CreateDecryptor(md5val, null); 

私は、PHPに慣れていないんだけど、あなたは暗号化されたときにIVを作成したように見えますコンテンツ。同じIVをC#コードで解読する必要があります(phpで解読を行っていたとしても同じIVを解読する必要があります)。

+0

rijndaeld.Padding = Padding.zero; –

+0

私は私のソリューションを試してみるが、私は同じ答えを –

+0

ECBモードはIVを使用しないと思う。 –

1

ECBモードは安全ではありません。 CTRモードまたはCBCモードを使用する必要があります。また、両端で使用するパディングを明示的に指定することも最善です。

+0

しかし、私はデータベースIVにベクトルIVを保存したくありません。 –

+0

CTRモードはIVを必要とせず、ノンスだけを小さくすることができます。 – rossum

関連する問題