aes128 cmac java,C语言实现AES-128 CMAC算法

本文详细介绍了如何在C语言中实现AES-128 CMAC算法,这是一种基于对称加密的Message Authentication Code(MAC)方法,用于确保信息完整性和身份认证。通过NIST推荐的800-3B标准,算法通过生成子密钥k1和k2来处理不同长度的数据,依赖于mbedTLS密码学库。代码示例展示了如何设置MAC密钥、生成MAC值以及验证MAC的有效性。

MessageAuthentication Code(MAC)是一种保障信息完整性和认证的密码学方法,其中CMAC的全称是Cypher-Based

Message Authentication Code,基于AES等对称加密方式实现消息认证。通信双方需要共享一个对称密钥,由发送方生成一个MAC值,附在消息后面,接收方计算收到消息的MAC,如果和收到的MAC一致,则说明没有被篡改,并且能确认发送方一定拥有相同的密钥,即认证身份。

美国国家标准与技术研究院NIST推荐了一种CMAC计算方式,可以避免CBC-MAC带来的缺点,编号为800-3B,文档可以从其官网上下载。该算法通过MAC密钥生成k1和k2两个子密钥,并规定了数据位填充的规则,可以通过AES-128、AES-192、AES-256三种模式进行MAC计算,支持所有整数字节的数据以及长度为0的输入。下图为MAC算法处理不需要位填充和需要位填充的两种情况。本文介绍AES-128生成的CMAC实现。

97415eca387a1225db3195890cefbdcb.png

本C代码外部依赖项是mbedTLS的密码学库,下载及使用见《C语言实现AES加密解密》。

55ec2faf725863810335e3748b5175cb.png

表1外部调用列表

本CMAC算法包括的内部函数如下。

b00a2f0afbb7289df425ad5cfb0987fa.png

表2本代码中设计的函数

本CMAC算法包括的全局变量如下。

b03695dc4be6515d6f70e8723d0faf5f.png

表3本代码中的全局变量

CMAC实现部分代码如下:

#include

#include "mbedtls/aes.h"

#include "mbedtls/compat-1.3.h"

uint8_t MAC[16];

uint8_t MACkey[16];

uint8_t k1[16];

uint8_t k2[16];

mbedtls_aes_context aes;

void leftshift(int len, uint8_t* add, uint8_t*des)

{

int i;

for (i = 0; i < len - 1; i++)

{

des[i] = (

详细介绍了AES-CMAC算法的原理与实现,附有C语言写的样例程序。 以下是原文的introduction: The National Institute of Standards and Technology (NIST) has recently specified the Cipher-based Message Authentication Code(CMAC). CMAC [NIST-CMAC] is a keyed hash function that is based on a symmetric key block cipher, such as the Advanced Encryption Standard [NIST-AES]. CMAC is equivalent to the One-Key CBC MAC1 (OMAC1) submitted by Iwata and Kurosawa [OMAC1a, OMAC1b]. OMAC1 is an improvement of the eXtended Cipher Block Chaining mode (XCBC) submitted by Black and Rogaway [XCBCa, XCBCb], which itself is an improvement of the basic Cipher Block Chaining-Message Authentication Code (CBC-MAC). XCBC efficiently addresses the security deficiencies of CBC-MAC, and OMAC1 efficiently reduces the key size of XCBC. AES-CMAC provides stronger assurance of data integrity than a checksum or an error-detecting code. The verification of a checksum or an error-detecting code detects only accidental modifications of the data, while CMAC is designed to detect intentional, unauthorized modifications of the data, as well as accidental modifications. AES-CMAC achieves a security goal similar to that of HMAC [RFC-HMAC]. Since AES-CMAC is based on a symmetric key block cipher, AES, and HMAC is based on a hash function, such as SHA-1, AES-CMAC is appropriate for information systems in which AES is more readily available than a hash function. This memo specifies the authentication algorithm based on CMAC with AES-128. This new authentication algorithm is named AES-CMAC.
### AES_CMAC算法的C语言实现 AES_CMAC (Cipher-based Message Authentication Code) 是一种基于分组密码的消息认证码算法,通常用于验证数据完整性并提供消息真实性校验。该算法定义在NIST SP 800-38B标准文档中。 对于AES_CMAC算法,在开源社区中有多种实现方式可供选择。其中最常见的是通过使用OpenSSL库来获取AES_CMAC功能支持[^1]: ```c #include <openssl/evp.h> #include <openssl/cmac.h> unsigned char *key = ...; /* 密钥 */ size_t keylen; const unsigned char *message = ...; /* 待处理的数据 */ size_t msg_len; /* 初始化CMAC上下文 */ CMAC_CTX *ctx = CMAC_CTX_new(); EVP_CIPHER *cipher = EVP_aes_128_cbc(); // 可选其他模式如GCM, CTR等 // 设置密钥和初始化向量(IV),注意这里不需要IV参数因为CMAC不依赖于它 if (!CMAC_Init(ctx, key, keylen, cipher, NULL)) { // 处理错误... } // 更新待计算的消息体部分 if (!CMAC_Update(ctx, message, msg_len)) { // 错误处理逻辑... } // 完成计算得到最终的结果 unsigned int mac_size; unsigned char result[EVP_MAX_MD_SIZE]; if (!CMAC_Final(result, ctx, &mac_size)) { // 错误处理... } ``` 上述代码片段展示了如何利用OpenSSL中的`CMAC_*`系列函数接口完成一次完整的AES-CMAC运算过程。需要注意的是,实际应用时应确保所使用的编译工具链能够正确解析目标平台上的SIMD指令扩展特性,比如当涉及到更高级别的优化选项或者特定硬件加速需求时[^2]。 #### 关键点说明 - 使用了OpenSSL提供的API来进行AES_CMAC操作; - 需要包含必要的头文件,并链接相应的动态或静态库; - 对输入数据进行了适当的安全性和有效性检查;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值