2014-06-23 200 views
-1

您好,我正在嘗試使用PHP和AES加密我的服務器上的文件/字符串256 CBC模式, 由於字符串以'\ 0'結尾,我可以很容易地從它們中刪除填充, ,但與文件我不能因爲其中一些包含空字節。在我發送數據之前,我將它編碼爲base64字符串。C#PHP AES 256 CBC加密

這裏是我的C#解密函數

internal static byte[] __AES_DECRYPT(byte[] input, string _key, string _iv) 
    { 
     var myRijndael = new RijndaelManaged() 
     { 
      Padding = PaddingMode.Zeros, 
      Mode = CipherMode.CBC, 
      KeySize = 256, 
      BlockSize = 256 
     }; 
     byte[] key = Encoding.ASCII.GetBytes(_key); 
     byte[] iv = Encoding.ASCII.GetBytes(_iv); 
     var decryptor = myRijndael.CreateDecryptor(key, iv); 
     var sEncrypted = input; 
     var fromEncrypt = new byte[sEncrypted.Length]; 
     var msDecrypt = new MemoryStream(sEncrypted); 
     var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); 
     csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); 
     return fromEncrypt; 
    } 

此功能工作正常的字符串和字節太多。 我相信PHP加密函數對於文件來說是錯誤的,但對字符串起作用。

function encrypt($str) 
{ 
    $key = 'keygoeshere'; 
    $iv = "ivgoeshere"; 
    $str =mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $str, MCRYPT_MODE_CBC, $iv); 
//$str = str_replace("\0","",$str); this works for strings but not files. 
    return base64_encode($str); 
} 
+0

'MCRYPT_RIJNDAEL_256'不是AES。 –

回答

1

如果你不想改變填充的另一種形式,只是一個單一的1個字節附加到文件內容結束後,和解密,刪除任何尾隨零點後,再去掉附加1字節。您不會意外刪除屬於該文件的任何0字節。

+1

如果你讓那個字節的值爲80,那麼你會實現位填充。所以實際上*是一種不同於零填充的填充。這也意味着它當然會起作用。需要警告的是,'trim'會從文件的末尾刪除「字符」,也會從文件的* front *中刪除。 –