如何使用 OpenSSL 的 CMAC_xxx 函数计算 AES CMAC?
Posted
技术标签:
【中文标题】如何使用 OpenSSL 的 CMAC_xxx 函数计算 AES CMAC?【英文标题】:How to calculate AES CMAC using OpenSSL's CMAC_xxx functions? 【发布时间】:2015-02-05 21:56:58 【问题描述】:有没有办法用OpenSSL
/libcrypto
计算 AES CMAC?
最好以利用 AES-NI(或任何其他硬件加速)的方式进行。
另见CMAC Key generation with OpenSSL EVP_DigestSign* fails
【问题讨论】:
另请参阅 OpenSSL wiki 上的 EVP Signing and Verifying。 EVP 接口是此操作的推荐接口。 但是是否可以将 EVP 用于 CMAC?我试图找到一种方法,但是哪种摘要/符号组合会产生真正的 AES 128 CMAC? ecerulm 我还希望通过 EVP 接口将 OpenSSL 用于 CMAC。这事有进一步更新吗?你成功了吗? 我上次检查是一年前,我无法让它工作。 ecerlum:你知道你卡在哪里了吗?我在生成 CMAC 密钥时遇到问题... 【参考方案1】:如my blog post 中所述,您可以使用lib crypto
中的CMAC_CTX_new
、CMAC_Init
、CMAC_Update
和CMAC_Final
来计算AES-128-CBC CMAC。这是一个例子:
#include <stdio.h>
#include <openssl/cmac.h>
void printBytes(unsigned char *buf, size_t len)
for(int i=0; i<len; i++)
printf("%02x ", buf[i]);
printf("\n");
int main(int argc, char *argv[])
// https://tools.ietf.org/html/rfc4493
// K, M and T from
// http://csrc.nist.gov/publications/nistpubs/800-38B/Updated_CMAC_Examples.pdf
// D.1 AES-128
// K: 2b7e1516 28aed2a6 abf71588 09cf4f3c
unsigned char key[] = 0x2b,0x7e,0x15,0x16,
0x28,0xae,0xd2,0xa6,
0xab,0xf7,0x15,0x88,
0x09,0xcf,0x4f,0x3c;
// M: 6bc1bee2 2e409f96 e93d7e11 7393172a Mlen: 128
unsigned char message[] = 0x6b,0xc1,0xbe,0xe2,
0x2e,0x40,0x9f,0x96,
0xe9,0x3d,0x7e,0x11,
0x73,0x93,0x17,0x2a ;
unsigned char mact[16] = 0;
size_t mactlen;
CMAC_CTX *ctx = CMAC_CTX_new();
CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL);
printf("message length = %lu bytes (%lu bits)\n",sizeof(message), sizeof(message)*8);
CMAC_Update(ctx, message, sizeof(message));
CMAC_Final(ctx, mact, &mactlen);
printBytes(mact, mactlen);
/* expected result T = 070a16b4 6b4d4144 f79bdd9d d04a287c */
CMAC_CTX_free(ctx);
return 0;
【讨论】:
以上是关于如何使用 OpenSSL 的 CMAC_xxx 函数计算 AES CMAC?的主要内容,如果未能解决你的问题,请参考以下文章