如何解密中间的密码?

时间:2009-03-06 12:58:27

标签: windows winapi encryption

我必须加密A应用程序中的输出文件,然后在B应用程序中对其进行解密,但我发现MS加密存在一些限制,如果我加密1000字节缓冲区然后想要解密启动不同位置的不同B应用程序中的大小,返回值是错误的。有没有加密可以满足我的要求?谢谢。 这是我的示例代码:

clTemp.EncryptDataDirectly(buffer, 1000);
clTemp.DecryptDataDirectly(buffer + 1, 500);

5 个答案:

答案 0 :(得分:3)

免责声明:我不知道这个用于加密的Windows API。所以这只是问题的一般概述。使用您的常识和文档来了解更多信息。

有两种可能性:

  1. 流-密码。它们当时加密一个字节(或者甚至是位),您必须从加密流的开头开始才能正确解密。某些密码具有同步功能,可帮助您在传输中出现一些小错误后恢复。

  2. 块密码。它们加密固定大小的块,64或128位是流行的块大小。但是他们可以使用不同的加密模式。例如,ECB自己加密每个块。你可以跳到文件的中间,抓住一个块并解密它。但它会让您对已知的明文攻击持开放态度,攻击者知道某些加密文本并试图找到您使用的密钥。 CBC或其他具有反馈的模式更安全,但在这种情况下,您需要再次开始在加密文件的开头进行解密。

  3. 以下是维基百科的一些相关文章:

答案 1 :(得分:1)

一种解决方案是使用具有CTR(计数器)块模式的密码。它允许在解密期间随机访问;这些块不依赖于彼此,您只需要知道密钥和块号。

有关详细信息,请参阅wikipedias description

答案 2 :(得分:0)

你想加密一些东西,然后只解密它的一部分?从头开始?我明白了吗?

答案 3 :(得分:0)

您可以尝试使用可以在电子代码簿(ECB)模式中使用的分组密码算法,这意味着每个块的加密独立于其前任的加密。这允许您在缓冲区中的任何位置开始解密,只要您从代码块的开头开始而在代码块内没有。

例如,您选择DES算法进行加密,其块大小为64位。因此,您必须使用与加密明文相同的块大小来解密密码。但是你不必开始你的密码的开头,你也可以从每个64的倍数开始。

也许这可能会对你有所帮助。

关于分组密码的更多信息:

Block cipher

Block cipher modes

Caesar cipher(这不是块狙击手)

答案 4 :(得分:0)

大多数数据加密算法都是block cipher,它一次加密一个块,例如128位。

为了使分组密码安全,大多数人根据第一个编码的输出初始化第二个块的加密,这称为密码块链接或CBC。通过使用电子代码块(ECB)模式,您可以关闭链接并一次加密一个块,但确实会失去一些复杂性。

以下是ECB为not so secure的原因示例:

Original
(来源:wikimedia.org
Tux ECB Tux chaining

第二张图像使用ECB加密,最后一张图像使用链接加密。