Openssl中的ECB、CFB、OFB密码模式

Openssl中的ECB、CFB、OFB密码模式,c,openssl,mode,encryption,block-cipher,C,Openssl,Mode,Encryption,Block Cipher,我知道,当我在Openssl中使用CBC模式时,我可以将其作为块大小的倍数的输入。但是其他模式呢?欧洲央行、循环流化床、OFB?我看到了一张照片,但我并不完全清楚。我应该打电话给他们吗 比方说,欧洲央行。它一次加密64位。那么伪代码应该是这样的(应该是这样的) 比方说,欧洲央行。它一次加密64位 是128位的分组密码。它一次加密/解密128位。这是一个标准。AES_encrypt/AES_decrypt块要求输入和输出数据的长度为128位或16字节 但是上面的代码并不好。当我改变c+=8时;c+

我知道,当我在Openssl中使用CBC模式时,我可以将其作为块大小的倍数的输入。但是其他模式呢?欧洲央行、循环流化床、OFB?我看到了一张照片,但我并不完全清楚。我应该打电话给他们吗

比方说,欧洲央行。它一次加密64位。那么伪代码应该是这样的(应该是这样的)

比方说,欧洲央行。它一次加密64位

是128位的分组密码。它一次加密/解密128位。这是一个标准。AES_encrypt/AES_decrypt块要求输入和输出数据的长度为128位或16字节

但是上面的代码并不好。当我改变c+=8时;c+=16;那好吧。做这件事的好方法是什么?我的意思是,我们都知道8x8=64位,所以这应该是正确的,但事实并非如此,只有当c+=16时,加密/解密才起作用

这就是为什么它可以很好地工作

c+=16

除此之外,代码中几乎没有问题

unsigned char enc_out[encslength];
unsigned char dec_out[encslength];
memset(enc_out, 0, sizeof(enc_out));
memset(dec_out, 0, sizeof(dec_out));

AES_KEY enc_key, dec_key;
AES_set_encrypt_key(aes_key, keylength, &enc_key);
请将dec_的大小保持在encslength之外,因为您正在解密encslength字节,而不是在代码中输入encslength

unsigned char enc_out[encslength];
unsigned char dec_out[encslength];
memset(enc_out, 0, sizeof(enc_out));
memset(dec_out, 0, sizeof(dec_out));

AES_KEY enc_key, dec_key;
AES_set_encrypt_key(aes_key, keylength, &enc_key);
在本节中,将c增加16,因为AES是128块密码

long c = 0;
while(c < encslength)
{
    AES_ecb_encrypt(paddedinput+c, enc_out+c, &enc_key, AES_ENCRYPT);
    c += 16;
}
对于解密:

AES_cfb128_decrypt (enc_out, dec_out, inputlength, &enc_key, iv, AES_ENCRYPT);
num = 0;
AES_ofb128_encrypt (enc_out, dec_out, inputlength, &enc_key, iv, &num);
  • OFB模式 类似地,在OFB模式下,不需要填充数据。使用AES_加密和IV以及密钥
  • 对于加密:

    AES_cfb128_encrypt (paddedinput, enc_out, inputlength, &enc_key, iv, AES_ENCRYPT);
    
    //Initialize num to 0.
    num = 0;
    AES_ofb128_encrypt (paddedinput, enc_out, inputlength, &enc_key, iv, &num);
    
    对于解密:

    AES_cfb128_decrypt (enc_out, dec_out, inputlength, &enc_key, iv, AES_ENCRYPT);
    
    num = 0;
    AES_ofb128_encrypt (enc_out, dec_out, inputlength, &enc_key, iv, &num);
    
    您可能需要根据需要对代码进行一些调整


    请阅读更多信息。

    所有AES模式将以块大小的倍数进行加密。在加密过程中如何使用这些块是模式之间的主要区别。填充也起作用(如果不使用填充,则输入必须是块大小的精确倍数;如果使用填充,则可能会生成最多一个完整的额外块大小的输出数据,具体取决于输入大小)。你说,“但是上面的代码并不好。”好吧,“上面的”代码没有任何作用,因为它不是真正的代码。带一个,我们就可以用它了。@WhozCraig:谢谢。我在这里给出的AES只是一个例子,我问的是几乎所有其他的分组密码。我粘贴的
    SSCCE
    I仅在我更改
    c+=8时工作
    c+=16。我是否也应该对其他密码模式使用相同的循环?(我想我只需要用
    c+=…;
    更改部分,然后调用适当的函数模式,对吗?)。我写了你在书中引用的那个例子。不过,这在某种程度上与OP的问题有关。只要加密的数据块是连续的,就不必循环。只需对其进行加密。不,这是您正在调用的api的输入数据大小参数的要点。它将在最后一个块中为您执行逐块加密,如果设置为这样做,还将执行填充数据(如果适用于您请求的模式)。也就是说,除非您试图加密流中的变量数据,否则根本不必循环。只需确保输出缓冲区对于最终数据足够大。如果您想要流式加密,您当然可以,但在这种情况下,请使用
    AES\u BLOCK\u SIZE
    倍数,并确保您的解密端执行相同的操作。您不应使用
    AES\u encrypt
    和friends。您应该使用
    EVP.*
    函数。请参见OpenSSL wiki上的。事实上,您可能应该使用经过身份验证的加密,因为它同时提供机密性和真实性。请参见OpenSSL wiki上的。