📄 cema.cpp
字号:
#include <stdio.h>
#include "iostream.h"
void CMEA(unsigned char *msg_buf, const int octet_count); //声明CMEA加密函数
static unsigned char tbox(const unsigned char z); //声明CMEA加密函数中用到的tbox
unsigned char CaveTable[256] =
{ 0xd9, 0x23, 0x5f, 0xe6, 0xca, 0x68, 0x97, 0xb0,
0x7b, 0xf2, 0x0c, 0x34, 0x11, 0xa5, 0x8d, 0x4e,
0x0a, 0x46, 0x77, 0x8d, 0x10, 0x9f, 0x5e, 0x62,
0xf1, 0x34, 0xec, 0xa5, 0xc9, 0xb3, 0xd8, 0x2b,
0x59, 0x47, 0xe3, 0xd2, 0xff, 0xae, 0x64, 0xca,
0x15, 0x8b, 0x7d, 0x38, 0x21, 0xbc, 0x96, 0x00,
0x49, 0x56, 0x23, 0x15, 0x97, 0xe4, 0xcb, 0x6f,
0xf2, 0x70, 0x3c, 0x88, 0xba, 0xd1, 0x0d, 0xae,
0xe2, 0x38, 0xba, 0x44, 0x9f, 0x83, 0x5d, 0x1c,
0xde, 0xab, 0xc7, 0x65, 0xf1, 0x76, 0x09, 0x20,
0x86, 0xbd, 0x0a, 0xf1, 0x3c, 0xa7, 0x29, 0x93,
0xcb, 0x45, 0x5f, 0xe8, 0x10, 0x74, 0x62, 0xde,
0xb8, 0x77, 0x80, 0xd1, 0x12, 0x26, 0xac, 0x6d,
0xe9, 0xcf, 0xf3, 0x54, 0x3a, 0x0b, 0x95, 0x4e,
0xb1, 0x30, 0xa4, 0x96, 0xf8, 0x57, 0x49, 0x8e,
0x05, 0x1f, 0x62, 0x7c, 0xc3, 0x2b, 0xda, 0xed,
0xbb, 0x86, 0x0d, 0x7a, 0x97, 0x13, 0x6c, 0x4e,
0x51, 0x30, 0xe5, 0xf2, 0x2f, 0xd8, 0xc4, 0xa9,
0x91, 0x76, 0xf0, 0x17, 0x43, 0x38, 0x29, 0x84,
0xa2, 0xdb, 0xef, 0x65, 0x5e, 0xca, 0x0d, 0xbc,
0xe7, 0xfa, 0xd8, 0x81, 0x6f, 0x00, 0x14, 0x42,
0x25, 0x7c, 0x5d, 0xc9, 0x9e, 0xb6, 0x33, 0xab,
0x5a, 0x6f, 0x9b, 0xd9, 0xfe, 0x71, 0x44, 0xc5,
0x37, 0xa2, 0x88, 0x2d, 0x00, 0xb6, 0x13, 0xec,
0x4e, 0x96, 0xa8, 0x5a, 0xb5, 0xd7, 0xc3, 0x8d,
0x3f, 0xf2, 0xec, 0x04, 0x60, 0x71, 0x1b, 0x29,
0x04, 0x79, 0xe3, 0xc7, 0x1b, 0x66, 0x81, 0x4a,
0x25, 0x9d, 0xdc, 0x5f, 0x3e, 0xb0, 0xf8, 0xa2,
0x91, 0x34, 0xf6, 0x5c, 0x67, 0x89, 0x73, 0x05,
0x22, 0xaa, 0xcb, 0xee, 0xbf, 0x18, 0xd0, 0x4d,
0xf5, 0x36, 0xae, 0x01, 0x2f, 0x94, 0xc3, 0x49,
0x8b, 0xbd, 0x58, 0x12, 0xe0, 0x77, 0x6c, 0xda }; //定义CaveTable
/* test plaintext */
//unsigned char buf[6] = { 0xb6, 0x2d, 0xa2, 0x44, 0xfe, 0x9b }; //输入明文
//unsigned char mybuf[6];
//for(int i=0;i<6;i++)
//scanf("%x",&mybuf[i]);
// cout<<endl;
/*test cmeakey */
unsigned char cmeakey[8] = { 0xA0, 0x7B, 0x1C, 0xD1, 0x02, 0x75, 0x69, 0x14}; //输入密钥
void pause(void)
{
printf("Enter to continue\n");
getchar();
} //停顿函数
/*定义CMEA加密函数*/
void CMEA(unsigned char *msg_buf, const int octet_count)
{
int msg_index,half;
unsigned char k,z;
/* first manipulation (inverse of third) */
z = 0;
for (msg_index = 0; msg_index < octet_count; msg_index++)
{
k = tbox((unsigned char)(z ^ (msg_index & 0xff)));
msg_buf[msg_index] += k;
z += msg_buf[msg_index];
}
/* second manipulation (self-inverse) */
half = octet_count/2;
for (msg_index = 0; msg_index < half; msg_index++)
{
msg_buf[msg_index] ^=
msg_buf[octet_count - 1 - msg_index] | 0x01;
}
/* third manipulation (inverse of first) */
z = 0;
for (msg_index = 0; msg_index < octet_count; msg_index++)
{
k = tbox((unsigned char)(z ^ (msg_index & 0xff)));
z += msg_buf[msg_index];
msg_buf[msg_index] -= k;
}
}
//加解密后的消息都用msg_buf[]表示,k,z是中间量,octet_count是消息字节数
/*定义T-box如下*/
/* tbox has the same header as CAVE (see Exhibit 2-4) */
static unsigned char tbox(const unsigned char z)//z表示t盒的计算结果
{
int k_index,i;
unsigned char result;
k_index = 0;
result = z;
for (i = 0; i < 4; i++)
{
result ^= cmeakey[k_index];
result += cmeakey[k_index+1];
result = z + CaveTable[result];
k_index += 2;
}
return(result);
}
/* CMEA 加密的主函数 */
void main(void)
{
int i ;
unsigned char test_buf[6];
/* vector 1 */
printf("\nVector 1\n\n"); //可验证多组矢量
unsigned char mybuf[6];
printf(" test plaintext");
printf("\n");
for(i=0; i<6;i++)
scanf("%x", &mybuf[i]); //从键盘输入数据,注意取地址&,输入数据时要打回车,
// 也可用空格隔开但不限制输入数
//for (i = 0; i < 6; i++)
//printf(" %02x",(unsigned int)mybuf[i]);
printf("\n"); //显示输入的明文
printf(" test cmeakey =");
for (i = 0; i < 8; i++)
printf(" %02x",(unsigned int)cmeakey[i]);
printf("\n"); //显示输入的密钥
pause(); //调用停顿函数
for (i = 0; i < 6; i++)
test_buf[i] = mybuf[i]; //给形参赋值
CMEA(test_buf,6); //调用CMEA加密函数
printf(" CMEA Output =");
for (i = 0; i < 6; i++)
printf(" %02x",(unsigned int)test_buf[i]);
printf("\n");
CMEA(test_buf,6); //再次调用CMEA加密函数
printf(" 逆CMEA Output =");
for (i = 0; i < 6; i++)
printf(" %02x",(unsigned int)test_buf[i]);
printf("\n"); //输出解密结果
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -