jm.c

来自「AT91fr40162的FLASH读写程序」· C语言 代码 · 共 179 行

C
179
字号
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include <stdio.h>
#include <stdlib.h>

_BYTE Key1[16] = {
  0x98,0x05,0x15,0xfb,0xc4,0x76,0xdc,0x32,
  0x3d,0xfc,0x65,0x10,0x28,0x67,0x82,0x99
};

_BYTE Key2[16] = {
  0x95,0x08,0x01,0x6b,0x84,0x62,0x7c,0x93,
  0xfd,0x3c,0x5f,0x51,0xc2,0x6d,0x78,0x92
};

_BYTE Key3[16] = {
  0x5C,0x8B,0x4F,0xDB,0xDC,0xCC,0x1B,0x7C,
  0xFC,0xFD,0xFE,0x75,0x2A,0x1C,0x75,0x2B
};

_BYTE DeCode(_BYTE *cpBuf,_WORD wLenOfBuf);
_BYTE UnCode(_BYTE *cpBuf,_WORD wLenOfBuf);

// 对指定的信息进行加密
// 待加密的信息存储在cpBuf中,加密后的信息仍然存储在cpBuf中;
// wLenOfBuf为待加密信息的长度
_BYTE DeCode(_BYTE *cpBuf,_WORD wLenOfBuf)
{
  	_WORD i,j,k;
  	_BYTE cByte[9],cKey,cByte1,cByte2,cByte3,cByte4;
   	// 变反
   	// 高四位和低四位交换

   	j=0;
   	for (i=0;i<wLenOfBuf;i++) {
      	cByte1 = ~cpBuf[i];
      	cByte2 = cByte1;
      	cByte1 &= 0xf0;
      	cByte1 = cByte1 >>4;
      	cByte2 &= 0x0f;
      	cByte2 = cByte2 <<4;
      	cpBuf[i] = (cByte1 | cByte2) ^ Key1[j];
      	j++;
      	if (j>=16) j=0;
   	}

   	// 对相邻的两个字节进行重新组合
   	// 组合的方法为 11112222 33334444 -> 44441111 22223333;
   	j=0;
   	for (i=0;i<wLenOfBuf;i=i+2) {
      	if (i+1>=wLenOfBuf) break;
      	cByte1 = cpBuf[i] & 0xf0;
      	cByte2 = cpBuf[i] & 0x0f;
      	cByte3 = cpBuf[i+1] & 0xf0;
      	cByte4 = cpBuf[i+1] & 0x0f;
      	cpBuf[i] = cByte4 | cByte1;
      	cpBuf[i+1] = cByte2 | cByte3;
      	cpBuf[i] = cpBuf[i] ^ Key1[j];
      	cpBuf[i+1] = cpBuf[i+1] ^ Key1[j+1];
      	j += 2;
      	if (j>=16) j=0;
   	}

   	// 对单个字节进行位变换,变换的方法为
   	// 12345678 -> 53671824;
   	//             12345678
   	j=0;
   	for (i=0;i<wLenOfBuf;i++) {
      	cKey = 0x80;
      	for (k=1;k<=8;k++) {
         	cByte[k]  = (cpBuf[i] & cKey);
         	cKey = cKey >> 1;
      	}
      	cByte[1] >>= 4;
      	cByte[2] >>= 5;
      	cByte[3] <<= 1;
      	cByte[4] >>= 4;
      	cByte[5] <<= 4;
      	cByte[6] <<= 3;
      	cByte[7] <<= 3;
      	cByte[8] <<= 2;

      	cpBuf[i] = cByte[1];
      	for (k=2;k<=8;k++) cpBuf[i] |= cByte[k];
      	cpBuf[i] ^= Key3[j];
      	j++;
      	if (j>=16) j=0;
   	}

   	// 进行关联变换
   	cKey = 0xd5;
   	for (i=0;i<wLenOfBuf;i++) {
      	cpBuf[i] = cpBuf[i] ^ cKey;
      	cKey = cpBuf[i];
   	}
   	return(C_OK);
}


// 对信息进行解密
_BYTE UnCode(_BYTE *cpBuf,_WORD wLenOfBuf)
{
   	_WORD i,j,k;
   	_BYTE cByte[9],cKey,cByte1,cByte2,cByte3,cByte4;


   	// 进行关联变换--反变换
   	cKey = 0xd5;
   	for (i=wLenOfBuf-1;i>=1;i--) {
      	cpBuf[i] = cpBuf[i] ^ cpBuf[i-1];
   	}
   	cpBuf[0] = cpBuf[0] ^ cKey;


   	// 对单个字节进行位变换,变换的方法为
   	// 12345678 -> 53671824;
   	//             12345678
   	j=0;
   	for (i=0;i<wLenOfBuf;i++) {
      	cpBuf[i] = cpBuf[i] ^ Key3[j];
      	j++;
      	if (j>=16) j=0;
      	cKey = 0x80;
      	for (k=1;k<=8;k++) {
         	cByte[k]  = (cpBuf[i] & cKey);
         	cKey = cKey >> 1;
      	}
      	cByte[1] >>= 4;
      	cByte[2] >>= 1;
      	cByte[3] >>= 3;
      	cByte[4] >>= 3;
      	cByte[5] <<= 4;
      	cByte[6] >>= 2;
      	cByte[7] <<= 5;
      	cByte[8] <<= 4;
      	cpBuf[i] = cByte[1];
      	for (k=2;k<=8;k++) cpBuf[i] |= cByte[k];
   	}


   	// 对相邻的两个字节进行重新组合
   	// 组合的方法为 11112222 33334444 -> 44441111 22223333;
   	//                                   11112222 33334444
   	j=0;
   	for (i=0;i<wLenOfBuf;i=i+2) {
      	if (i+1>=wLenOfBuf) break;
      	cpBuf[i] = cpBuf[i] ^ Key1[j];
      	cpBuf[i+1] = cpBuf[i+1] ^ Key1[j+1];
      	j += 2;
      	if (j>=16) j=0;
      	cByte1 = cpBuf[i] & 0xf0;
      	cByte2 = cpBuf[i] & 0x0f;
      	cByte3 = cpBuf[i+1] & 0xf0;
      	cByte4 = cpBuf[i+1] & 0x0f;
      	cpBuf[i] = cByte4 | cByte1;
      	cpBuf[i+1] = cByte2 | cByte3;
   	}

   	// 变反
   	// 高四位和低四位交换
   	j=0;
   	for (i=0;i<wLenOfBuf;i++) {
      	cpBuf[i] = cpBuf[i] ^ Key1[j];
      	j++;
      	if (j>=16) j=0;
      	cByte1 = cpBuf[i];
      	cByte2 = cByte1;
      	cByte1 &= 0xf0;
      	cByte1 = cByte1 >>4;
      	cByte2 &= 0x0f;
      	cByte2 = cByte2 <<4;
      	cpBuf[i] = (cByte1 | cByte2);
      	cpBuf[i] = ~cpBuf[i];
   	}
   	return(C_OK);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?