有人能给出一个使用OpenSSL AES CCM的加密/解密示例吗?

有人能给出一个使用OpenSSL AES CCM的加密/解密示例吗?,openssl,aes,Openssl,Aes,我正在寻找一个使用OpenSSL的AES CCM加密的示例。显然,这是除EVP_CipherInit_ex()之外需要额外设置的两种“自定义”密码模式之一。如有任何建议,将不胜感激。简言之: // Tell the alg we will encrypt Psize bytes int outl = 0; EVP_EncryptUpdate(ctx, 0, &outl, 0, Psize); // Add the AAD EVP_EncryptUpdate(ctx, 0, &o

我正在寻找一个使用OpenSSL的AES CCM加密的示例。显然,这是除EVP_CipherInit_ex()之外需要额外设置的两种“自定义”密码模式之一。如有任何建议,将不胜感激。

简言之:

// Tell the alg we will encrypt Psize bytes
int outl = 0;
EVP_EncryptUpdate(ctx, 0, &outl, 0, Psize);

// Add the AAD
EVP_EncryptUpdate(ctx, 0, &outl, A, Asize);

// Now we encrypt the data in P, placing the output in CT
EVP_EncryptUpdate(ctx, CT, &outl, P, Psize);

有关更多详细信息,请参阅我的博客文章。

查看一个完整的简单AES CCM加密/解密示例,该示例使用了一些NIST数据,我强烈建议访问OpenSSL Github演示库,如下所示:


该示例运行良好,带有注释和调试输出。

这里是一个使用OpenSSL CCM-AES-128进行加密和解密的示例

#包括
#包括
#包括
void str2hex(char*,char*,int);
void printBytes(无符号字符*,大小\u t);
int main(){
无符号字符*aad,*pt,*key,*nonce;
int Klen、Alen、Nlen、Plen、Tlen、Clen;
int-outl=0;
key=“5a33980e71e7d67fd6cf171454dc96e5”;
aad=“ECA622A37570DF619E10EBB18BEBADB2B2B49C4D2B2FF715873BB672E30FC0FF”;
nonce=“33AE68EBB80106B3DA6B9CB29”;
pt=“A34DFA24847C365291CE1B54BCF8D9A75D861E5133CC3CA74”;
Klen=斯特伦(钥匙)/2;
Alen=strlen(aad)/2;
Nlen=strlen(nonce)/2;
Plen=strlen(pt)/2;
Tlen=16;
Clen=Plen+Tlen;
无符号字符keyy[Klen]、aadd[Alen]、noncee[Nlen]、ptt[Plen];
无符号字符ct[Clen],dt[Plen];
str2hex(key,key,Klen);
str2hex(pt、ptt、Plen);
str2hex(aad、aadd、Alen);
str2hex(nonce、noncee、Nlen);
EVP_CIPHER_CTX*CTX=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(CTX);
EVP_EncryptInit(ctx,EVP_aes_128_ccm(),0,0);
EVP_密码_CTX_ctrl(CTX,EVP_ctrl_CCM_SET_IVLEN,Nlen,0);
EVP\U密码\U CTX\U ctrl(CTX,EVP\U ctrl\U CCM\U SET\U标记,Tlen,0);
EVP_EncryptInit(ctx、0、keyy、noncee);
执行副总裁EncryptUpdate(ctx、0和outl、0、Plen);
执行副总裁EncryptUpdate(ctx、0和outl、aadd、Alen);
执行副总裁(ctx、ct和outl、ptt、Plen);
执行副总裁(ctx和ct[outl]、&outl);
EVP\U密码\U CTX\U ctrl(CTX、EVP\U ctrl\U CCM\U GET\U标签、Tlen、ct+Plen);
printf(“纯文本“=%s”,pt);
//printf(“\nciphertext'=7A60FA7EE8859E283CCE378FB6B95522AB8B70EFCDB0265F7C4B4FA5976B86DD1353E400F28864”);
printf(“\n”);
printf(“\nChipherText:”);
printBytes(ct,Clen);
EVP_DecryptInit(ctx,EVP_aes_128_ccm(),0,0);
EVP_密码_CTX_ctrl(CTX,EVP_ctrl_CCM_SET_IVLEN,Nlen,0);
EVP\U密码CTX\U控制(CTX、EVP\U控制CCM\U设置标签、Tlen、ct+Plen);
EVP_DecryptInit(ctx,0,keyy,noncee);
执行副总裁(ctx、0和outl、0、Plen);
执行副总裁(ctx、0和outl、aadd、Alen);
执行副总裁(ctx、dt和outl、ct、Plen);
执行副总裁(ctx,&dt[outl],&outl);
printf(“纯文本:”);
打印字节(dt、Plen);
返回0;
}
void str2hex(char*str,char*hex,int len){
int tt,ss;
无符号字符温度[4];
对于(tt=0,ss=0;tt
我不知道OpenSSL,但我认为您主要需要设置初始化向量。初始化向量始终是EVP\u CipherInit\u ex()的和参数,因此已经存在了。似乎我可以使用EVP_CIPHER_CTX_ctrl()设置特殊参数,但它们没有任何效果。上面说“EVP_CIPHER_CTX_ctrl()允许确定和设置各种特定于密码的参数。目前只能设置RC2的有效密钥长度和RC5的轮数。”它没有提到CCM(CTR+CBC-MAC),不过,我应该提到CCM模式仅在1.0.1快照中实现。这还包括对EVP#u CIPHER_CTX_ctrl的其他定义,但它们似乎不会影响任何东西。我可能应该把它和他们的邮件列表一起提出来,如果我发现了什么,我会报告回来。这是1.0.1版本提供的还是1.1.0版本的“官方”版本?这是1.0.1版本提供的,请参阅evp.h。