2014-06-23 196 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 *中删除。 –