⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cema.cpp

📁 在cdma2000移动通信系统中使用CMEA算法实现空中接口部分的数据加密。
💻 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 + -