Rijndael:多台机器上的输入/输出相同

时间:2012-10-09 11:21:55

标签: c# rijndael

我编写的一些软件使用.Net4.0中的Rijndael算法来加密和解密许可证信息。

问题如下: 程序生成一个字符串,转换为byte []。然后将此字节[]用Rijndael加密到另一个字节[],然后传输到其他计算机。 在那里,这个加密的byte []再次被解密,结果byte []再次转换回一个字符串以从中检索信息。

基本上这种方法非常好......但我认为并不是那么完美。

我们办公室里有一台计算机似乎以不同的方式加密和解密。

如果我尝试解密另一台计算机上的byte [],它会给我一些类似的东西:

{"Zeichenabstände sind ungültig und können nicht entfernt werden."}
 bei System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
 bei System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
 bei System.Security.Cryptography.CryptoStream.FlushFinalBlock()
 bei System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
 bei System.IO.Stream.Close()

执行加密的代码如下所示:

private byte[] EncryptBytes(byte[] originalBytes) {
    MemoryStream ms = new MemoryStream();
    Rijndael crypt = Rijndael.Create();
    crypt.Key = KeyBytes;
    crypt.IV = IVBytes;
    CryptoStream cs = new CryptoStream(ms, crypt.CreateEncryptor(), CryptoStreamMode.Write);
    cs.Write(originalBytes, 0, originalBytes.Length);
    cs.Close();
    Byte[] cryptedBytes = ms.ToArray();
    ms.Close();
    return cryptedBytes;
}

对于解密它只是使用CreateDecryptor()而不是CreateEncryptor()。

为了测试和解决问题,我做了以下事情:

在两台计算机上,我加密了完全相同的字符串。 我检查了这个字符串在两台机器上转换成完全相同的byte []。 Rijndael对象在两台机器上具有相同的属性值,因此它的配置方式相同(Key,IV,Padding等)。

之后加密的byte []输出在两台机器上完全不同。

这就是我被困的地方。我无法想出这种行为的原因,互联网也无法帮助我。两台计算机都运行带有.Net4.0的Windows XP x86

我非常感谢任何提示,并提前感谢你, 毫升

有趣的事实:它在12台不同的计算机上运行良好,机器13正在喋喋不休:)

1 个答案:

答案 0 :(得分:1)

消息意味着

Padding is invalid and cannot be removed

我猜测加密的实际数据是不同的。如果它假设是相同的,那么差异可能在于编码。我认为系统默认编码可能会有所不同,系统区域设置也是如此(System.Globalization.Culture和CurrentCulture)。

无论如何,在其中一种情况下,填充不正确。 Rijndael输入需要填充到特定大小,以便支持加密。您应该查看Rijndael crypt的文档。

有可能,你可以使用一个标志来自动输入 进行默认填充(在解密时要注意这一点,因为你会得到源+填充,而不仅仅是源)