如何在CTR模式下搜索并解密部分流?

时间:2016-11-01 14:39:48

标签: c++ encryption decode crypto++

我对cryptopp的部分解码有疑问。 使用AES 256 CTR;

编码来源:

CTR_Mode< AES >::Encryption e;
e.SetKeyWithIV(key, 32, iv);
string encrypt;
string a = "Example text to encoding";
encrypt.clear();
StringSource s(a, true,
    new StreamTransformationFilter(e,
        new StringSink(encrypt)
    )
);

解码来源:

CTR_Mode<AES>::Decryption d;
d.SetKeyWithIV(key, 32, iv);
string x;

StringSource s1(encrypt, true,
    new StreamTransformationFilter(d,
        new StringSink(x)
    )
);

工作正常。但我不知道如何只解密部分。例如,示例encrypt.begin()+10

部分解码:

CTR_Mode<AES>::Decryption d;
d.SetKeyWithIV(key, 32, iv);
d.DiscardBytes(5);  //bit to skip
string todecrypt = encrypt.substr(5,10); // part of encrypted message
string x;

StringSource s1(todecrypt, true,
    new StreamTransformationFilter(d,
        new StringSink(x)
    )
);

1 个答案:

答案 0 :(得分:2)

  

如何在CTR模式下搜索并解密部分流?

使用Crypto++ Pipeline有点尴尬,因为Discard or Skip on a Source does not work as expected。您必须在当前实施下将Pump数据转换为&#34; no&#34; 。另请参阅Stack Overflow上的Skip'ing on a Source does not work as expected

以下是使用AES / CTR并在流中搜索的示例。它需要执行一个&#34;两部分&#34;寻求。首先,它会丢弃名为Source的{​​{1}}上的字节。其次,它在名为cipher的加密对象的密钥流中寻找同步计数器。执行搜索后,通过调用enc来解密密码文本的其余部分,这将通过管道抽取剩余的数据。

PumpAll()

结果如下:

#include "modes.h"
#include "aes.h"
using namespace CryptoPP;

int main(int argc, char* argv[])
{
    string plain = "Now is the time for all good men to come to the aide of their country";

    byte key[AES::DEFAULT_KEYLENGTH] = {0};
    byte nonce[AES::BLOCKSIZE] = {0};

    CTR_Mode<AES>::Encryption enc;
    enc.SetKeyWithIV(key, sizeof(key), nonce, sizeof(nonce));

    string cipher;
    StringSource ss1(plain, true, new StreamTransformationFilter(enc, new StringSink(cipher)));

    for(size_t i=0; i<cipher.size(); i++)
    {   
        CTR_Mode<AES>::Decryption dec;
        dec.SetKeyWithIV(key, sizeof(key), nonce, sizeof(nonce));

        StringSource ss2(cipher, false);
        ss2.Pump(i);
        dec.Seek(i);

        string recover;
        StreamTransformationFilter stf(dec, new StringSink(recover));

        // Attach the decryption filter after seeking
        ss2.Attach(new Redirector(stf));
        ss2.PumpAll();

        cout << i << ": " << recover << endl;
    }

    return 0;
}

现在您已经看到了常规模式,以下是使用范围$ ./test.exe 0: Now is the time for all good men to come to the aide of their country 1: ow is the time for all good men to come to the aide of their country 2: w is the time for all good men to come to the aide of their country 3: is the time for all good men to come to the aide of their country 4: is the time for all good men to come to the aide of their country 5: s the time for all good men to come to the aide of their country 6: the time for all good men to come to the aide of their country 7: the time for all good men to come to the aide of their country 8: he time for all good men to come to the aide of their country 9: e time for all good men to come to the aide of their country 10: time for all good men to come to the aide of their country 11: time for all good men to come to the aide of their country 12: ime for all good men to come to the aide of their country 13: me for all good men to come to the aide of their country 14: e for all good men to come to the aide of their country 15: for all good men to come to the aide of their country 16: for all good men to come to the aide of their country 17: or all good men to come to the aide of their country 18: r all good men to come to the aide of their country 19: all good men to come to the aide of their country 20: all good men to come to the aide of their country 21: ll good men to come to the aide of their country 22: l good men to come to the aide of their country 23: good men to come to the aide of their country 24: good men to come to the aide of their country 25: ood men to come to the aide of their country 26: od men to come to the aide of their country 27: d men to come to the aide of their country 28: men to come to the aide of their country 29: men to come to the aide of their country 30: en to come to the aide of their country 31: n to come to the aide of their country 32: to come to the aide of their country 33: to come to the aide of their country 34: o come to the aide of their country 35: come to the aide of their country 36: come to the aide of their country 37: ome to the aide of their country 38: me to the aide of their country 39: e to the aide of their country 40: to the aide of their country 41: to the aide of their country 42: o the aide of their country 43: the aide of their country 44: the aide of their country 45: he aide of their country 46: e aide of their country 47: aide of their country 48: aide of their country 49: ide of their country 50: de of their country 51: e of their country 52: of their country 53: of their country 54: f their country 55: their country 56: their country 57: heir country 58: eir country 59: ir country 60: r country 61: country 62: country 63: ountry 64: untry 65: ntry 66: try 67: ry 68: y 对数据集进行的修改。

必须致电[5,10],因为一旦执行XOR,恢复的文本就会就绪。其他模式可能需要调用stf.MessageEnd()。另请参阅Crypto ++ wiki上的Init-Update-Final

MessageEnd()

它产生:

StringSource ss2(cipher, false);
ss2.Pump(5);
dec.Seek(5);

string recover;
StreamTransformationFilter stf(dec, new StringSink(recover));

// Attach the decryption filter after seeking
ss2.Attach(new Redirector(stf));
ss2.Pump(10 - 5 + 1);

cout << "'" << recover << "'" << endl;

还有一点:

$ ./test.exe 
's the '

它产生:

StringSource ss2(cipher, false);
ss2.Pump(5);
dec.Seek(5);

string recover;
StreamTransformationFilter stf(dec, new StringSink(recover));

// Attach the decryption filter after seeking
ss2.Attach(new Redirector(stf));
ss2.Pump(10 - 5 + 1);

cout << "'" << recover << "'" << endl;

ss2.Pump(1);

cout << "'" << recover << "'" << endl;

ss2.Pump(1);

cout << "'" << recover << "'" << endl;

之前我说&#34;使用Crypto++ Pipeline有点尴尬&#34; 。这就是我们想要做的所有事情,但我们现在无法做到:

$ ./test.exe 
's the '
's the t'
's the ti'

关于Rob的评论&#34;您必须解密整个16字节的块...&#34; - 如果您正在使用其他模式,如CBC模式,那么你将不得不处理前面的纯文本或密文;你必须在街区上操作。 CBC模式及其链接属性需要它。

然而,点击率的设计略有不同。它的设计是可寻找的,它允许你在流中跳来跳去。在这方面,它很像OFB模式。 (CTR模式和OFB模式在生成密钥流的方式上有所不同。但是,对于使用纯文本或密文的密钥流,XOR都是异或的。)