2017-01-29 102 views
1

問題是,我期望這2個代碼返回相同的值,但結果是不一樣的。提供的密鑰和數據是相同的。AES加密不同的結果,在C#和PHP

這裏是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代碼,結果是: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,現在已經拋棄了近十年。因此它已被棄用,並將在PHP 7.2中從核心和PECL中刪除。它不支持標準的PKCS#7(néePKCS#5)填充,只有非標準的null填充甚至不能用於二進制數據。 mcrypt有許多可以追溯到2003年的突出錯誤。相反,考慮使用[defuse](https://github.com/defuse/php-encryption)或[RNCryptor](https://github.com/RNCryptor),它們提供了一個完整的解決方案,正在維護和正確。 – zaph

+0

@HamidYari Shift鍵壞了? –

回答

1

在C#的IV是一個整數字節數組的,在PHP中IV是一種字符串,它們是不一樣的。

例如:整數字節1的值爲0x01,字符"1"的值爲0x31。

+0

是的,因爲在php中,mcrypt函數只接受字符串作爲IV。你對此有何建議?我真的很困惑,我花了很多時間在上面。 – HamidYari

+1

您可以使用'\ x01'等。在PHP的文檔中很難找到它,例如它可以在[string](http://php.net/manual/en/language.types.string)中找到。 PHP)API文檔。 –