Linux下使用libmcrypt加密的文本在.NET下使用RijndaelManaged时长度不同

本文关键字:RijndaelManaged 文本 加密 libmcrypt Linux NET | 更新日期: 2023-09-27 18:22:46

我正试图将加密数据从Linux系统传递到Windows系统。在Linux系统上,我用C语言编程,并使用libmcrypt库。

我在CBC模式下使用Rijndael-128,我的代码基于这里的示例https://gist.github.com/bricef/2436364我使用16字节的密钥和16字节的IV。我编写了一个程序,对16字节的ASCII文本进行加密和解密。我可以看到加密的数据有16个字节长。

在Windows下,我使用的是VS2010和C#。我的代码基于这里的示例。(第一个代码块)加密&解密C中的字符串#只是我已经将其更改为直接将密钥、IV和数据作为字节数组传递。我使用与Linux系统相同的16字节密钥和16字节IV。我对相同的16字节ASCII文本进行加密。

我的测试Windows程序成功地对数据进行了加密和解密。然而,加密的文本是32个字节,奇怪的是,前16个字节与Linux下的16个字节相同。

如何在两个系统上实现相同的输出?

Linux下使用libmcrypt加密的文本在.NET下使用RijndaelManaged时长度不同

如果您实际使用的是您提供的链接中的代码,您可以看到C代码使用ASCII,而C#代码使用UTF8,如果任何一个原始字符在UTF8中用超过8位表示,这将导致大小增加。(由于填充,可能只需要一个)。

mcrypt默认使用零填充,直到第一个块边界(0..15字节)。默认情况下,C#使用PKCS#7填充,它将填充到后面的第一个块边界(1..16字节)。你应该在双方都执行其中任何一个。PKCS#7填充应该是首选(获得32字节的明文)。

确保两侧都使用了正确的编码。同样,UTF-8应该是首选,但ASCII也可以使用。


请注意,使用老化的mcrypt库不是一个好主意,使用零IV和无MAC传输密文也是如此。这样做可能会导致明文完全失去机密性(CBC模式加密已经不提供完整性和身份验证,通常也需要这些)。

仅仅是在不了解的情况下从互联网上获取代码,最终可能会导致一个系统"正常工作",但如果你不了解自己在做什么,就极不可能导致一个真正安全的系统。