我使用弹跳城堡图书馆在c#中进行加密和解密,我想知道如何处理小于块大小的纯文本?
以下是我迄今所做的工作:
AesFastEngine engine = new AesFastEngine();
GcmBlockCipher cipher = new GcmBlockCipher(engine);
AeadParameters param = new AeadParameters(new KeyParameters(key), 128, iv, null);
cipher.Init(true, parameters);
byte[] encData = new byte[plain.Length];
cipher.ProcessBytes(plain, 0, plain.Length, encData, 0);当普通数据较小时,块大小就什么也不做。
发布于 2016-04-09 15:49:03
不幸的是,Bouncy城堡和Oracle / Java实现没有在线。也就是说,不保留基础CTR模式加密的在线属性。在此上下文中,联机意味着字节在运行时被直接加密/解密。这可能与加密的处理方式和身份验证标记的处理方式有关。
AES-CTR可以以多种方式实现.您可以先加密计数器,然后在计数器到达时直接使用明文/密文进行异或加密。您还可以先缓冲纯文本,然后,一旦有完整的块,创建计数器,加密它,然后XOR,一个完整的明文块。这具有优势,因为它更接近于其他运作模式,如CBC。此外,您可能不必一直在内存中缓冲密钥流。
身份验证标记也可以以不同的方式处理。这里基本上有三种选择。您可以简单地将身份验证标记视为密文的单独实体。这允许您保留CTR模式的在线属性,在我看来,应该是首选选项。您也可以将其视为密文的一部分,但在这种情况下,您将在解密过程中丢失在线属性;在处理构成身份验证标记的最后几个字节之前,您需要知道密码文本的结束位置。因此,您至少需要缓冲身份验证标记的字节大小。最后,在解密期间,您可能只希望在验证明文字节之后返回明文字节。在这种情况下,您需要缓冲整个密文并一次性返回明文。
由于身份验证标记的问题仅用于解密,因此由于CTR的实现方式,很可能B儿SY只会缓冲。您确实需要调用doFinal (正如罗伯特在注释中已经提到的那样)来检索最后一个密文块以及身份验证标记。可能还没有执行加密,因为加密例程与解密例程在某种程度上保持对称。
https://stackoverflow.com/questions/36518324
复制相似问题