您好我尝试使用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);
}
答案 0 :(得分:1)
如果您不想更改为其他形式的填充,只需在文件内容的末尾附加一个1字节,并在解密后删除任何尾随空值,然后删除附加的1字节。您不会意外删除属于该文件的任何0个字节。