2

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

问题如下:程序生成一个字符串,转换成一个byte[]。然后用 Rijndael 将这个 byte[] 加密为另一个 byte[],然后将其传输到其他计算机。在那里,这个加密的 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()。

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

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

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

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

我非常感谢任何提示,并提前感谢您,mls

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

4

1 回答 1

1

消息的意思

Padding is invalid and cannot be removed

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

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

很有可能,您可以使用一个标志来自动对输入进行默认填充(解密时请注意这一点,因为您将获得源 + 填充,而不仅仅是源)

于 2012-10-09T11:42:32.507 回答