我用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毫无疑问,对于它为什么要这样做,有一个合乎逻辑和有意义的解释,但是我想要理解为什么和( 2)有什么方法可以使它不每次都生成不同的字节数组吗?
我最初是对路径进行散列,但结果是我需要从散列版本中获得原始路径。由于您无法解散散列,所以我决定使用加密,以便以后可以解密它。
注意:必须创建新的标记inferno。
发布于 2018-06-03 03:17:40
至于为什么,您使用的加密技术可能是使用欧洲央行以外的块模式。这是的好事,。这样做的原因(以及其他块模式的存在)是为了解决教科书中块密码使用中的一个根本缺陷。
这里的问题与纯文本中的重复和密码的块大小有关。欧洲央行模式是最基本的密码模式。它从字面上取一个明文块,加密它,并输出相应的密文块。就这样。假设您在欧洲央行模式下使用AES加密路径/folder1/folder2/folder1/folder2/test.txt。你的密文应该是这样的:
C8A8880A02675911D5345D90387E9110
C8A8880A02675911D5345D90387E9110
86329A09EB2B6C8E686E4741CFA6C424每一行十六进制都是不同的密文块。你可能会马上注意到问题的所在。第一和第二区块是相同的。这是因为重复发生在明文的块边界上。所以这个信息会立即泄露给攻击者。这是提供的大量关于明文的信息。考虑另一种情况,其中密文包含“是”或“否”,并不止一次发送。确定哪个是哪一个就变得琐碎了。这就是为什么不推荐使用欧洲央行模式的原因。
然而,在您的用例中,它可能是必需的。在您开始使用它之前,请确保您了解欧洲央行模式的所有来龙去脉和潜在缺陷。在正确的情况下,从密文中检索明文实际上变得非常简单,因此您将牺牲加密的许多安全性。
https://stackoverflow.com/questions/50662866
复制相似问题