Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C加密的OpenSSL PHP解密AES消息#_C#_Php_Encryption_Openssl_Aes - Fatal编程技术网

C# 用C加密的OpenSSL PHP解密AES消息#

C# 用C加密的OpenSSL PHP解密AES消息#,c#,php,encryption,openssl,aes,C#,Php,Encryption,Openssl,Aes,我有两个应用程序,一个用C#编写,另一个用PHP编写 C#应用程序使用AES 256 CBC对消息进行加密。用于加密的密钥位于类中硬编码的字节[]属性中。初始化向量也是硬编码的,并且始终是相同的 C#应用 然后,在我的PHP应用程序中,我想使用OpenSSL对c#生成的消息进行解密。 我使用C#中使用的相同键和iv。我将它们转换为字符,因为函数只接受字符串 PHP 私有函数解密(字符串$message) { $stringOf=函数($bytes){ 返回内爆(“”,数组映射('chr',$by

我有两个应用程序,一个用C#编写,另一个用PHP编写

C#应用程序使用AES 256 CBC对消息进行加密。用于加密的密钥位于类中硬编码的
字节[]
属性中。初始化向量也是硬编码的,并且始终是相同的

C#应用 然后,在我的PHP应用程序中,我想使用OpenSSL对c#生成的消息进行解密。 我使用C#中使用的相同键和iv。我将它们转换为字符,因为函数只接受字符串

PHP
私有函数解密(字符串$message)
{
$stringOf=函数($bytes){
返回内爆(“”,数组映射('chr',$bytes));
};
$key=[142237,…];
$iv=[132,…];
$result=openssl\u解密(
base64_解码($message),
“aes-256-cbc”,
$stringOf($key),
1.
$4(共$4)
);
if(is_bool($result)&&!$result){
返回新错误('Error:'.openssl_Error_string());
}
返回$result;
}
当我试图解密时,我得到了这个错误

错误:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:错误解密


我想这是我在尝试将键转换为字符串时犯的错误。因为我还有一个加密函数,它使用C#中使用的相同密钥和iv给我不同的结果。

我有一个加密函数,但另一个方法。长话短说,php和C#中的数组长度不同,因此在php代码PKCS7填充(默认值)中应用了C#代码零填充时,密钥就不同了。在两个代码中使用一致的填充,最好是PKCS7,因为它更可靠。@Topaco你说得对,我在每个代码上使用了不同的填充模式。我无法更改c#中的填充,因为该应用程序正在生产中。使用OPENSSL_ZERO_PADDING标志在PHP中解密消息时,库返回解密的消息,但在文本字符串的末尾添加条形字符。例如“mymessage//”。由于
openssl.
不支持零填充,因此唯一的选项是禁用PKCS7填充进行解密。这是通过
OPENSSL\u ZERO\u PADDING
完成的。请注意,该标志不启用零填充(名称选择不当)。因此,零填充的
0
-值保留,必须手动删除(例如,使用
rtrim($decrypted,“\0”);
)。但是,如果未添加的密文已经以
0
-值结尾,这些值也将被删除,因为信息缺少要删除的字节数。这与PKCS7填充不同,这就是为什么它比零填充更可靠。
byte[] key  = {142, 237, ....};
byte[] InitilizationVector  = {132, ...};
var mensajeSinEncriptar = "";

SymmetricAlgorithm algoritmo = SymmetricAlgorithm.Create("Rijndael");
algoritmo.BlockSize = 128;
algoritmo.Mode = CipherMode.CBC;
algoritmo.Padding = PaddingMode.Zeros;
algoritmo.KeySize = 256;
algoritmo.Key = key;
algoritmo.IV = InitilizationVector;

ICryptoTransform encriptador  = algoritmo.CreateEncryptor();
byte[] textoPlano = Encoding.Default.GetBytes(mensajeSinEncriptar);
MemoryStream memoryStream = new MemoryStream();

CryptoStream cryptoStream = new CryptoStream(memoryStream, encriptador, CryptoStreamMode.Write);
cryptoStream.Write(textoPlano, 0, textoPlano.Length);
cryptoStream.FlushFinalBlock();

memoryStream.Close();
cryptoStream.Close();

return Convert.ToBase64String(memoryStream.ToArray());