?? mac.cpp
字號:
// MAC.cpp: implementation of the CMAC class.
//
//////////////////////////////////////////////////////////////////////
//#include "stdafx.h"
#include "MAC.h"
#include "des1.h"
#include <stdlib.h>
// ------------ CMAC::GetMac() ---------------
// 功能: 計算PBOC(IC卡)規(guī)范所定義的MAC
// 參數(shù):
// [in] key: 密鑰(8字節(jié)/16字節(jié), 由nKeyLen標識)
// [in] nKeyLen: 密鑰長度標識, 1-單長密鑰 2-雙長密鑰
// [in] input: 待計算的數(shù)據(jù)塊(長度任意,不需補齊)
// [in] nLen: 數(shù)據(jù)塊的長度
// [in] random: 隨機數(shù)(4字節(jié))
// [in] bRandom: 隨機數(shù)使用標志, TRUE-使用隨機數(shù), FALSE-不使用隨機數(shù)
// [out] MAC: MAC計算結(jié)果(4字節(jié))
// 返值:
// <void>
// 說明: 一般交易命令和通用命令中的MAC計算, 初值為8個'0x00',此時
// 應(yīng)輸入bRandom為FALSE, random為NULL. PBOC規(guī)范第二部分應(yīng)用
// 維護功能的交易, MAC計算的初值為4字節(jié)隨機數(shù)后綴以4個'0x00',
// 這種情況下,應(yīng)輸入bRandom為TRUE, random中應(yīng)填入隨機數(shù)
void GetMac1(unsigned char key[], int nKeyLen, unsigned char input[], int nLen, unsigned char random[], int bRandom, unsigned char MAC[])
{
int nBlock,i,j;
unsigned char temp[8];
unsigned char *buf;
if (nKeyLen <1 || nKeyLen > 2)
return;
/* 初始化MAC計算初值 ==> temp*/
memset(temp, 0, sizeof(temp));
if ( 1 == bRandom )
{
memcpy(temp, random, 8 * sizeof(unsigned char));
}
else
{
if (random != NULL)
return;
}
/* 格式化輸入值: 填 "80 00 00 ...", 湊8字節(jié)長度 ==> buf*/
nBlock = nLen/8 + 1; /* 總塊數(shù)*/
buf = (unsigned char *)malloc(nBlock*8);
memset(buf, 0, nBlock*8*sizeof(unsigned char));
memcpy(buf, input, nLen*sizeof(unsigned char));
buf[nLen] = 0x80;
for (i=0; i<nBlock; i++)
{
/* temp .EOR. block[i] ==> temp*/
for(j=0; j<8; j++)
{
temp[j] ^= buf[i*8+j];
}
/* temp ==> DES ==> temp*/
Encrypt(temp, key, temp);
}
free(buf);
if (nKeyLen == 2)
{
Decrypt(temp, &key[8], temp);
Encrypt(temp, key, temp);
}
/* temp 左四位 ==> MAC*/
memcpy(MAC, temp, 4 * sizeof(unsigned char));
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -