Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# RijndaelManaged加密的不一致行为_C#_Encryption_Rijndael_Encryption Symmetric - Fatal编程技术网

C# RijndaelManaged加密的不一致行为

C# RijndaelManaged加密的不一致行为,c#,encryption,rijndael,encryption-symmetric,C#,Encryption,Rijndael,Encryption Symmetric,我在RijndaelManaged遇到了一个奇怪的问题。基本上,我有一个新的实例,其中我设置了密码、填充、IV和密钥。然后我创建另一个实例,并将以下属性的相同值从原始实例分配给第二个实例:Mode、Padding、KeySize、FeedbackSize、BlockSize、IV和Key 所以,将所有属性值从实例1复制到实例2后,我应该得到相同的结果,对吗?错了!这两个实例的GetHashCode()在某种程度上有所不同,但是如果我转储它们的属性(如上所述),那么它们都是相同的 如果我加密一个长

我在RijndaelManaged遇到了一个奇怪的问题。基本上,我有一个新的实例,其中我设置了密码、填充、IV和密钥。然后我创建另一个实例,并将以下属性的相同值从原始实例分配给第二个实例:Mode、Padding、KeySize、FeedbackSize、BlockSize、IV和Key

所以,将所有属性值从实例1复制到实例2后,我应该得到相同的结果,对吗?错了!这两个实例的GetHashCode()在某种程度上有所不同,但是如果我转储它们的属性(如上所述),那么它们都是相同的

如果我加密一个长度等于块大小(16字节,128位)的文本字符串,则两者产生相同的结果,如果输入小于块大小,则加密结果不相同

我用它来创建初始Rijndael实例

    public static RijndaelManaged CreateSymmetricKey(string passphrase)
    {
        RijndaelManaged symCrypto = new RijndaelManaged();
        symCrypto.Mode = CipherMode.CBC;               
        symCrypto.Padding = PaddingMode.PKCS7;
        byte[] salt = Encoding.UTF8.GetBytes("dummy dummy dummy dummy test");
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(passphrase, salt);
        symCrypto.Key = key.GetBytes(symCrypto.KeySize / 8);
        symCrypto.IV = key.GetBytes(symCrypto.BlockSize / 8);

        return symCrypto;
    }
为了示例起见,要加密字符串,请执行以下操作:

private string Encrypt(RijndaelManaged rm, string text)
    {
        byte[] encrypted;
        // Create a decrytor to perform the stream transform.
            ICryptoTransform encryptor = rm.CreateEncryptor(rm.Key, rm.IV);
        using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        //Write all data to the stream.
                        swEncrypt.Write(text);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        return BitConverter.ToString(encrypted);
    }
那么就这样做吧

RijndaelManaged rm1 = CreateSymmetricKey("there is something weird happening");
RijndaelManaged rm2 = new RijndaelManaged();
// copy ALL public properties to the new instance so that it has the same parameters
rm2.BlockSize = rm1.BlockSize; // 128
rm2.FeedbackSize = rm1.FeedbackSize; // 128
rm2.KeySize = rm1.KeySize; // 256
rm2.Mode = rm1.Mode; // CBC
rm2.Padding = rm1.Padding; // PKCS7
rm2.IV = rm1.IV;
rm2.Key = rm1.Key;
// Encryption
string cypher1 = Encrypt(rm1, "this is a test 6");  // length equal to BlockSize
string cypher2 = Encrypt(rm2, "this is a test 6");  // length equal to BlockSize
string cypher11 = Encrypt(rm1, "this is a test");  // length less than BlockSize
string cypher21 = Encrypt(rm2, "this is a test");  // length less than BlockSize
我得到的是cyper1==cypher2和cypher11!=cypher21还包括rm1.GetHashCode()!=GetHashCode()但是所有的公共参数都是相同的


我还转储了这两个实例的所有公共属性,以查看是否缺少某些内容,但所有值都是相同的。

您不应该以这种方式使用
GetHashCode()
。对于未重写基
对象.GetHashCode()
实现的类,它将返回此特定实例的整数处理程序。
由于两个不同实例的句柄总是不同的,因此永远不会匹配

另外,
GetHashCode()
实际上从未保证唯一性,它只是在测试实际相等性之前用作一个轻量级的预检查。
这在任何类型的散列数据结构(如字典等)中都大量使用

有关此主题的更多信息:

我还执行了您的代码,对我来说,情况如下:

cyper1 == cypher2 and cypher11 == cypher21

我很确定问题在于比较
GetHashCode()

我不确定这是否是解决方案,但您可能希望在转换为数组之前调用流上的FlushFinalBlock。我似乎还记得,没有它就不能正常工作。我无法重新创建
cyper11!=cyperh21
。基于我之前的评论,我不希望哈希代码匹配。不过,为了提供所有必需的代码,我复制了您的代码并运行了它,得到了与@AustinSalonen相同的结果。cypher1==cypher2和cypher11==cypher21。