当年我们在DOS下真人手机网页版:,高级加密标准由美国国家标准与技术研究院

2019-11-14 作者:首页   |   浏览(82)

这是我1999年写的一篇文章了,应该说,经过了这么多年的进步,文中很多与DOS相关的内容,现在看起来已经不合时宜了,不过,我认为里面的一些理念,到任何时候都不会过时。

arm开发板lcd屏幕中怎么把一个图片的颜色改变另一个颜色
以下是lcd的程序,求大神指教

=== 分割线,把下面的天书粘帖到a.c文件=========

#include "stdafx.h"
#include "string.h"
#include "AES.h"

这个是同学的作品 不是我写的

最近看到tr110223网友的《C语言编写简单2D游戏》

/**************************************************************
The initial and control for 640×480 16Bpp TFT LCD----VGA
**************************************************************/

M[16],X=16,W,k;main(){T(system("stty cbreak")

AES::AES(unsigned char* key)
{
unsigned char sBox[] =
{ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, /*0*/
0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, /*1*/
0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15, /*2*/
0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75, /*3*/
0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84, /*4*/
0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf, /*5*/
0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8, /*6*/
0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2, /*7*/
0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73, /*8*/
0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb, /*9*/
0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79, /*a*/
0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08, /*b*/
0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a, /*c*/
0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e, /*d*/
0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf, /*e*/
0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 /*f*/
};
unsigned char invsBox[256] =
{ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, /*0*/
0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, /*1*/
0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, /*2*/
0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, /*3*/
0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, /*4*/
0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, /*5*/
0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, /*6*/
0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, /*7*/
0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, /*8*/
0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, /*9*/
0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, /*a*/
0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, /*b*/
0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, /*c*/
0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, /*d*/
0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, /*e*/
0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d /*f*/
};
memcpy(Sbox, sBox, 256);
memcpy(InvSbox, invsBox, 256);
KeyExpansion(key, w);
}

#include

有兴趣的朋友也可以了解一下,当年我们在DOS下,没有任何图形引擎的帮助下,是如何开发游戏程序的。

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"

);puts(W&1?"WIN":"LOSE");}K[]={2,3,1};s(f,d,i

AES::~AES()
{

#include

注:那个时侯我刚刚开始学习写文章没多久,呵呵,文中笔锋显得很粗糙、稚嫩,可读性并不是很好,请各位网友见谅。

extern const unsigned char sunflower_240x320[];
extern const unsigned char sunflower_800x480[];
extern const unsigned char sunflower_1024x768[];
extern const unsigned char sunflower_640x480[];

,j,l,P){for(i=4;i--;)for(j=k=l=0;k<4;)j<4?P=M

}

#include

DOS游戏编程二十一条(The 21 FAQ of PC DOS GAME)

#define LCD_XSIZE LCD_WIDTH
#define LCD_YSIZE LCD_HEIGHT
#define SCR_XSIZE LCD_WIDTH
#define SCR_YSIZE LCD_HEIGHT

[w(d,i,j++)],W|=P>>11,l*P&&(f?M[w(d,i,k)]=l<<

unsigned char* AES::Cipher(unsigned char* input)
{
unsigned char state[4][4];
int i,r,c;

//头文件

     我在一家游戏公司多年,现就自己的编程经验谈一点体会,希望能对大家有点帮助,
本文中所有例子均在WATCOM C/C++ 10.6下调试通过。
   
1、找一种好的编程语言:
    当然,游戏可以用任何语言编写,这是可以肯定的,我就使用过Turbo Basic编写过
跑马机游戏,还用VB写过一个半成品的网络拱猪游戏,但是,一个好的编程语言能够达到
好的效果,这是毋庸置疑的。一个游戏程序员,梦寐以求的就是一个方便、完美、高速的
语言。
    汇编是一种高速语言,但不够方便,如果要方便,就必须大量使用宏,笔者就曾经在
6502汇编语言中大量使用FOR,NEXT,PRINT等语句,全部是宏,但是相应的内存开销,时间
开销都加大了,不划算。
    WATCOM C/C++是一种好语言,可以访问大内存,速度快,也够方便,但是调试不够方
便,只能用自己写的调试函数解决问题。还有每次运行必须调用DOS/4GW这个32位环境程序,
既累赘又不方便,还占地方。
    MSC7.0也不错,通过它的虚拟内存机制也可以访问大内存,但可惜是16位仿真的,速
度太慢。
    DJGPP也是很不错,关键它是共享的,同时还带有一个Alleg的共享游戏库,非常好用,
推荐使用,但它生成的程序代码太大,不够优化。
    作为游戏程序员,我们追求的就是快一点、快一点、再快一点,如果还有更快的语言,
希望大家介绍给我。

volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

(l==P):0,k++),l=l?P?l-P?P:0:l:P:(f?M[w(d,i,k)

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
state[r][c] = input[c*4+r];
}
}

// 定义play1和play2的操作

2、要写专有程序,不要写通用的,通用,意味着慢,哪怕下次重新来过,也不能为了下次
耽误这次。同理,凡是系统给你的函数,调用,要有坚决不用的思想准备,要自己写一套。

/**************************************************************
640×480 TFT LCD数据和控制端口初始化
**************************************************************/
static void Lcd_Port_Init
{
rGPCUP=0xffffffff; // Disable Pull-up register
rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK

]=l:0,++k,W|=2*!l,l=0);}w(d,i,j){return d?w(d

AddRoundKey(state,w[0]);

#define play1up 'w'

3、写出来的程序,每秒钟必须刷屏70次以上,再通过时钟限制在30次不抖),剩下的时
间,就是运行你的游戏程序内容的时间,算一算,不多。

rGPDUP=0xffffffff; // Disable Pull-up registerrGPDCON=0xaaaaaaaa; //Initialize VD[15:8]

-1,j,3-i):4*i+j;}T(i){for(i=X+rand()%X;M[i%X]

for(i=1; i<=10; i++)
{
SubBytes(state);
ShiftRows(state);
if(i!=10)MixColumns(state);
AddRoundKey(state,w[i]);
}

#define play1down 's'

4、要有引擎的概念,引擎包含系统底层的程序,数据结构,调用方法等,这些直接限制你
以后的游戏好不好编,一般说来,我们做一个游戏半年时间,其中两个月编引擎,两个月编
游戏,剩下两个月调试,可见引擎的重要。永远记着,你写的程序,就计算机而言,就是在
搬数,把一堆数据提出来,处理一下搬到另外一块地方,就这么简单,那么,搬数的方法有
多重要,你知道了吧。

}

*i;i--);i?M[i%X]=2<<rand()%2:0;for(W=i=0;i<4;

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
input[c*4+r] = state[r][c];
}
}

#define play1left 'a'

5、绝对不能用乘除法、浮点数,我在一个游戏中,15万行程序,没有使用一个乘除法和浮
点数,一直很自豪。在这之前,我经常因为程序中的一个乘法在梦中吓醒,直到有一天学会
使用移位乘法。另外记住,游戏只用整数,如果你用了浮点数,改你的程序。这里给一个移
位乘法的例子,大家可以参考:
/*-------------------------------------------------------------------------------*/
//XiaoGe Made under WATCOM C/C++ 10.6
/*-------------------------------------------------------------------------------*/
int count_offest(int _width,int x,int y) //移位乘法计算显示偏移值
{
 int mode[17]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
 int i,offest=0;
 for (i=16;i>=0;i--)
 {
  if (_width>=mode[i])
  {
   offest+=(y<<i);
   _width-=mode[i];
   if (_width<1) break;
  }
 }
 return(offest+x);
}
/*-------------------------------------------------------------------------------*/
结果=屏幕宽度*y+x,很常用的。

/**************************************************************
640×480 TFT LCD功能模块初始化
**************************************************************/
static void LCD_Init
{
#define M5D&0x1fffff)
#define LCD_ADDR LCD_BUFFER)
rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1);
rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);
rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0);
rLCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0);

)s(0,i++);for(i=X,puts("e[2Je[H");i--;i%4||

return input;
}

#define play1right 'd'

6、没人会用数学描述去写一幅游戏图形,所有的图形都来自于美工画的PCX,BMP图形,去找一个
美工,或者偷一批图形吧。读写PCX,BMP的函数是必须的。

#if !defined
#define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))
#endif
rLCDCON5 = LCD_CON5;

puts(""))printf(M[i]?"%4d|":"    |",M[i]);W-2

unsigned char* AES::InvCipher(unsigned char* input)
{
unsigned char state[4][4];
int i,r,c;

#define play2up '8'

7、游戏程序员语录:给我一个画点函数吧,我能描绘出整个世界。任何时候下,一个最高速的
画点程序都是必要的,这里给出一个例子没有乘法的):
/*-------------------------------------------------------------------------------*/
//XiaoGe Made under WATCOM C/C++ 10.6
/*-------------------------------------------------------------------------------*/
void point(int x,int y,unsigned char color) //高速画点
{
 if ((color!=NO_COLOR)&&
  (x>=0)&&(x<SCR_H)&&
  (y>=0)&&(y<SCR_V))
 {
  #ifdef VESA_320_200
  *(buffer+(y<<8)+(y<<6)+x)=color;
  #endif
  #ifdef VESA_640_480
  *(buffer+(y<<9)+(y<<7)+x)=color;
  #endif
  #ifdef VESA_800_600
  *(buffer+(y<<9)+(y<<8)+(y<<5)+x)=color;
  #endif
  #ifdef VESA_1024_768
  *(buffer+(y<<10)+x)=color;
  #endif
  #ifdef VESA_1280_1024
  *(buffer+(y<<10)+(y<<8)+x)=color;
  #endif
 }
}
/*-------------------------------------------------------------------------------*/

rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0);rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);rLCDSADDR3 = LCD_WIDTH; rLCDINTMSK |= 3;rTCONSEL &= ;rTPAL = 0x0;rTCONSEL &= ~((1<<4) | 1);

||read(0,&k,3)|T(s (1,K[(k>>X)%4]));}//[2048]

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
state[r][c] = input[c*4+r];
}
}

#define play2down '5'

8、镂空算法很多,用的都是AND MASK+OR方式,不要去理它,每一个点要处理两遍,包含三次
读内存,两次逻辑运算,一次写内存,太慢了,在你的颜色中规定一种透明色,画点时不去管
它就行了上例)。记住,每个点上少处理一次,你至少可以多跳一圈舞。

}

=======分割线======================

AddRoundKey(state, w[10]);
for(i=9; i>=0; i--)
{
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(state, w[i]);
if(i)
{
InvMixColumns(state);
}
}

#define play2left '4'

9、双缓冲是必要的,但也不全是,很多教课书上把双缓冲作为消除屏幕闪烁的唯一方法,这不
对,因为只要跟踪了屏幕刷新周期,就不会闪,双缓冲直接带来的就是你的程序画点必须画两次
,一次向buffer,另一次重buffer搬到屏幕。我在做优化时,往往首先把双缓冲优化掉。没必要
浪费时间,就算有点闪,游戏是可以牺牲效果,换取时间的。这里给一个跟踪屏幕刷新周期的函
数,只要在你的刷屏程序前加上,效果基本上就可以了。
/*-------------------------------------------------------------------------------*/
//XiaoGe Made under WATCOM C/C++ 10.6
/*-------------------------------------------------------------------------------*/
void wait (void) //VGA屏幕刷新周期的测试
{
 while (inp(0x3DA)&0x08);
 while (!(inp(0x3DA)&0x08));
}
/*-------------------------------------------------------------------------------*/

/**************************************************************
LCD视频和控制信号输出或者停止,1开启视频输出
**************************************************************/
static void Lcd_EnvidOnOff(int onoff)
{
if
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}

 

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
input[c*4+r] = state[r][c];
}
}

#define play2right '6'

10、刷屏程序应该包含:背景屏幕刷新、精灵动画刷新、鼠标处理、键盘处理等,并且,每秒钟
必须能运行70次以上,如果做不到,优化你的程序。

/**************************************************************
320×240 8Bpp TFT LCD 电源控制引脚使能
**************************************************************/
static void Lcd_PowerEnable(int invpwren,int pwren)
{
//GPG4 is setted as LCD_PWREN
rGPGUP = rGPGUP|(1<<4); // Pull-up disable
rGPGCON = rGPGCON|(3<<8); //GPG4=LCD_PWREN

见证奇迹的时刻

return input;
}

#define play1lq ' '

11、优化是必须的,一个游戏引擎,至少应该优化7-10次,我的一个引擎,就优化了14次,速度
从每秒钟12.1屏到70屏。还有,不要使用编译器的优化,除非你想你的用户无法使用你的程序。

//Enable LCD POWER ENABLE FunctionrLCDCON5 = rLCDCON5&(~(1<<3))|(pwren<<3); // PWRENrLCDCON5 = rLCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN

 

void* AES::Cipher(void* input, int length)
{
unsigned char* in = (unsigned char*) input;
int i;
if(!length)
{
while(*(in+length++));
in = (unsigned char*) input;
}
for(i=0; i<length; i+=16)
{
Cipher(in+i);
}
return input;
}

#define play2lq '0'

12、计算你的每一步使用了几步操作,这一点在C中尤其重要,因为C太方便了,隐瞒了很多细节,
如下例:
从 *(Video+k)=*(p[1]+j);
 k++;
到 *(Video+(k++))=*(p[1]+j); //减少了一次k读内存操作
到 *(Video+(k++))=*(*(p+1)+j); //减少了把p转化成数组操作

}

gcc a.c -o a

void* AES::InvCipher(void* input, int length)
{
unsigned char* in = (unsigned char*) input;
int i;
for(i=0; i<length; i+=16)
{
InvCipher(in+i);
}
return input;
}

#define N 20

13、减少循环,循环中多开销了一次累加读写内存),一次比较读内存+1次逻辑),如下例:
从 for (i=0;i<10000;i++)
 {
  *(p+i)=0;
 }
到 for (i=0;i<10000;i+=10)  //循环次数减少9000次
 {
  *(p+i+0)=0;
  *(p+i+1)=0;
  *(p+i+2)=0;
  *(p+i+3)=0;
  *(p+i+4)=0;
  *(p+i+5)=0;
  *(p+i+6)=0;
  *(p+i+7)=0;
  *(p+i+8)=0;
  *(p+i+9)=0;
 }
到 for (i=0;i<10000;i+=10)  //20次读变量内存减少为12次读,1次写
 {
  j=p+i;
  *(j+0)=0;
  *(j+1)=0;
  *(j+2)=0;
  *(j+3)=0;
  *(j+4)=0;
  *(j+5)=0;
  *(j+6)=0;
  *(j+7)=0;
  *(j+8)=0;
  *(j+9)=0;
 }
到 for (i=0;i<10000;i+=10)  //10次读值内存减少为1次,其余为寄存器变量
 {
  j=p+i;
  *(j+0)=*(j+1)=*(j+2)=*(j+3)=*(j+4)=*(j+5)=*(j+6)=*(j+7)=*(j+8)=*(j+9)=0;
 }
当然,如果允许,可以写10000个,不过也没必要,减掉一多半就行了。关键在速度和程序容量上达成
平衡。另外,DO...WHILE比FOR和WHILE要少一次逻辑比较。

/**************************************************************
640×480 TFT LCD单个象素的显示数据输出
**************************************************************/
static void PutPixel(U32 x,U32 y,U16 c) //U16代表unsigned short U32代表unsigned int
{
if(x<SCR_XSIZE && y<SCR_YSIZE)
LCD_BUFFER[] = c;
}

真人手机网页版 1

void AES::KeyExpansion(unsigned char* key, unsigned char w[][4][4])
{
int i,j,r,c;
unsigned char rc[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
for(r=0; r<4; r++)
{
for(c=0; c<4; c++)
{
w[0][r][c] = key[r+c*4];
}
}
for(i=1; i<=10; i++)
{
for(j=0; j<4; j++)
{
unsigned char t[4];
for(r=0; r<4; r++)
{
t[r] = j ? w[i][r][j-1] : w[i-1][r][3];
}
if(j == 0)
{
unsigned char temp = t[0];
for(r=0; r<3; r++)
{
t[r] = Sbox[t[(r+1)%4]];
}
t[3] = Sbox[temp];
t[0] ^= rc[i-1];
}
for(r=0; r<4; r++)
{
w[i][r][j] = w[i-1][r][j] ^ t[r];
}
}
}
}

#define playnext 'q'

14、具体的说,处理一个图块时,很多人采用x,y两重循环,这是很值得研究的,根据屏幕特点,应该
只保留y循环,x方向直接线性累加处理即可。

/**************************************************************
640×480 TFT LCD全屏填充特定颜色单元或清屏
**************************************************************/
static void Lcd_ClearScr
{
unsigned int x,y ;

会有warning,不用管他,直接./a 运行

unsigned char AES::FFmul(unsigned char a, unsigned char b)
{
unsigned char bw[4];
unsigned char res=0;
int i;
bw[0] = b;
for(i=1; i<4; i++)
{
bw[i] = bw[i-1]<<1;
if(bw[i-1]&0x80)
{
bw[i]^=0x1b;
}
}
for(i=0; i<4; i++)
{
if((a>>i)&0x01)
{
res ^= bw[i];
}
}
return res;
}

#define exit 'e'

15、不要节约判断语句,它可能给你带来多一条语句的开销,但是却可能减少几百条语句的开销,1赔
100,赌了。

for( y = 0 ; y < SCR_YSIZE ; y++ ){ for( x = 0 ; x < SCR_XSIZE ; x++ ) { LCD_BUFFER[y][x] = c ; }}

真人手机网页版 2

void AES::SubBytes(unsigned char state[][4])
{
int r,c;
for(r=0; r<4; r++)
{
for(c=0; c<4; c++)
{
state[r][c] = Sbox[state[r][c]];
}
}
}

int m=1;

16、别给自己找病,养成良好的书写习惯,让编译程序为你检查错误,如下例
 if (i==1) 
写成 if (i=1) 编译不出错,但意思错了
写成 if (1=i) 编译就出错,可以检查出来

}

=======分割线======================

void AES::ShiftRows(unsigned char state[][4])
{
unsigned char t[4];
int r,c;
for(r=1; r<4; r++)
{
for(c=0; c<4; c++)
{
t[c] = state[r][(c+r)%4];
}
for(c=0; c<4; c++)
{
state[r][c] = t[c];
}
}
}

int p[N][N];/*记录棋盘落子情况*/

17、游戏程序没有主循环,主循环往往只是包含刷屏的一个死循环,更多的东东放在时钟里头,
要熟练拦截时钟,改变它的频率,你的画面就会动得流畅、自然。下面是一个拦截时钟的例子,
因为采用时钟循环,所以必须大量使用switch/case结构,要有思想准备。

/**************************************************************
LCD屏幕显示垂直翻转
// LCD display is flipped vertically
// But, think the algorithm by mathematics point.
// 3I2
// 4 I 1
// --+-- <-8 octants mathematical cordinate
// 5 I 8
// 6I7
**************************************************************/
static void Glib_Line(int x1,int y1,int x2,int y2, U16 color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;

美化版:

void AES::MixColumns(unsigned char state[][4])
{
unsigned char t[4];
int r,c;
for(c=0; c< 4; c++)
{
for(r=0; r<4; r++)
{
t[r] = state[r][c];
}
for(r=0; r<4; r++)
{
state[r][c] = FFmul(0x02, t[r])
^ FFmul(0x03, t[(r+1)%4])
^ FFmul(0x01, t[(r+2)%4])
^ FFmul(0x01, t[(r+3)%4]);
}
}
}

char q[N][N];/*记录棋盘交叉点棋子种类*/

/*-------------------------------------------------------------------------------*/
//XiaoGe Made under WATCOM C/C++ 10.6
/*-------------------------------------------------------------------------------*/
#define TIME_KEEPER_INT 0x1c
long timer_counter;
void (_interrupt far *Old_Time_Isr)();
void timer_program(void);
////////////////////////////////////////////////////////////////
//注意:中断函数中不能调用系统输入输出函数,应尽量使用自己的程序
void _interrupt Timer(void)
{
 timer_program(); //调用用户程序
 timer_counter++;
 Old_Time_Isr();
}
////////////////////////////////////////////////////////////////
#define CTRL_8253 0x43
#define CTRL_WORD 0x3c
#define COUNTER_0 0x40
#define COUNTER_1 0x41
#define COUNTER_2 0x42
#define LOW_BYTE(n) (n&0x00ff)
#define HI_BYTE(n) ((n>>8)&0x00ff)

if{ if(dy >= 0) // dy>=0 { if(dx>=dy) // 1/8 octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if{y1+=1;e-=dx;} x1+=1; e+=dy; } } else // 2/8 octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if{x1+=1;e-=dy;} y1+=1; e+=dx; } } } else // dy<0 { dy=-dy; // dy=abs if(dx>=dy) // 8/8 octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if{y1-=1;e-=dx;} x1+=1; e+=dy; } } else // 7/8 octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if{x1+=1;e-=dy;} y1-=1; e+=dx; } } } }else //dx<0{ dx=-dx; //dx=abs if(dy >= 0) // dy>=0 { if(dx>=dy) // 4/8 octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if{y1+=1;e-=dx;} x1-=1; e+=dy; } } else // 3/8 octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if{x1-=1;e-=dy;} y1+=1; e+=dx; } } } else // dy<0 { dy=-dy; // dy=abs if(dx>=dy) // 5/8 octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if{y1-=1;e-=dx;} x1-=1; e+=dy; } } else // 6/8 octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if{x1-=1;e-=dy;} y1-=1; e+=dx; } } } }

真人手机网页版 3

void AES::AddRoundKey(unsigned char state[][4], unsigned char k[][4])
{
int r,c;
for(c=0; c<4; c++)
{
for(r=0; r<4; r++)
{
state[r][c] ^= k[r][c];
}
}
}

struct zuobiao

#define TIME_18HZ 0xFFFF
//改变定时器频率函数
//注意:超过1000Hz,与Windows将发生冲突
void Change_Timer(unsigned short new_count)
{
 outp(CTRL_8253,CTRL_WORD);
 outp(COUNTER_0,LOW_BYTE(new_count));
 outp(COUNTER_0,HI_BYTE(new_count));
}
////////////////////////////////////////////////////////////////
//安装时钟
void install_timer(int Hz)
{
 short time_hz;
 time_hz=short(1193180/Hz);
 timer_counter=0;
 Change_Timer(time_hz);
 Old_Time_Isr=_dos_getvect(TIME_KEEPER_INT);
 _dos_setvect(TIME_KEEPER_INT,Timer);
}
////////////////////////////////////////////////////////////////
//卸载时钟
void uninstall_timer()
{
 Change_Timer(TIME_18HZ);
 _dos_setvect(TIME_KEEPER_INT,Old_Time_Isr);
}
////////////////////////////////////////////////////////////////
/*-------------------------------------------------------------------------------*/

}

=======分割线======================

void AES::InvSubBytes(unsigned char state[][4])
{
int r,c;
for(r=0; r<4; r++)
{
for(c=0; c<4; c++)
{
state[r][c] = InvSbox[state[r][c]];
}
}
}

{

18、不要去相信mouse程序会为你做到一切,去读0x33的状态,光标由自己显示,否则,哼哼......
例子:
/*-------------------------------------------------------------------------------*/
//XiaoGe Made under WATCOM C/C++ 10.6
/*-------------------------------------------------------------------------------*/
unsigned short cursor[] =
{
    0x0000,  /*0000000000000000*/ /* 16 words of cursor mask */
    0x4000,  /*0100000000000000*/
    0x6000,  /*0110000000000000*/
    0x7000,  /*0111000000000000*/
    0x7800,  /*0111100000000000*/
    0x7c00,  /*0111110000000000*/
    0x7e00,  /*0111111000000000*/
    0x7f00,  /*0111111100000000*/
    0x7c00,  /*0111110000000000*/
    0x4600,  /*0100011000000000*/
    0x0600,  /*0000011000000000*/
    0x0300,  /*0000001100000000*/
    0x0300,  /*0000001100000000*/
    0x0180,  /*0000000110000000*/
    0x0180,  /*0000000110000000*/
    0x00c0,  /*0000000011000000*/
};
struct Mouse
{
 char show;                              //mouse 光标显示/不显示
 char left;                              //mouse左键
 char right                              //mouse右键
 char middle;                            //mouse中键
 int x;                                  //mouseX坐标
 int y;                                  //mouseY坐标
 unsigned char color;            //mouse光标颜色
}mouse;
int mouse_page;
/*-------------------------------------------------------------------------------*/
void set_mouse_xy(int x_min,int x_max,int y_min,int y_max)
{
 REGS regs;
 if (x_min<0) x_min=0;
 if (x_max>SCR_H) x_max=SCR_H;
 if (y_min<0) y_min=0;
 if (y_max>SCR_V) y_max=SCR_V;
//Define H min-max
 regs.w.ax=0x07;
 regs.w.cx=x_min;
 regs.w.dx=x_max;
 int386(0x33,®s,®s);
//Define V min-max
 regs.w.ax=0x08;
 regs.w.cx=y_min;
 regs.w.dx=y_max;
 int386(0x33,®s,®s);
//POSITION MOUSE CURSOR
 regs.w.ax=0x04;
 regs.w.cx=(x_max-x_min)>>1;
 regs.w.dx=(y_max-y_min)>>1;
 int386(0x33,®s,®s);
}
/*-------------------------------------------------------------------------------*/
void init_mouse(void)
{
 REGS regs;
 mouse.x=SCR_H/2;
 mouse.y=SCR_V/2;
 mouse.left=0;
 mouse.right=0;
 mouse.middle=0;
 mouse.color=255;
 mouse.show=0;
//mouse reset
 regs.w.ax=0x00;
 int386(0x33,®s,®s);
//old mouse hidden
 regs.w.ax=0x01;
 int386(0x33,®s,®s);
 set_mouse_xy(0,SCR_H,0,SCR_V);
//Define Mic/Piexl
 regs.w.ax=0x0F;
 regs.w.cx=4;
 regs.w.dx=4;
 int386(0x33,®s,®s);
}
/*-------------------------------------------------------------------------------*/
void hard_disp_mouse(void)
{
    int i,j,x,y;
    long addr,addr1,page;
    unsigned short temp;
    unsigned char color;
    unsigned int b[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
    unsigned char *video=(unsigned char *)0xA0000;

/**************************************************************
在LCD屏幕上用颜色填充一个矩形
**************************************************************/
static void Glib_FilledRectangle(int x1,int y1,int x2,int y2, U16 color)
{
int i;

/*

void AES::InvShiftRows(unsigned char state[][4])
{
unsigned char t[4];
int r,c;
for(r=1; r<4; r++)
{
for(c=0; c<4; c++)
{
t[c] = state[r][(c-r+4)%4];
}
for(c=0; c<4; c++)
{
state[r][c] = t[c];
}
}
}

int x;

    color=mouse.color;
    y=mouse.y-1;
    addr=count_offest(SCR_H,mouse.x,mouse.y);
    mouse_page=addr>>16;
    set_page(mouse_page);
 for(i=0;i<16;i++)
 {
  x=mouse.x-1;
  temp=cursor[i];
  addr=count_offest(SCR_H,x,y);
  for(j=16;j>=0;j--)
  {
      if((b[j]&temp)&&(x>0)&&(x<SCR_H)&&(y>0)&&(y<SCR_V))
      {
    page=addr>>16;
    addr1=addr-(page<<16);
    if (mouse_page!=page)
    {
        mouse_page=page;
        set_page(mouse_page);
    }
    *(video+addr1)=color;
    *(buffer+addr)=color;
      }
   x++;
   addr++;
  }
  y++;
 }
}
/*-------------------------------------------------------------------------------*/
void read_mouse(void)
{

for(i=y1;i<=y2;i++)Glib_Line(x1,i,x2,i,color);

 ============================================================================

void AES::InvMixColumns(unsigned char state[][4])
{
unsigned char t[4];
int r,c;
for(c=0; c< 4; c++)
{
for(r=0; r<4; r++)
{
t[r] = state[r][c];
}
for(r=0; r<4; r++)
{
state[r][c] = FFmul(0x0e, t[r])
^ FFmul(0x0b, t[(r+1)%4])
^ FFmul(0x0d, t[(r+2)%4])
^ FFmul(0x09, t[(r+3)%4]);
}
}
}

int y;

 REGS in,out;
 mouse.color=255;
 in.w.ax=0x03;
 int386(0x33,&in,&out);
 mouse.left=(out.w.bx&0x01);
 mouse.right=(out.w.bx&0x02);
 mouse.middle=(out.w.bx&0x04);
 
 mouse.x=out.w.cx;
 if (0>mouse.x) mouse.x=0;
 if (SCR_H<mouse.x) mouse.x=SCR_H;
 mouse.y=out.w.dx;
 if (0>mouse.y) mouse.y=0;
 if (SCR_V<mouse.y) mouse.y=SCR_V;
 if (mouse.show)   hard_disp_mouse();
}
/*-------------------------------------------------------------------------------*/

}

 Name        : 2048.c

 

}weizhi;

19、键盘操作要拦截键盘中断,可不能用系统给的函数,游戏程序员戒条:凡是系统给的,必然
是不合用的。下面是例子。使用时,在你的循环中直接监测key_ascii就行了。
/*-------------------------------------------------------------------------------*/
#define SCAN_ALT    56
#define SCAN_CTRL     29
#define SCAN_caps 58
#define SCAN_LEFTSHIFT 42
#define SCAN_RIGHTSHIFT 54
#define SCAN_SHIFT (keyflag[SCAN_RIGHTSHIFT]||keyflag[SCAN_LEFTSHIFT])
#define KEY_END 255
#define KEY_LEFT 254
#define KEY_RIGHT 253
#define KEY_PAGEUP 252
#define KEY_UP 251
#define KEY_DOWN 250
#define KEY_HOME 249
#define KEY_CTRLBREAK 248
#define KEY_F1 247
#define KEY_F2 246
#define KEY_F3 245
#define KEY_F4 244
#define KEY_F5 243
#define KEY_F6 242
#define KEY_F7 241
#define KEY_F8 240
#define KEY_F9 239
#define KEY_F10 238
#define KEY_PAGEDOWN 237
#define KEY_INSERT 236
#define KEY_DELETE 235
#define KEY_LEFTALT 234
#define KEY_RIGHTALT 233
#define KEY_RIGHTCTRL 232
#define KEY_LEFTCTRL 231
#define KEY_caps 230
#define KEY_F11 229
#define KEY_F12 228
#define KEY_PRINTSCREEN 228
#define KEY_NUMLOCK 227
#define KEY_SCROLLLOCK 226
#define KEY_LEFTSHIFT 225
#define KEY_RIGHTSHIFT 224
#define KEY_WINDOWS 223
/*-------------------------------------------------------------------------------*/
static unsigned char  asciinames[]={
 0,27,'1','2','3','4','5','6','7','8','9','0','-','=',8,9,
 'q','w','e','r','t','y','u','i','o','p','[',']',13,KEY_LEFTCTRL,'a','s',
 'd','f','g','h','j','k','l',';',39,'`',0,92,'z','x','c','v',
 'b','n','m',',','.','/',0,'*',KEY_LEFTALT,' ',KEY_caps,KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,
 KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_NUMLOCK,KEY_SCROLLLOCK,'7','8','9','-','4','5','6','+','1',
 '2','3','0',127,0,0,'\',KEY_F11,KEY_F12,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
     };
/*-------------------------------------------------------------------------------*/
static unsigned char  shiftnames[]={
 0,27,'!','@','#','$','%','^','&','*','(',')','_','+',8,9,
 'Q','W','E','R','T','Y','U','I','O','P','{','}',13,1,'A','S',
 'D','F','G','H','J','K','L',':',34,'~',KEY_LEFTSHIFT,'|','Z','X','C','V',
 'B','N','M','<','>','?',KEY_RIGHTSHIFT,'*',1,' ',0,0,0,0,0,0,
 0,0,0,0,0,0,0,'7','8','9','-','4','5','6','+','1',
 '2','3','0',127,0,0,'|',0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0
     };
/*-------------------------------------------------------------------------------*/
static char specialnames[]={
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,13,KEY_RIGHTCTRL,0,0,
 0,0,0,0,0,0,0,0,0,0,KEY_WINDOWS,0,0,0,0,0,
 0,0,0,0,0,'/',0,KEY_PRINTSCREEN,KEY_RIGHTALT,0,0,0,0,0,0,0,
 0,0,0,0,0,0,KEY_CTRLBREAK,KEY_HOME,KEY_UP,KEY_PAGEUP,0,KEY_LEFT,0,KEY_RIGHT,0,KEY_END,
 KEY_DOWN,KEY_PAGEDOWN,KEY_INSERT,KEY_DELETE,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    };
/*-------------------------------------------------------------------------------*/
unsigned char pause_key;
unsigned char key_ascii;
unsigned char key_scan;
unsigned char keyflag[128];
static unsigned char caps;
static unsigned char cur_code,key_code;
static void (_interrupt far *_old_key_interrupt)(void);
/*-------------------------------------------------------------------------------*/
void setkeyspeed()
{
 REGS regs;
 regs.w.bx=0x0;
 regs.w.ax=0x0A05;
 int386 (0x16,®s,®s);
}
/*-------------------------------------------------------------------------------*/
void clearkey()
{
 int i;
 key_scan=0;
 key_ascii=0;
 memset(keyflag,0,sizeof(keyflag));
}
/*-------------------------------------------------------------------------------*/
static void interrupt key_interrupt(void)
{
static unsigned char specialflag;
unsigned char k,c,temp;
int i;
k=inp(0x60);
outp(0x61,(temp=inp(0x61))|0x80);
outp(0x61,temp);
if(k==0xe0)specialflag=1;
else if(k==0xe1)pause_key=1;
else
{
 if(k&0x80)
 {
  k&=0x7f;
  keyflag[k]=0;
 }
 else
 {
  key_code=cur_code;
  cur_code=key_scan=k;
  keyflag[k]=1;
  if(specialflag)c=specialnames[k];
  else
  {
   if(k==SCAN_caps)
   {
    caps=(~caps)&1;
   }
   if(SCAN_SHIFT)
   {
    c=shiftnames[k];
    if((c>='A')&&(c<='Z')&&caps)
    c+='a'-'A';
   }
   else
   {
    c=asciinames[k];
    if((c>='a')&&(c<='z')&&caps)
    c-='a'-'A';
   }
  }
  if(c)key_ascii=c;
 }
 specialflag=0;
}
outp(0x20,0x20);
}
/*-------------------------------------------------------------------------------*/
static void initkey(void)
{
 clearkey();
 setkeyspeed();
 _old_key_interrupt=_dos_getvect(9);
 _dos_setvect(9,key_interrupt);
}
/*-------------------------------------------------------------------------------*/
static void closekey(void)
{
 _dos_setvect(9,_old_key_interrupt);
}
/*-------------------------------------------------------------------------------*/
unsigned char getscan(void)
{
 unsigned char result;
 while((result=key_scan)!=0);
 key_scan=0;
 return(result);
}
/*-------------------------------------------------------------------------------*/
unsigned char getkey(void)
{
 unsigned char result;
 while((result=key_ascii)==0);
 key_ascii=0;
 return(result);
}
/*-------------------------------------------------------------------------------*/

/**************************************************************
在LCD屏幕上用颜色填充一个圆
**************************************************************/
static void Lcd_Circle
{
int m,n;
for(m=0;m<10000;m++)
{
for(n=0;n<1000;n++)
{
if*+*<=r*r)
{

 Author      : Maurits van der Schee

#if !defined(AFX_AES_H__6BDD3760_BDE8_4C42_85EE_6F7A434B81C4__INCLUDED_)
#define AFX_AES_H__6BDD3760_BDE8_4C42_85EE_6F7A434B81C4__INCLUDED_

/*注意以上为全局声明部分,应用到下面所有调用函数与主函数*/

20、任何情况下要注意调试,WATCOM C/C++程序员可以用以下几条函数调试:
调用:
 debug("test.dbg","i=%dn",i);
 debug_print();

PutPixel;

 Description : Console version of the game "2048" for GNU/Linux

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

void gotoxy(int x, int y) /*(屏幕)建立光标移动位置的坐标函数*/

int debug_count=0;
struct debug_type
{
 char *fname[255];
 char *fcoment[255];
 int value[255];
}debug_i;

 } }}

 ============================================================================

#include "stdafx.h"

{

//除错程序
void debug(char *file_name,char *coment,int debug_v)
{
 if (debug_count<255)
 {
  debug_i.fname[debug_count]=file_name;
  debug_i.fcoment[debug_count]=coment;
  debug_i.value[debug_count]=debug_v;
  debug_count++;
 }
}

}
/**************************************************************
在LCD屏幕上指定坐标点画一条指定长度的直线
**************************************************************/

 */

class AES
{
public:
AES(unsigned char* key);
virtual ~AES();
unsigned char* Cipher(unsigned char* input);
unsigned char* InvCipher(unsigned char* input);
void* Cipher(void* input, int length=0);
void* InvCipher(void* input, int length);

COORD c; // COORD表示一个结构体的字符在控制台屏幕上的坐标

//除错写盘程序
void debug_print(void)
{
 FILE *debug_file;
 int i;
 if (debug_count!=0)
 {
  for (i=0;i<=debug_count;i++)
  {
   debug_file=fopen(debug_i.fname[i],"a");
   fprintf(debug_file,"debug[%3d]  ",i);
   fprintf(debug_file,debug_i.fcoment[i],debug_i.value[i]);
   fclose(debug_file);
  }
 }
 init_debug();
}

static void Lcd_Line
{
int m;
for(m=50;m<=t;m++)
{
PutPixel;
}
}

 

private:
unsigned char Sbox[256];
unsigned char InvSbox[256];
unsigned char w[11][4][4];

c.X=x;

21、最后一条,写不下去了,就不要写了,游戏开发是一个漫长的过程,没有一天能写成的游戏,
至少我没见过,写得太累了,就玩去吧,千万不要把自己的热情消耗没了,那样的话,再简单的
游戏也写不出来。

/**************************************************************
在LCD屏幕上指定坐标点画一个指定大小的图片
**************************************************************/
static void Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)
{
int x,y;
U32 c;
int p = 0;

#define _XOPEN_SOURCE 500

void KeyExpansion(unsigned char* key, unsigned char w[][4][4]);
unsigned char FFmul(unsigned char a, unsigned char b);

c.Y=y;

肖舸
1999.11.1.

for( y = 0 ; y < l ; y++ ){ for( x = 0 ; x < h ; x++ ) { c = bmp[p+1] | (bmp[p]<<8) ; if  < SCR_XSIZE) &&  < SCR_YSIZE) ) LCD_BUFFER[y0+y][x0+x] = c ; p = p + 2 ; }}

#include <stdio.h>

void SubBytes(unsigned char state[][4]);
void ShiftRows(unsigned char state[][4]);
void MixColumns(unsigned char state[][4]);
void AddRoundKey(unsigned char state[][4], unsigned char k[][4]);

SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); // 定位光标位置的函数 将光标移动到指定位置 一个特定的标准设备取得句柄

===================================================
肖舸 《0bug-C/C++商用工程之道》
QQ:712123
MSN/Email:[email protected]
个人主页:

}

#include <stdlib.h>

void InvSubBytes(unsigned char state[][4]);
void InvShiftRows(unsigned char state[][4]);
void InvMixColumns(unsigned char state[][4]);
};

}

本文出自 “肖舸的blog” 博客,请务必保留此出处

/**************************************************************
**************************************************************/
void TFT_LCD_Init
{

#include <string.h>

#endif // !defined(AFX_AES_H__6BDD3760_BDE8_4C42_85EE_6F7A434B81C4__INCLUDED_)

void drawqipan()/*建立棋盘*/

...

LCD_Init();//LcdBkLtSet ;Lcd_PowerEnable;Glib_FilledRectangle(40,50,80,100,300);Lcd_EnvidOnOff; //turn on vedio

#include <unistd.h>

 

{

/* Lcd_ClearScr( (0x00<<11) | (0x00<<5) | ;

#include <termios.h>

 

int i,j;

#if defined || defined || defined
Paint_Bmp(0, 0, 240, 320, sunflower_240x320);
#elif defined
Paint_Bmp(0, 0, 800, 480, sunflower_800x480);
#elif defined
Paint_Bmp(0, 0, 640, 480, sunflower_640x480);
#elif defined(LCD_VGA1024768)
Paint_Bmp(0, 0, 1024, 768, sunflower_1024x768);
#endif */

#include <stdbool.h>

 

for(i=0;i

}

#include <stdint.h>

#include "stdafx.h"
#include "AES.h"

{

/**************************************************************
**************************************************************/
void TFT_LCD_Test()
{

#include <time.h>

void print(unsigned char* state);

for(j=0;j

Lcd_Port_Init();// TFT LCD数据和控制端口初始化LCD_Init();//TFT LCD功能模块初始化Lcd_PowerEnable;// 8Bpp TFT LCD 电源控制引脚使能//Glib_FilledRectangle(20,30,200,200,500);//矩形Lcd_Circle;//Lcd_Line;Lcd_EnvidOnOff; //turn on vedio LCD视频和控制信号输出或者停止,1开启视频输出

#include <signal.h>

int main(int argc, char* argv[])
{
unsigned int a;
unsigned int b;
unsigned char input[16];
unsigned char key[16];
char name;
printf("Cipher(c) or InvCipher(i)?n");
scanf("%c",&name);
if (name=='c')
{
printf("Please input M:n");
for (int i=0;i<16;i++)
{
scanf ("%x",&a);
input[i]=a;
}
printf("Please input K:n");
for (int ii=0;ii<16;ii++)
{
scanf("%x",&b);
key[ii]=b;
}
AES aes(key);
aes.Cipher(input);
printf("After Cipher(C):n");
print(input);
}
if (name =='i')
{
printf("Please input C:n");
for (int i=0;i<16;i++)
{
scanf ("%x",&a);
input[i]=a;
}
printf("Please input K:n");
for (int ii=0;ii<16;ii++)
{
scanf("%x",&b);
key[ii]=b;
}
AES aes(key);
aes.InvCipher(input);
printf("After InvCipher(M):n");
print(input);
}
return 0;

{

}
//*************************************************************

 

}

p[i][j]=0; // 只是单纯的赋初值 无直接关系

#define SIZE 4

void print(unsigned char* state)
{
int i;
for(i=0; i<16; i++)
{
printf("%s%X ",state[i]>15 ? "" : "0", state[i]);
}
printf("n");
}

q[i][j]=0; // 只是单纯的赋初值 无直接关系

uint32_t score=0;

 

printf("十");

 

#if !defined(AFX_AES_H__6BDD3760_BDE8_4C42_85EE_6F7A434B81C4__INCLUDED_)
#define AFX_AES_H__6BDD3760_BDE8_4C42_85EE_6F7A434B81C4__INCLUDED_

}

void getColor(uint16_t value, char *color, size_t length) {

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

printf("n");

uint8_t original[] = {8,255,1,255,2,255,3,255,4,255,5,255,6,255,7,255,9,0,10,0,11,0,12,0,13,0,14,0,255,0,255,0};

#include "stdafx.h"

}

//uint8_t blackwhite[] = {232,255,234,255,236,255,238,255,240,255,242,255,244,255,246,0,248,0,249,0,250,0,251,0,252,0,253,0,254,0,255,0};

class AES
{
public:
AES(unsigned char* key);
virtual ~AES();
unsigned char* Cipher(unsigned char* input);
unsigned char* InvCipher(unsigned char* input);
void* Cipher(void* input, int length=0);
void* InvCipher(void* input, int length);

}

//uint8_t bluered[] = {235,255,63,255,57,255,93,255,129,255,165,255,201,255,200,255,199,255,198,255,197,255,196,255,196,255,196,255,196,255,196,255};

private:
unsigned char Sbox[256];
unsigned char InvSbox[256];
unsigned char w[11][4][4];

void movegb(char press)/*(非屏幕)光标的移动*/

uint8_t *scheme = original;

void KeyExpansion(unsigned char* key, unsigned char w[][4][4]);
unsigned char FFmul(unsigned char a, unsigned char b);

{

uint8_t *background = scheme+0;

void SubBytes(unsigned char state[][4]);
void ShiftRows(unsigned char state[][4]);
void MixColumns(unsigned char state[][4]);
void AddRoundKey(unsigned char state[][4], unsigned char k[][4]);

switch(press)

uint8_t *foreground = scheme+1;

void InvSubBytes(unsigned char state[][4]);
void InvShiftRows(unsigned char state[][4]);
void InvMixColumns(unsigned char state[][4]);
};

{

if (value > 0) while (value >>= 1) {

#endif // !defined(AFX_AES_H__6BDD3760_BDE8_4C42_85EE_6F7A434B81C4__INCLUDED_)

case play1up:if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weizhi.y=19;break;

if (background+2<scheme+sizeof(original)) {

 

/*对手1光标向上移动*/

background+=2;

 

case play1down:if(weizhi.y<20)weizhi.y++;if(weizhi.y>19)weizhi.y=0;break;

foreground+=2;

 

/*对手1光标向下移动*/

}

密学中的高级加密(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
经过两个星期的奋战,终于在前人能解密16字节字符串的基础上解密任意长度字符串,并将其封装为类,以后的调用直接引用该类即可,在封装的过程中可真是磕磕碰碰出现诸多问题,不算大,但却真的不容易找到其中的解决的方法。
在封装的过程中主要出现一下几个问题:
1、内存溢出
2、解密到一定长度的字符串后,解密出现乱码
3、 在用对话框程序进行测试时,明文或者密文显示不到对话框上
4、解密后,密文全部被译出,但后面紧接着无端多出一定长度的乱码
5、对话框中不能进行换行
6、某些长度的字符串解密出现被截断,截断点后面的密文被译为乱码
7、相同长度的字符串,某些译出来正确,而某些译出来为乱码
8、无端提示触发中断点
现在分别来阐述以上问题出现的原因及解决方案:
问题1:
原因:new内存的大小不够,由于字符串结尾字符的影响导致边界溢出:如new: char *inBuff = new char [nLen];而使用的时候却用了nLen+1个字节。
解决方案:分配内存是多分配一个字节:char *inBuff = new char [nLen+1];
问题2:
原因:在进行解密时,将前面加密的字符串copy到缓存,而缓存的大小分配不足,如本有14000个字节的密文,但解密缓存只分配了512个字节来缓存密文。
解决方案:任何应用程序只有实现功能了,才能谈其性能,以及内存占用,所以应尽量保证缓存的大小,char inBuff[900000];
问题3:
原因:控件没有刷新。
解决方案:在对话框程序中,如果想要直接通过edit控件的Value变量赋值给对话框,则必须刷新控件:程序前面加上UpDataData();语句。
问题4:
原因:解密后的输出缓存分配过大。
解决方案:char *outPut=new char [nlen];
aes.InvCipherByte(m_key, inBuff,nlen,outPut);如果分配时为char *outPut=new char [nlen+1];则问题出现。
问题5:
原因:对话框控件属性没有进行相应设置。
解决方案:return——》true,多媒体——》true,滚动条——》true。
问题6:
原因: 字符串长度处理有误。
解决方案: nlen=strlen(inBuff);
char *outPut=new char [nlen];如果 char *outPut=new char [nlen/3];字符串被截断。
问题7:
原因:如明文为12345(5个字节)、hello(5个字节),数字解密没问题,但字母出现乱码,是因为内存分配不够。
解决方案:分配内存时,多分配一个字节
问题8:
原因:copy字符串时,copy长度多了。
解决方案:fwrite(ouBuff,1,inBuffLen,foutput);,如果fwrite(ouBuff,1,(inBuffLen+1),foutput);,问题出现。
其实真正在封装时,出现的问题远远不止于以上几个。
现在说明下该类的基本封装思想:
该类算法都是有大师们早已设计好,我们只需要按我们自己的需要稍微组织下逻辑,前面已经有人解密16字节的字符串,并且各种算法还算不错了,那我们就只需要在16字节的基础上继续我们的任意长度。
于是出现了一个字符分割函数:void Split(CString source, CStringArray& dest, CString division);//字符串分割函数
起作用是将我们的字符串分割为16个字节后,调用前面已有的算法,当前在本文中该函数主要是用在解密中,而加密函数是直接将分割算法写进加密函数。
一下是已封装好的类:
头文件:
/****************************************************************
**功能:AES加密及解密——字符串(任意长度)、文件(任意大小)
**作者:
**公司:
**创建日期:2013.11.6
*****************************************************************/

case play1left:if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)weizhi.x=19;break;

}

#include <windows.h>
#define Bits128 16
#define Bits192 24
#define Bits256 32

/*对手1光标向左移动*/

snprintf(color,length,"33[38;5;%d;48;5;%dm",*foreground,*background);

static unsigned char AesSbox[16*16]=
{// populate the Sbox matrix
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
/*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
/*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
/*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
/*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
/*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
/*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
/*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
/*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
/*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
/*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
/*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
/*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
/*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
/*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
/*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};

case play1right:if(weizhi.x<20)weizhi.x++;if(weizhi.x>19)weizhi.x=0;break;

}

static unsigned char AesiSbox[16*16]=
{
// populate the iSbox matrix
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
/*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
/*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
/*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
/*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
/*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
/*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
/*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
/*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
/*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
/*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
/*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
/*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
/*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
/*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
/*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
};
static unsigned char AesRcon[11*4]=
{
0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00,
0x20, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00,
0x1b, 0x00, 0x00, 0x00,
0x36, 0x00, 0x00, 0x00
};

/*对手1光标向右移动*/

 

class Aes // Advanced Encryption Standard
{
public:
~Aes();
Aes();
Aes(int keySize, unsigned char* keyBytes);
unsigned char State[4][4];
void Cipher(unsigned char* input, unsigned char* output); // encipher 16-bit input
void InvCipher(unsigned char* input, unsigned char* output); // decipher 16-bit input
private:
int Nb; // block size in 32-bit words. Always 4 for AES. (128 bits).
int Nk; // key size in 32-bit words. 4, 6, 8. (128, 192, 256 bits).
int Nr; // number of rounds. 10, 12, 14.

case play2up:if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weizhi.y=19;break;

void drawBoard(uint16_t board[SIZE][SIZE]) {

unsigned char key[32];
unsigned char w[16*15];

/*对手2光标向上移动*/

int8_t x,y;

void SetNbNkNr(int keySize);
void AddRoundKey(int round); //轮密钥加
void SubBytes(); //S盒字节代换
void InvSubBytes(); //逆S盒字节代换
void ShiftRows(); //行移位
void InvShiftRows();
void MixColumns(); //列混淆
void InvMixColumns();
unsigned char gfmultby01(unsigned char b);
unsigned char gfmultby02(unsigned char b);
unsigned char gfmultby03(unsigned char b);
unsigned char gfmultby09(unsigned char b);
unsigned char gfmultby0b(unsigned char b);
unsigned char gfmultby0d(unsigned char b);
unsigned char gfmultby0e(unsigned char b);
void KeyExpansion(); //密钥扩展
unsigned char* SubWord(unsigned char* word); //密钥S盒字代换
unsigned char* RotWord(unsigned char* word); //密钥移位
//Dump();
//DumpKey();
// DumpTwoByTwo(char* a);
public:
void CipherAny(unsigned char* input,unsigned char* output);
void InvCipherAny(unsigned char* input,unsigned char* output);//unsigned char* output

case play2down:if(weizhi.y<20)weizhi.y++;if(weizhi.y>19)weizhi.y=0;break;

char color[40], reset[] = "33[m";

void Split(CString source, CStringArray& dest, CString division);//字符串分割函数

/*对手2光标向下移动*/

printf("33[H");

void CipherByte(CString KeyValue, char *input,UINT nSend,char * outPut);//加密字符串
void InvCipherByte(CString KeyValue, char *input,UINT nSend,char * outPut);//解密字符串

case play2left:if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)weizhi.x=19;break;

 

int char2num(char ch);
void set_key(int KeySize,UCHAR *KeyBytes);

/*对手2光标向左移动*/

printf("美化版本2048 %17d ptsnn",score);

void CipherFile(CString KeyValue, char* inBuff, char* outBuff);//加密文件
void InvCipherFile(CString KeyValue, char* inBuff, char* outBuff);//解密文件
public:
int keysize;
};

case play2right:if(weizhi.x<20)weizhi.x++;if(weizhi.x>19)weizhi.x=0;break

 

cpp文件:
#include "StdAfx.h" //注意在此 #include "Aes.h"不可以放在前面,否则出错,
#include "Aes.h"
Aes::~Aes()
{

;/*对手2光标向右移动*/

for (y=0;y<SIZE;y++) {

}
Aes::Aes()
{

}

for (x=0;x<SIZE;x++) {

}
////////////////////////////////////////////////////////////////////////////////////////////////
//构造函数
Aes::Aes(int keysize,unsigned char* keyBytes)
{
SetNbNkNr(keysize); //设置密钥块数,轮数
memcpy(key,keyBytes,keysize); //字符串拷贝函数,把keyBytes的keysize个字符复制到key中
KeyExpansion(); //密钥扩展,必须提前做的初始化
}
//字符ASCII码值到字符字面值的转换 如 '0'转换成0, 'a'转换成10
int Aes::char2num(char ch)
{
if(ch>='0'&&ch<='9')return ch-'0';
else if(ch>='a'&&ch<='f')return ch-'a'+10;
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void Aes::SetNbNkNr(int keySize)
{
Nb=4;
if(keySize==Bits128)
{
Nk=4; //4*4字节,128位密钥,10轮加密
Nr=10;
}
else if(keySize==Bits192)
{
Nk=6; //6*4字节,192位密钥,12轮加密
Nr=12;
}
else if(keySize== Bits256)
{
Nk=8; //8*4字节,256位密钥,14轮加密
Nr=14;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
void Aes::KeyExpansion()
{

gotoxy(2*weizhi.x,weizhi.y); //(调用函数gotoxy)将屏幕的光标移动到指定位置

getColor(board[x][y],color,40);

memset(w,0,16*15);
for(int row=0;row<Nk;row++) //拷贝seed 密钥
{
w[4*row+0] = key[4*row];
w[4*row+1] = key[4*row+1];
w[4*row+2] = key[4*row+2];
w[4*row+3] = key[4*row+3];
}
byte* temp = new byte[4];
for(int row=Nk;row<4*(Nr+1);row++)
{
temp[0]=w[4*row-4]; //当前列的前一列
temp[1]=w[4*row-3];
temp[2]=w[4*row-2];
temp[3]=w[4*row-1];
if(row%Nk==0) //逢nk时,对当前列的前一列作特殊处理
{
temp=SubWord(RotWord(temp)); //先移位,再代换,最后和轮常量异或
temp[0] = (byte)( (int)temp[0] ^ (int) AesRcon[4*(row/Nk)+0] );
temp[1] = (byte)( (int)temp[1] ^ (int) AesRcon[4*(row/Nk)+1] );
temp[2] = (byte)( (int)temp[2] ^ (int) AesRcon[4*(row/Nk)+2] );
temp[3] = (byte)( (int)temp[3] ^ (int) AesRcon[4*(row/Nk)+3] );
}
else if ( Nk > 6 && (row % Nk == 4) ) //这个还没有搞清楚
{
temp = SubWord(temp);
}

}

printf("%s",color);

// w[row] = w[row-Nk] xor temp
w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] );
w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] );
w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] );
w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] );
} // for loop

void luozi(char press)

printf("       ");

}
////////////////////////////////////////////////////////////////////////////////////////////////
//密钥移位函数
unsigned char* Aes::RotWord(unsigned char* word)
{
byte* temp = new byte[4];
temp[0] = word[1];
temp[1] = word[2];
temp[2] = word[3];
temp[3] = word[0];
return temp;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//密钥字代换函数
unsigned char* Aes::SubWord(unsigned char* word)
{
byte* temp = new byte[4];
for(int j=0;j<4;j++)
{
temp[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等
}
return temp;

{

printf("%s",reset);

}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes加密函数(对文件加密可以调用该函数)
void Aes::Cipher(unsigned char* input, unsigned char* output)
{
memset(&State[0][0],0,16);
for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的
{
State[i%4][i/4]=input[i]; //换成先写行后写列也是可以的,只要在输出时也是这样就可以了
}
AddRoundKey(0); //轮密钥加

static t=0;/*代表坐标交叉点有无棋子的状态*/

}

for (int round = 1; round <= (Nr - 1); round++) // main round loop
{
SubBytes(); //字节代换
ShiftRows(); //行移位
MixColumns(); //列混淆
AddRoundKey(round); //轮密钥加
} // main round loop

if(press==play1lq)

printf("n");

SubBytes(); //字节代换
ShiftRows(); //行移位
AddRoundKey(Nr); //轮密钥加

if(t==0&&p[weizhi.x][weizhi.y]==0)

for (x=0;x<SIZE;x++) {

// output = state
for (int i = 0; i < (4 * Nb); i++)
{
output[i] = State[i % 4][ i / 4];
}

{

getColor(board[x][y],color,40);

}

printf("●");

printf("%s",color);

////////////////////////////////////////////////////////////////////////////////////////////////
//Aes解密函数(对文件解密可以调用该函数)
void Aes::InvCipher(unsigned char* input,unsigned char* output)
{
memset(&State[0][0],0,16);
for (int i = 0; i < (4 * Nb); i++)
{
State[i % 4][ i / 4] = input[i];
}

gotoxy(2*weizhi.x,weizhi.y);

if (board[x][y]!=0) {

AddRoundKey(Nr);

q[weizhi.x][weizhi.y]=press; // 判断此处坐标的棋子种类为player1的操作

char s[8];

for (int round = Nr-1; round >= 1; round--) // main round loop
{
InvShiftRows();
InvSubBytes();
AddRoundKey(round);
InvMixColumns();
} // end main round loop for InvCipher

p[weizhi.x][weizhi.y]=1; // 判断此处坐标有无落子(有落子为1无落子为0)

snprintf(s,8,"%u",board[x][y]);

InvShiftRows();
InvSubBytes();
AddRoundKey(0);

t=1; // 交换player1的操作

int8_t t = 7-strlen(s);

// output = state
for (int i = 0; i < (4 * Nb); i++)
{
output[i] = State[i % 4][ i / 4];
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
//轮密钥加
void Aes::AddRoundKey(int round)
{
int i,j; //i行 j列 //因为密钥w是一列一列排列的,即 k0 k4 k8 k12
for(j=0;j<4;j++) // k1 k5 k9 k13
{ // k2 k6 k10k14
for(i=0;i<4;i++) // k3 k7 k11k15
{ // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i
State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
//字节代换函数
void Aes::SubBytes() //Page 103
{
int i,j;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
{
State[i][j]=AesSbox[State[i][j]];
//因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]

}

printf("%*s%s%*s",t-t/2,"",s,t/2,"");

}
}
}
void Aes::InvSubBytes()
{
int i,j;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
{
State[i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]
}
}

if(press==play2lq)

} else {

}
////////////////////////////////////////////////////////////////////////////////////////////////
void Aes::ShiftRows()
{
unsigned char temp[4*4]; //Page105
int i,j;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
{
temp[4*i+j]=State[i][j];
}
}
for(i=1;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i==1)State[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位
else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位
else if(i==3)State[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位
}
}

if(t==1&&p[weizhi.x][weizhi.y]==0)

printf("   ·   ");

}
void Aes::InvShiftRows()
{
unsigned char temp[4*4];
int i,j;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
{
temp[4*i+j]=State[i][j];
}
}
for(i=1;i<4;i++)
{
for(j=0;j<4;j++)
{
//if(i==1)State[i][j]=temp[4*i+(j-1)%4]; 在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法
if(i==1)State[i][j]=temp[4*i+(j+3)%4]; //第一行右移1位 j-1+4=j+3
else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行右移2位 j-2+4=j+2
else if(i==3)State[i][j]=temp[4*i+(j+1)%4]; //第三行右移3位 j-3+4=j+2
}
}

{

}

}
////////////////////////////////////////////////////////////////////////////////////////////////
void Aes::MixColumns()
{
unsigned char temp[4*4];
int i,j;
for(j=0;j<4;j++) //2 3 1 1 列混淆矩阵 Page107
{ //1 2 3 1
for(i=0;i<4;i++) //1 1 2 3
{ //3 1 1 2
temp[4*i+j]=State[i][j];
}
}
for(j=0;j<4;j++)
{
State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^
(int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^
(int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
(int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) );
State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
(int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) );
}

printf("                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ");

printf("%s",reset);

}
void Aes::InvMixColumns()
{
unsigned char temp[4*4];
int i,j;
for (i = 0; i < 4; i++) // copy State into temp[]
{
for (j = 0; j < 4; j++) //0e 0b 0d 09 逆变换矩阵 Page108
{ //09 0e 0b 0d
temp[4*i+j] = State[i][j]; //0d 09 0e 0b
} //0b 0d 09 0e
}

gotoxy(2*weizhi.x,weizhi.y);

}

for (j = 0; j < 4; j++)
{
State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^
(int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) );
State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^
(int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) );
State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^
(int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) );
State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^
(int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) );
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char Aes::gfmultby01(unsigned char b)
{
return b;
}
unsigned char Aes::gfmultby02(unsigned char b)
{
if (b < 0x80)
return (unsigned char)(int)(b <<1);
else
return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) );
}

q[weizhi.x][weizhi.y]=press; // 判断此处坐标的棋子种类为player2的操作

printf("n");

unsigned char Aes::gfmultby03(unsigned char b)
{
return (unsigned char) ( (int)gfmultby02(b) ^ (int)b );
}

p[weizhi.x][weizhi.y]=1; // 判断此处坐标有无落子(有落子为1无落子为0)

本文由美高梅赌堵59599发布于首页,转载请注明出处:当年我们在DOS下真人手机网页版:,高级加密标准由美国国家标准与技术研究院

关键词: