AES128 CMAC运行结果错误

yangyanzhao 2017-08-22 11:28:32
void AESCMac::LoRaMacJoinComputeMic(const unsigned char *buffer, unsigned short size, unsigned char *mic)
{
AES_CMAC_Init(AesCmacCtx);

AES_CMAC_SetKey(AesCmacCtx, m_Key);

AES_CMAC_Update(AesCmacCtx, buffer, size & 0xFF);

AES_CMAC_Final(mic, AesCmacCtx);

}

void AESCMac::AES_CMAC_Final(unsigned char digest[AES_CMAC_DIGEST_LENGTH], AES_CMAC_CTX *ctx)
{
unsigned char K[16];
unsigned char in[16];
/* generate subkey K1 */
memset1(K, '\0', 16);
//memcpy(K, m_Key, 16);

//rijndael_encrypt(&ctx->rijndael, K, K);

aes_encrypt(K, K, &ctx->rijndael);

if (K[0] & 0x80) {
LSHIFT(K, K);
K[15] ^= 0x87;
}
else
LSHIFT(K, K);


if (ctx->M_n == 16) {
/* last block was a complete block */
XOR(K, ctx->M_last);

}
else {
/* generate subkey K2 */
if (K[0] & 0x80) {
LSHIFT(K, K);
K[15] ^= 0x87;
}
else
LSHIFT(K, K);

/* padding(M_last) */
ctx->M_last[ctx->M_n] = 0x80;
while (++ctx->M_n < 16)
ctx->M_last[ctx->M_n] = 0;

XOR(K, ctx->M_last);


}
XOR(ctx->M_last, ctx->X);

//rijndael_encrypt(&ctx->rijndael, ctx->X, digest);

memcpy1(in, &ctx->X[0], 16); //Bestela ez du ondo iten
aes_encrypt(in, digest, &ctx->rijndael);
memset1(K, 0, sizeof(K));

}

void AESCMac::AES_CMAC_Update(AES_CMAC_CTX *ctx, const unsigned char *data, unsigned int len)
{
unsigned int mlen;
unsigned char in[16];
//memset1(in, 0, 16);
if (ctx->M_n > 0) {
mlen = min(16 - ctx->M_n, len);
memcpy1(ctx->M_last + ctx->M_n, data, mlen);
ctx->M_n += mlen;
if (ctx->M_n < 16 || len == mlen)
return;
XOR(ctx->M_last, ctx->X);
//rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X);
aes_encrypt(ctx->X, ctx->X, &ctx->rijndael);
data += mlen;
len -= mlen;
}
while (len > 16) { /* not last block */

XOR(data, ctx->X);
//rijndael_encrypt(&ctx->rijndael, ctx->X, ctx->X);

memcpy1(in, &ctx->X[0], 16); //Bestela ez du ondo iten
aes_encrypt(in, in, &ctx->rijndael);
memcpy1(&ctx->X[0], in, 16);

data += 16;
len -= 16;
}
/* potential last block, save it */
memcpy1(ctx->M_last, data, len);
ctx->M_n = len;
}
...全文
793 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyanzhao 2017-08-23
  • 打赏
  • 举报
回复
应该是7ebf
yangyanzhao 2017-08-23
  • 打赏
  • 举报
回复
unsigned int main(unsigned int argc, unsigned char* argv[]) { //unsigned char unsigned input[1000]; unsigned int data[1000]; unsigned int plaintext[4][4],ciphertext[4][4],L[4][4],key1[4][4],key2[4][4]; unsigned int i,j,n,num,p,q,len,temp1,temp2; num = 19; unsigned int type=0; for (i = 0; i < 4; i++){ for (j = 0; j < 4; j++) { ciphertext[i][j] = 0; L[i][j] = 0; } } //unsigned char unsigned input[19] = {0x01, 0x22, 0x7d, 0x61, 0x63, 0x22, 0x3a, 0x22, 0x62, 0x4e, 0x00, 0x4f, 0x02, 0x30, 0x30, 0x41, 0x7b, 0x03, 0xb2 }; unsigned char input[19] = { 0x01, 0x4e, 0x00, 0x4f, 0x02, 0x30, 0x30, 0x41, 0x7b, 0x22, 0x7d, 0x61, 0x63, 0x22, 0x3a, 0x22, 0x62, 0X38, 0X32 }; //unsigned char unsigned input[19] = { 'a', 'b', 'c', 'd','e', 'f', 'g', 'h','i', 'j', 'k', 'l','m', 'n', 'o', 'p','q','r','s' }; //unsigned char unsigned input[14] = { 0x01, 0x4e, 0x00, 0x4f, 0x02, 0x30, 0x30, 0x41, 0x7b, 0x22, 0x7d, 0x61, 0x63, 0x22}; //unsigned char unsigned input[19] = { 0x01, 0x4e, 0x00, 0x4f, 0x02, 0x30, 0x30, 0x41, 0x7b, 0x22, 0x7d, 0x61, 0x63, 0x22, 0x3a, 0x22, 0x62, 0X03, 0Xb2 }; //unsigned char unsigned input[19] = { 0X01, 0x5d, 0x02, 0x5e, 0x01, 0x3c, 0x30, 0x00, 0xb7, 0x27, 0xea, 0xfe, 0xfd, 0x1b, 0xf0, 0x2b, 0x7b, 0x02, 0x92 }; len = 4; n=num/16; j=0; for(i=0;i<num;i++) //将输入的字符转化成8bits的数字 { data[i] = input[i]; } //LoadMacKey((unsigned char*)key);//加载MAC key //GenerateMAC(19, (unsigned char*)input, MAC);// AESCMac macAes(key); macAes.LoRaMacJoinComputeMic((const unsigned char*)input, 19, MAC); //LoRaMacJoinComputeMic((const unsigned char*)input, 19, (const unsigned char*)key, MAC); return 0; } 结果应该是4ebf(16进制)
赵4老师 2017-08-22
  • 打赏
  • 举报
回复
仅供参考:
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧