【问题标题】:decryption of block cipher?分组密码的解密?
【发布时间】:2011-06-10 14:46:32
【问题描述】:

您好,我已经使用模式电子密码本 (ecb) 的分组密码方法 AES-128 加密了大小为 196,662 字节的数据,现在加密的数据大小变为 196,672 字节。现在我必须解密,因为我必须解密的数据大小是 16 的倍数,所以我尝试一次解密加密数据而不分割它,但它没有解密。告诉我是否要更改加密和解密方法中的任何内容,或者告诉我任何其他等效解决方案。提前致谢。

编辑:加密代码:

bufferlen = filesize; 
buffer = new BYTE [ bufferlen ]; 
feof = false; 
do { 
    count = fread(buffer, 1, 16, filepointer); 
    if ( count < 16 ) { 
        feof = true; 
    }
    cout << count; 
    result = CryptEncrypt(hGenKey,NULL,feof,0,buffer,&count,bufferlen); 
    if ( result == 0 ) { 
        cout << "\nencrypt failed"; 
    } 
    else { 
        cout << "encrypt passed"; 
    } 
    if(fwrite(buffer, 1, count , filepointer1)!=count) { 
        cout << "\nwrite failed"; 
    }
} while (feof != true);

解密代码:

bufferlen = filesize;
buffer = new BYTE [ bufferlen ];
feof = false;
do {
    count = fread(buffer, 1, 16, filepointer);
    if ( count < 16 ) {
        feof = true;
    }
    cout << count;
    result = CryptEncrypt(hGenKey,NULL,feof,0,buffer,&count,bufferlen);
    if ( result == 0 ) {
        cout << "\nencrypt failed";
    }
    else {
        cout << "encrypt passed";
    }
    if(fwrite(buffer, 1, count , filepointer1)!=count) {
        cout << "\nwrite failed";
    }
} while ( feof != true );

【问题讨论】:

  • 我想向我们展示您的算法可能会更容易评论更改
  • 加密:bufferlen = 文件大小;缓冲区 = 新字节 [ bufferlen ]; feof = 假; do { count = fread(buffer, 1, 16, filepointer); if (count
  • 你必须使用CryptDecrypt来解密。
  • ECB 模式通常是个坏主意——除非你知道你永远不会对同一个块进行多次加密。
  • @Monish:这取决于,但如果你不知道这样做的理由,我一般会认为 CBC 是一个合理的默认值,而 CFB 是一个漂亮的关闭第二选择。

标签: c++ cryptography


【解决方案1】:

在循环的倒数第二次迭代中,当您进行解密时,count 将为 16,但是您必须设置 Final 标志,因为它包含填充(您的 feof 为假)。然后在下一次迭代中,count 将为 0,在这种情况下,您设置了 feof,但实际上您已经没有数据可以解密了。

【讨论】:

  • 谢谢你发现错误,现在我明白我的错误了。你能告诉我我必须做的任何改变,以使标志为 TRUE,同时它加密最后一个块。提前致谢
  • 试试feof。另外,就像注释一样,您可以将多个块传递给加密/解密函数。
  • 再想一想,feof 可能不起作用。尝试 ftell 或直接阅读。
  • 感谢您的耐心等待并回复我的所有问题。我会努力的。
  • 我都尝试了 feof(),我无法停止最后一个循环,所以我使用了 ftell,通过将 if 条件更改为 if (count
【解决方案2】:

我会查看 ecb http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 上的维基百科文章

如果至少没有您项目的伪代码,我们就无能为力了。

【讨论】:

  • 对不起,朋友无法得到你。你要我检查链接吗?
【解决方案3】:

这实际上是对评论的回答,而不是原始问题。在伪代码中,CBC 模式如下所示:

prev_block = IV;
write_output(prev_block);
current_block = first_block;

while (more blocks to process) {
    encrypted_block = encrypt_block(current_block XOR prev_block);
    write_output(encrypted_block);
    prev_block = encrypted_block;
    current_block = next_block;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2016-01-31
    • 1970-01-01
    • 2011-10-10
    • 2020-11-10
    • 2016-08-08
    • 2012-10-03
    相关资源
    最近更新 更多