2017-01-29 20 views
1

問題は、これらの2つのコードが同じ値を返すと予想されますが、結果が同じではないことです。提供されるキーとデータは同じです。C#とPHPでAES暗号化の結果が異なる

ここはC#のメインコードです。結果は:JzhfuV7T8BI9NnYsFdHIDw==

public static RijndaelManaged GetCryptoTransform(string key) 
    { 
     string key_string64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(key)); 
     Console.WriteLine(key_string64); 

     RijndaelManaged aes = new RijndaelManaged(); 
     aes.BlockSize = 128; 
     aes.KeySize = 256; 

     aes.Mode = CipherMode.CBC; 
     aes.Padding = PaddingMode.PKCS7; 

     byte[] keyArr = Convert.FromBase64String(key_string64); 
     byte[] KeyArrBytes32Value = new byte[keyArr.Length]; 
     Array.Copy(keyArr, KeyArrBytes32Value, keyArr.Length); 


     byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; 

     byte[] IVBytes16Value = new byte[16]; 


     Array.Copy(ivArr, IVBytes16Value, 16); 

     aes.Key = KeyArrBytes32Value; 
     aes.IV = IVBytes16Value; 

     return aes; 
    } 
    public static string Encrypt(string PlainText, string key) 
    { 
     var aes = GetCryptoTransform(key); 
     var encrypto = aes.CreateEncryptor(); 
     byte[] plainTextByte = ASCIIEncoding.UTF8.GetBytes(PlainText); 


     byte[] CipherText = encrypto.TransformFinalBlock(plainTextByte, 0, plainTextByte.Length); 

     return Convert.ToBase64String(CipherText); 

    } 

、ここでは、PHPコードであり、結果は:C#のztykbceGV0SZqh/MyBInXQ==

function aes128_cbc_encrypt($key, $data) { 
    $iv = "1234566543217777"; 
    $keyString = base64_encode ($key); 
    $padding = 16 - (strlen ($data) % 16); 
    $data .= str_repeat (chr ($padding), $padding); 
    return mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $keyString, $data, MCRYPT_MODE_CBC, $iv); 
} 
+0

mcryptを使用しないことをお勧めします。これは、現在では約10年前から放棄されました。このため、PHP 7.2では非推奨となり、コアからPECLに削除されます。標準のPKCS#7(néePKCS#5)パディングはサポートされていません。バイナリデータでも使用できない非標準のヌルパディングのみがサポートされています。 mcryptには、2003年の傑出したバグがたくさんあります。代わりに、[defuse](https://github.com/defuse/php-encryption)や[RNCryptor](https://github.com/RNCryptor)の使用を検討すると、完全な解決策は、維持されており、正しいです。 – zaph

+0

@HamidYari Shiftキーが壊れていますか? –

答えて

1

IVはIVであるPHPで、整数バイトのアレイでありますそれらは同じではありません。

例:整数バイトの1は0x01の値を持ち、"1"の値は0x31です。

+0

はい、phpのため、mcrypt関数は単に文字列をIVとして受け入れます。あなたはそれについて何を提案しますか?私は本当に混乱していて、私はそれに多くの時間を費やしています。 – HamidYari

+1

'\ x01'などを使うことができます。PHPのドキュメントで見つけるのは難しいです。たとえば、[string](http://php.net/manual/en/language.types.string)にあります。 php)APIドキュメント。 –