Inferno - SuiteB.Encrypt每次都会生成不同的字节数组

时间:2018-06-03 02:44:00

标签: .net encryption

我使用Inferno加密字符串。加密和解密工作正常,但同一字节数组上的多次加密似乎总是会产生完全不同的字节数组。

这是一个问题的原因是因为我需要加密文件路径,然后在本地驱动器上创建该路径。如果每次在同一路径上生成不同的字节数组,我的程序将继续创建新路径。这是代码:

var key = Encoding.UTF8.GetBytes("my key");

var encrypted = System.Web.HttpServerUtility
            .UrlTokenEncode(SuiteB.Encrypt(key, @"C:\some\path\to\encrypt".ToBytes().AsArraySegment()));

var decrypted = SuiteB.Decrypt(key, 
    System.Web.HttpServerUtility.UrlTokenDecode(encrypted).AsArraySegment()).FromBytes();

首先,encrypted设置为:

hI_n_XrS_UuYR4heaGIfApOVco2fy0AAzU_qm8e7QMdoZg25hY2C1HFQ4w0AAvbQlv5i0DdXs3QuK50K1etHnL7ftfTS9HjLJeNCj4o6X-A-K6BVUivXBiU6DQN06ZgqVzIz3-n00

如果我将调试光标拖回到它再次生成它,我得到:

SbOst3-Qe2NqtVSNrFlHzUgQn8N-6PfKTnw4sko4BEcYuyEl7LlHB5wVRerifG9AIwo1pHYJHT57QGuIsgyvdswUjPDSuGM1dF7kUiSMZk3l1wmD3Q-KA-HQwr0yAURAMPRbKpM20

毫无疑问,对于它为什么这样做有一个合乎逻辑且有意义的解释,但是1)我想理解为什么和2)有没有办法使它每次都不生成不同的字节数组? / p>

我最初是在浏览路径,但事实证明我需要从散列版本中获取原始路径。由于你不能解开散列,我决定使用加密,这样我以后就可以解密了。

注意:必须创建新标记inferno

1 个答案:

答案 0 :(得分:1)

至于为什么,您使用的加密技术可能使用除ECB之外的block mode。这是好事。这样做的原因(以及为什么存在其他块模式)是为了解决使用分组密码的教科书中的一个根本缺陷。

这里的问题是明文中的重复和密码的块大小。 ECB模式是最基本的密码模式。它实际上需要一个明文块,对其进行加密,并输出相应的密文块。就是这样。假设您在ECB模式下使用AES加密了路径/folder1/folder2/folder1/folder2/test.txt。你的密文看起来像这样:

C8A8880A02675911D5345D90387E9110
C8A8880A02675911D5345D90387E9110
86329A09EB2B6C8E686E4741CFA6C424

其中每行十六进制是不同的密文块。您可能会立即注意到问题所在。第一和第二块是相同的。这是因为在明文的块边界上发生重复。因此,此信息会立即泄露给攻击者。这是很多的信息,以提供有关明文的信息。考虑另一种情况,其中密文包含"是"或"不"并且被发送不止一次。确定哪个是哪个变得微不足道。这就是不建议使用ECB模式的原因。

然而,在您的用例中,可能需要它。在开始使用之前,请确保您了解ECB模式下的所有细节和潜在缺陷。在适当的情况下,从密文中检索明文实际上变得微不足道,因此您将牺牲许多加密的安全性。