Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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# 无法在php和C中获得相同的Rijndael加密结果#_C#_Php_Phpseclib_Encryption Symmetric_Rijndaelmanaged - Fatal编程技术网

C# 无法在php和C中获得相同的Rijndael加密结果#

C# 无法在php和C中获得相同的Rijndael加密结果#,c#,php,phpseclib,encryption-symmetric,rijndaelmanaged,C#,Php,Phpseclib,Encryption Symmetric,Rijndaelmanaged,现有的C#实现通过实现RijndaelManaged()对字符串进行加密,如下所示: 使用系统; 使用System.IO; 使用System.Security.Cryptography; 使用系统文本; 名称空间示例 { 班级计划 { 静态void Main(字符串[]参数) { var sKey=“ABCDEF0123456789ABCDEF0123456789”; var sData=“一些数据”; var bData=Encoding.ASCII.GetBytes(sData); var

现有的C#实现通过实现
RijndaelManaged()
对字符串进行加密,如下所示:

使用系统;
使用System.IO;
使用System.Security.Cryptography;
使用系统文本;
名称空间示例
{
班级计划
{
静态void Main(字符串[]参数)
{
var sKey=“ABCDEF0123456789ABCDEF0123456789”;
var sData=“一些数据”;
var bData=Encoding.ASCII.GetBytes(sData);
var oAes=new RijndaelManaged();
Key=Encoding.ASCII.GetBytes(sKey.Substring(0,32));
oAes.IV=Encoding.ASCII.GetBytes(sKey.Substring(0,16));
var bEncrypted=oAes.CreateEncryptor(oAes.Key,oAes.IV).TransformFinalBlock(bData,0,bData.Length);
Console.WriteLine(Convert.ToBase64String(benchrypted));
//输出:NXyPbSVtB5LomNcsPK7cgg==
}
}
}
给定相同的输入,php实现必须产生相同的结果,以便比较两个结果字符串

我尝试过的所有库都缺少类似的方法

不幸的是,C#实现无法更改——我们必须找到一个工作正常的php实现

类似的php实现(使用库)如下所示:


确保您也匹配填充算法。也许您不需要在php中使用这些
getBytes
?旁注:将密钥的一半用作IV不是一个很好的主意。@SevaAlekseyev
PKCS7
在.net端默认使用填充,但phpseclib在默认情况下似乎使用
PKCS12
。不过,我看不到更改phpseclib中填充的方法。您现在在php中使用数字加密字符串,而不是“字节数组”。为了澄清上述注释,getBytes创建了带有数字的字符串,例如“8311110910132689711697”,这就是您加密的内容,而不是“某些数据”。您可能会注意到,由于该字符串比“某些数据”长,因此生成的base64字符串也更长(因为AES是块密码)。钥匙和iv的故事是一样的。