当前位置: 首页 > 知识库问答 >
问题:

如何将IV(初始化向量)添加到AES-256 ECB加密以创建AES-256CBC模式?

陈昊昊
2023-03-14

我有下面的代码,使用我在这里找到的一个简单的面向字节的AES-256库为AES-256 ECB加密工作。

主要:

#define DUMP(s, i, buf, sz)  {printf(s); \
for (i = 0; i < (sz);i++) \
printf("%02x ", buf[i]); \
printf("\n");}

int main (int argc, char *argv[])
{
aes256_context ctx; 
uint8_t key[32] = "39P8TXDMBCYF4C1NI1CDFJ1WL6P5TTKZ";
uint8_t buf[16] = "KUC7EWG6M2D1WW8F";
uint8_t i;

DUMP("txt: ", i, buf, sizeof(buf));
DUMP("key: ", i, key, sizeof(key));
printf("---\n");

aes256_init(&ctx, key);
aes256_encrypt_ecb(&ctx, buf);

DUMP("enc: ", i, buf, sizeof(buf));

aes256_init(&ctx, key);
aes256_decrypt_ecb(&ctx, buf);
DUMP("dec: ", i, buf, sizeof(buf));

aes256_done(&ctx);
return 0;
}

加密功能:

void aes256_encrypt_ecb(aes256_context *ctx, uint8_t *buf)
{
uint8_t i, rcon;
aes_addRoundKey_cpy(buf, ctx->enckey, ctx->key);
for(i = 1, rcon = 1; i < 14; ++i)
{
aes_subBytes(buf);
aes_shiftRows(buf);
aes_mixColumns(buf);
if( i & 1 ) aes_addRoundKey( buf, &ctx->key[16]);
else aes_expandEncKey(ctx->key, &rcon), aes_addRoundKey(buf, ctx->key);
}
aes_subBytes(buf);
aes_shiftRows(buf);
aes_expandEncKey(ctx->key, &rcon);
aes_addRoundKey(buf, ctx->key);
} /* aes256_encrypt */

我想在此程序中添加一个IV以创建AES-256 CBC模式。根据我的理解,IV实现如下:

  1. 将第一个块与IV进行异或。
  2. 将所有后续块与前一块的密码文本进行异或

我的问题是逻辑是什么样的?我如何将其实现到我的代码中?

共有1个答案

傅星光
2023-03-14

逻辑和解释可以在几个地方找到。例如在:ECB vs CBC或分组密码操作模式中。

CBC=密码块链接是将块连接在一起的一种方式。

它所做的不是单独处理每个块,而是将每个块与加密的前一个块进行异或。这实际上意味着每个块都依赖于前一个块的输出。

每个块都与前一个块的密文一起XORed,因为它由引用文章中的图表解释。

在实践中,一旦一个区块被ECB加密:

 Cipher((state_t*)buf, ctx->RoundKey);

如在

void AES_ECB_encrypt(struct AES_ctx *ctx,const uint8_t* buf)
{
  // The next function call encrypts the PlainText with the Key using AES algorithm.
  Cipher((state_t*)buf, ctx->RoundKey);
}

CBC是通过对块上的IV、同一块上的ECB和缓冲区中的块进行异或来实现的。

与IV的XOR示例:

static void XorWithIv(uint8_t* buf, uint8_t* Iv)
{
  uint8_t i;
  for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size
  {
    buf[i] ^= Iv[i];
  }
}

与IV和ECB一起使用XOR的CBC示例:

void AES_CBC_encrypt_buffer(struct AES_ctx *ctx,uint8_t* buf, uint32_t length)
{
  uintptr_t i;
  uint8_t *Iv = ctx->Iv;
  for (i = 0; i < length; i += AES_BLOCKLEN)
  {
    XorWithIv(buf, Iv);
    Cipher((state_t*)buf, ctx->RoundKey);
    Iv = buf;
    buf += AES_BLOCKLEN;
    //printf("Step %d - %d", i/16, i);
  }
  /* store Iv in ctx for next call */
  memcpy(ctx->Iv, Iv, AES_BLOCKLEN);
}

上面的实现来自microite-AES,您可能想研究它并使其适应您的需求。我希望它能有所帮助。

 类似资料:
  • 问题内容: 我有一个关于在AES加密中使用初始化向量的问题。我引用以下文章/帖子将加密功能构建到程序中: [1] 基于Java256位AES密码的加密 [2]http://gmailassistant.sourceforge.net/src/org/freeshell/zs/common/Encryptor.java.html 我最初从第一个链接开始关注erickson的解决方案,但是据我所知,我

  • 问题内容: 我在下面的(E.1)中使用它来进行我的应用程序,显然我认识并理解了其中的一个巨大的安全漏洞。我对加密越来越感兴趣,并且想更好地理解它,我需要随IV一起生成一个随机密钥,但是不确定如何正确地执行此操作。有人可以向我解释一下熟悉AES加密的工作原理(IV和KEY)吗? )因此,我将来能够更好地理解并可以运用我的知识,本质上,我只是想使代码更安全,谢谢。 (E.1) 问题答案: AES密钥仅

  • 我在下面(E.1)中使用它作为我的应用程序,显然有一个我认识和理解的巨大的明显的安全漏洞。我对加密越来越感兴趣,想更好地理解它,我需要生成一个随机密钥和一个IV,但不确定如何正确地执行。有人能向我解释一下熟悉AES加密的人是如何工作的吗? (E.1)

  • 我在一个项目中工作,在这个项目中,我通过XML流向web服务发帖。在这种情况下,提供程序请求使用密码块链接(CBC)模式下的高级加密标准(AES)和128位初始化向量对路由xml进行加密。我是用VB.NET编码的,从我可以看出我已经满足了他们所有的加密要求,但当我提交帖子时,我总是得到一个“无效的路由输入加密”的错误响应。我没有做很多与加密,所以我希望有人与一些加密经验可以帮助我在这里。它失败是因

  • 在从Delphi2007迁移到XE2的过程中,我们正在考虑将加密库从DCPCrypt切换到Turbopower Lockbox 3。 a) 在DCPCrypt中,我可以显式控制初始化向量。如何在TPLB3中设置IV? b)DCPCrypt没有填充,我们在加密前用零填充明文。TPLB垫如何?当然,我们仍然可以自己做。 密码=AES-256; 链接模式=CBC; 终止=C#样式全零填充; IV传输=在

  • 我试图在CBC模式下使用AES和Crypto++库加密(和解密)一个文件 以下是我已经做的: 为了加密文件,我以二进制模式打开它,并将内容转储为字符串: 当我将尝试解密此文件时,我如何分别提取iv和密文?IV是16字节长,但在这里我完全迷失了,我不知道如何做。