C#PHP AES 256 CBC加密

C#PHP AES 256 CBC加密,c#,php,encryption,aes,C#,Php,Encryption,Aes,您好,我正在尝试使用PHP和AES 256 CBC模式加密服务器上的文件/字符串, 由于字符串以“\0”结尾,我可以轻松地删除AES添加的填充,但对于文件,我无法删除,因为其中一些包含空字节。在发送数据之前,我将其编码为base64字符串 这是我的C#解密函数 internal static byte[] __AES_DECRYPT(byte[] input, string _key, string _iv) { var myRijndael = new Rijndae

您好,我正在尝试使用PHP和AES 256 CBC模式加密服务器上的文件/字符串, 由于字符串以“\0”结尾,我可以轻松地删除AES添加的填充,但对于文件,我无法删除,因为其中一些包含空字节。在发送数据之前,我将其编码为base64字符串

这是我的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);
}

如果不想更改为另一种形式的填充,只需在文件内容的末尾附加一个1字节,在解密时,在删除任何尾随的空值后,再删除附加的1字节。您不会意外删除属于该文件的任何0字节。

MCRYPT_RIJNDAEL_256
不是AES。如果您使该字节具有值
80
,则会实现位填充。所以这实际上是一种不同于零填充的填充。这也意味着它当然会起作用。请注意,
trim
将从文件的末尾以及前面删除“字符”。