我编写的一些软件使用 .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 号机器在乱跑:)