首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >荨麻双倍CBC

荨麻双倍CBC
EN

Stack Overflow用户
提问于 2015-10-07 21:59:13
回答 1查看 187关注 0票数 1

我对使用荨麻的标准欧洲央行模式没有问题,但我不确定这种cbc模式有什么问题?解密后的消息将与原始消息不匹配。(仅为测试目的使用一些硬编码值,如iv )。

https://www.lysator.liu.se/~nisse/nettle/nettle.html

代码语言:javascript
复制
    const uint8_t key[TWOFISH_KEY_SIZE] = {
        0xea, 0xad, 0xdd, 0x6c, 0x32, 0x5a, 0xdc, 0x4f, 0x01, 0x5b, 0x4c,
        0xde, 0xbb, 0x45, 0xc9, 0xe5, 0x5a, 0xb7, 0x5f, 0x3b, 0x01, 0x9a,
        0xf8, 0x39, 0xd0, 0x74, 0x05, 0xeb, 0xf1, 0xaa, 0xa7, 0x67};
    const uint8_t src[TWOFISH_BLOCK_SIZE] = {
        0x3a, 0x53, 0xec, 0xae, 0xc0, 0xcf, 0xd3, 0xd8,
        0xae, 0x05, 0x5d, 0xc0, 0x07, 0x3c, 0x04, 0x0d};
    const uint8_t iv[TWOFISH_BLOCK_SIZE] = {
        0xa0, 0xfb, 0x59, 0x3d, 0x70, 0x98, 0xdf, 0x8f,
        0xff, 0xa0, 0x3b, 0xd5, 0xc5, 0x8b, 0x2c, 0x45};
    uint8_t encrypted[TWOFISH_BLOCK_SIZE];
    uint8_t decrypted[TWOFISH_BLOCK_SIZE];

    struct CBC_CTX(struct twofish_ctx, TWOFISH_BLOCK_SIZE) ctx;
    twofish256_set_key(&ctx.ctx, key);
    CBC_SET_IV(&ctx, iv);

    CBC_ENCRYPT(&ctx, twofish_encrypt, TWOFISH_BLOCK_SIZE, encrypted, src);
    CBC_DECRYPT(&ctx, twofish_decrypt, TWOFISH_BLOCK_SIZE, decrypted,
                encrypted);

    for(int i = 0; i < TWOFISH_BLOCK_SIZE; i++) {
        printf("\n%hhX\n", src[i]);
        printf("%hhX\n", encrypted[i]);
        printf("%hhX\n-------------------", decrypted[i]);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-09 12:09:56

James是对的:您需要在解密之前再次设置IV。来自Nettle的文档:

最后处理的密文块在返回前被复制到iv中,以便处理大型消息是对cbc_encrypt的一系列调用。

也就是说,密码上下文中的IV被丢失,代之以最后一个密文块。因此,您需要再次将其设置为正确的值。

Nettle是一个低级库,因此这个构造是有意义的;更高级别的库可能使用流,或者假设您总是在调用中提供完整的明文/密文。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33003118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档