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

时间:2014-09-20 07:39:23

标签: c# c encryption mcrypt rijndaelmanaged

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

我在CBC模式下使用Rijndael-128,我的代码基于此处的示例https://gist.github.com/bricef/2436364 我使用的是16字节密钥和16字节IV。我编写了加密然后解密16字节ASCII文本的程序。我可以看到加密数据长度为16个字节。

在Windows下我使用的是VS2010和C#。我的代码基于此处的示例。 (第一个代码块) Encrypting & Decrypting a String in C# 除了我已经改变它以将密钥,IV和数据直接作为字节数组传递。 我使用与Linux系统相同的16字节密钥和16字节IV。我加密了相同的16字节ASCII文本。

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

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

2 个答案:

答案 0 :(得分:0)

如果您真的使用了您提供的链接中的代码,您可以看到C代码使用的是ASCII,而c#代码使用的是UTF8,如果任何一个原始字符是以UTF8表示超过8位。 (由于填充,可能只需要一个)。

答案 1 :(得分:0)

mcrypt默认使用零填充,直到第一个块边界(0..15个字节)。 C#默认使用PKCS#7填充,将填充到之后的第一个块边界(1..16个字节)。你应该在两边实现其中任何一个。 PKCS#7填充应该是首选(获得32字节的明文)。

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


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

从互联网上抓取代码而不理解可能会导致系统最终“正常工作”,但如果你不了解自己在做什么,那么极不可能导致系统真正安全。