我在使用nettle的twofish和标准ecb模式时没有问题,但是我不确定这种cbc模式有什么问题?解密的邮件将与原始邮件不匹配。(使用一些硬编码值,如iv,仅用于测试目的)。
https://www.lysator.liu.se/~nisse/nettle/nettle.html

    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]);
    }

最佳答案

詹姆斯是对的:你需要在解密之前重新设置IV。从Nettle文档中:
在返回之前,处理的最后一个密文块被复制到iv中,以便处理的大消息是对cbc_encrypt的一系列调用。
即,密码上下文中的IV丢失,并被最后一个密文块替换。因此,您需要再次将其设置为正确的值。
Nettle是一个低级库,因此这种构造是有意义的;高级库可以使用流或假设您总是在调用中提供完整的明文/密文。

09-06 07:11