如何向CryptoStream添加搜索和位置功能

时间:2011-02-17 08:01:10

标签: c# stream cryptography

我试图将CryptoStream与AWS .NET SDk一起使用,但由于CryptoStream不支持搜索,因此失败了。我知道内容长度已知的地方我们应该能够将这些功能添加到CryptoStream。我想知道怎么做;任何示例代码也都很有用。

我有一个这样的方法,它与FieStream一起传递并返回一个cryptoStream。我将返回的Stream对象分配给AWS SDk PutObjectRequest对象的InputStream。

public static Stream GetEncryptStream(Stream existingStream,
    SymmetricAlgorithm cryptoServiceProvider,
    string encryptionKey, string encryptionIV)
{
    Stream existingStream = this.dataStream;

    cryptoServiceProvider.Key = ASCIIEncoding.ASCII.GetBytes(encryptionKey);
    cryptoServiceProvider.IV = ASCIIEncoding.ASCII.GetBytes(encryptionIV);
    CryptoStream cryptoStream = new CryptoStream(existingStream,
        cryptoServiceProvider.CreateEncryptor(), CryptoStreamMode.Read);

    return cryptoStream ;
}

2 个答案:

答案 0 :(得分:6)

通常使用加密,输入字节和输出字节之间没有1:1的映射,因此为了向后寻找(特别是),它必须做很多工作 - 也许甚至回到开始并向前移动处理数据以消耗解密流中的[n]个字节。即使它知道每个字节映射到的位置,加密的状态也依赖于它之前的数据(它不是解码器环; p),所以再次 - 它要么必须从头开始读取(和重置回初始化矢量),或者它必须跟踪位置和加密状态的快照,然后返回最近的快照,然后向前走。大量的工作和存储。

这也适用于相对于任何一方的搜索。

当前位置向前移动不会太糟糕,但是你必须再次处理数据 - 而不仅仅是跳过基本流的位置。

大多数消费者都没有良好的方式来实现这一点 - 通常情况下,如果您从true获得CanSeek意味着“随机访问”,在这种情况下效率不高。

作为解决方法 - 考虑将解密数据复制到MemoryStream或文件中;然后,您可以以随机访问方式访问完全解密的数据。

答案 1 :(得分:3)

作为Mark Gravell答案的扩展,密码的可搜索性取决于您用于密码的Mode Of Operation。大多数操作模式都是不可寻找的,因为每个密文块在某种程度上取决于前一个。欧洲央行是可以寻求的,但使用欧洲央行几乎是一个坏主意。 CTR模式是另一个可以随机访问的模式,就像CBC一样。

然而,所有这些模式都有自己的漏洞,因此在选择之前,您应该仔细阅读并仔细思考(最好咨询专家)。