我使用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
。
答案 0 :(得分:1)
至于为什么,您使用的加密技术可能使用除ECB之外的block mode。这是好事。这样做的原因(以及为什么存在其他块模式)是为了解决使用分组密码的教科书中的一个根本缺陷。
这里的问题是明文中的重复和密码的块大小。 ECB模式是最基本的密码模式。它实际上需要一个明文块,对其进行加密,并输出相应的密文块。就是这样。假设您在ECB模式下使用AES加密了路径/folder1/folder2/folder1/folder2/test.txt
。你的密文看起来像这样:
C8A8880A02675911D5345D90387E9110
C8A8880A02675911D5345D90387E9110
86329A09EB2B6C8E686E4741CFA6C424
其中每行十六进制是不同的密文块。您可能会立即注意到问题所在。第一和第二块是相同的。这是因为在明文的块边界上发生重复。因此,此信息会立即泄露给攻击者。这是很多的信息,以提供有关明文的信息。考虑另一种情况,其中密文包含"是"或"不"并且被发送不止一次。确定哪个是哪个变得微不足道。这就是不建议使用ECB模式的原因。
然而,在您的用例中,可能需要它。在开始使用之前,请确保您了解ECB模式下的所有细节和潜在缺陷。在适当的情况下,从密文中检索明文实际上变得微不足道,因此您将牺牲许多加密的安全性。