C语言实现AES加密解密

AES加密是美国联邦政府采用的一种块加密标准,如今已经被全世界广为使用。嵌入式开发中我们也经常会用到加密解密算法,如果没有硬件模块来实现,就需要用到C代码软件实现。下面介绍调用mbedTLS中的AES加密解密函数实现AES算法。

mbedTLS是一个开源TLS协议栈,主要用于嵌入式开发,其源代码网址为https://tls.mbed.org/aes-source-code。在该页面上点击downloadmbedTLS即可下载最新的协议栈,解压该压缩包就可以得到协议栈源代码。协议栈中的各种算法都独立封装在C文件中,彼此耦合度较低,目的是便于调用。我这里下的是2.2.1版本,解压后可以看到mbedtls-2.2.1\include\mbedtls路径下有许多header文件,将其添加到IDE的头文件中。在mbedtls-2.2.1\library下有许多c文件,我们只添加需要用到的aes.c。

这里使用Visual Studio2013 C/C++环境进行编译演示。新建控制台应用,空工程。在Header Files文件夹下添加头文件,注意连文件夹一起添加,因为C文件中的include是包含路径的。然后把aes.c添加到source文件夹里。此时直接编译就能通过啦!


接下来就是在主函数里调用函数。这里调用了ECB模式和CBC模式两种。源代码如下:

#include<stdio.h>
#include "mbedtls/aes.h"
#include "mbedtls/compat-1.3.h"
 
#define AES_ECB 0
#define AES_CBC 1
#define AES_CFB 2
#define AES_CTR 3
#define MODE AES_ECB
 
unsigned char key[16] = { 0x22,
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当 `mbedtls_cipher_crypt` 函数返回 `MBEDTLS_ERR_CIPHER_INVALID_PADDING` 错误时,通常是由于填充模式设置不正确导致的。在使用 AES-CBC 模式进行加密时,需要使用合适的填充模式来确保输入数据长度符合加密算法的要求。 一种常用的填充模式是 PKCS#7 填充,它会根据需要在输入数据的末尾填充适当数量的字节。您可以在调用 `mbedtls_cipher_setup` 函数之后,使用 `mbedtls_cipher_set_padding_mode` 函数来设置填充模式为 PKCS#7。 以下是修改后的代码示例: ```c #include "mbedtls/aes.h" #include "mbedtls/cipher.h" int main() { // 初始化 mbedtls 的上下文 mbedtls_aes_context aes_ctx; mbedtls_aes_init(&aes_ctx); unsigned char key[32] = {0}; // AES-256 的密钥长度为 32 字节 unsigned char iv[16] = {0}; // 初始化向量长度为 16 字节 unsigned char input[16] = "plaintext"; // 待加密的明文 unsigned char output[16] = {0}; // 存储加密后的密文 // 设置加密算法和模式 mbedtls_cipher_context_t cipher_ctx; mbedtls_cipher_init(&cipher_ctx); mbedtls_cipher_setup(&cipher_ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC)); // 设置填充模式为 PKCS#7 mbedtls_cipher_set_padding_mode(&cipher_ctx, MBEDTLS_PADDING_PKCS7); // 设置密钥和初始化向量 mbedtls_cipher_setkey(&cipher_ctx, key, 256, MBEDTLS_ENCRYPT); mbedtls_cipher_set_iv(&cipher_ctx, iv, 16); // 执行加密操作 int ret = mbedtls_cipher_crypt(&cipher_ctx, iv, 16, input, output); if (ret != 0) { // 处理加密错误 // ... } // 清理 mbedtls 的上下文 mbedtls_cipher_free(&cipher_ctx); mbedtls_aes_free(&aes_ctx); return 0; } ``` 在以上示例中,我们使用 `mbedtls_cipher_set_padding_mode` 函数将填充模式设置为 PKCS#7。确保您在设置填充模式之后再执行加密操作。如果仍然遇到填充错误,请检查输入数据的长度是否符合加密算法的要求,并确保密钥和初始化向量的长度正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年夏日科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值