我必须加密A应用程序中的输出文件,然后在B应用程序中对其进行解密,但我发现MS加密存在一些限制,如果我加密1000字节缓冲区然后想要解密启动不同位置的不同B应用程序中的大小,返回值是错误的。有没有加密可以满足我的要求?谢谢。 这是我的示例代码:
clTemp.EncryptDataDirectly(buffer, 1000);
clTemp.DecryptDataDirectly(buffer + 1, 500);
答案 0 :(得分:3)
免责声明:我不知道这个用于加密的Windows API。所以这只是问题的一般概述。使用您的常识和文档来了解更多信息。
有两种可能性:
流-密码。它们当时加密一个字节(或者甚至是位),您必须从加密流的开头开始才能正确解密。某些密码具有同步功能,可帮助您在传输中出现一些小错误后恢复。
块密码。它们加密固定大小的块,64或128位是流行的块大小。但是他们可以使用不同的加密模式。例如,ECB自己加密每个块。你可以跳到文件的中间,抓住一个块并解密它。但它会让您对已知的明文攻击持开放态度,攻击者知道某些加密文本并试图找到您使用的密钥。 CBC或其他具有反馈的模式更安全,但在这种情况下,您需要再次开始在加密文件的开头进行解密。
以下是维基百科的一些相关文章:
答案 1 :(得分:1)
一种解决方案是使用具有CTR(计数器)块模式的密码。它允许在解密期间随机访问;这些块不依赖于彼此,您只需要知道密钥和块号。
有关详细信息,请参阅wikipedias description。
答案 2 :(得分:0)
你想加密一些东西,然后只解密它的一部分?从头开始?我明白了吗?
答案 3 :(得分:0)
您可以尝试使用可以在电子代码簿(ECB)模式中使用的分组密码算法,这意味着每个块的加密独立于其前任的加密。这允许您在缓冲区中的任何位置开始解密,只要您从代码块的开头开始而在代码块内没有。
例如,您选择DES算法进行加密,其块大小为64位。因此,您必须使用与加密明文相同的块大小来解密密码。但是你不必开始你的密码的开头,你也可以从每个64的倍数开始。
也许这可能会对你有所帮助。
关于分组密码的更多信息:
Caesar cipher(这不是块狙击手)
答案 4 :(得分:0)
大多数数据加密算法都是block cipher,它一次加密一个块,例如128位。
为了使分组密码安全,大多数人根据第一个编码的输出初始化第二个块的加密,这称为密码块链接或CBC。通过使用电子代码块(ECB)模式,您可以关闭链接并一次加密一个块,但确实会失去一些复杂性。
以下是ECB为not so secure的原因示例:
(来源:wikimedia.org)
第二张图像使用ECB加密,最后一张图像使用链接加密。