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 + -
显示快捷键?