求助 TEA加解密问题,用电脑和单片机加密同一个内容结果不一样?
单片机反回的是:
12345678
C0 9C 13 85 0A 74 C4 A2
12345678
电脑反回的是:
12345678
03 c9 89 06 69 53 d1 ad
12345678
单片机是用keil 4生成的代码是
#include "reg52.h"
void send_char(unsigned char txd);
void printuf(char *str, unsigned char cb) ;
void encrypt(unsigned long *v1, unsigned long *v2,unsigned long *k);/*tea加密函数定义*/
void decrypt(unsigned long *v1,unsigned long *v2, unsigned long *k);/*tea解密函数定义*/
unsigned long *key = (unsigned long *)"1234567890abcde\0";/*常量密钥*/
unsigned char tea[8];
unsigned char i;
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void main()
{
unsigned long *y1,*y2;
tea[0]=0x31;
tea[1]=0x32;
tea[2]=0x33;
tea[3]=0x34;
tea[4]=0x35;
tea[5]=0x36;
tea[6]=0x37;
tea[7]=0x38;
InitUART();
for (i=0; i < 8; i++)
send_char(tea);
send_char(13);
y1=(unsigned long *)&tea[0];
y2=(unsigned long *)&tea[4];
encrypt (y1,y2,key) ;
for (i=0; i < 8; i++)
printuf("%x ",tea);
send_char(13);
y1=(unsigned long *)&tea[0];
y2=(unsigned long *)&tea[4];
decrypt(y1,y2,key);
for (i=0; i < 8; i++)
send_char(tea);
send_char(13);
while(1) ;
}
void encrypt(unsigned long *v1, unsigned long *v2,unsigned long *k)
{
unsigned long y=*v1, z=*v2, sum=0, i;
unsigned long delta=0x9e3779b9;
unsigned long a=k[0], b=k[1], c=k[2], d=k[3];
for (i=0; i < 32; i++)
{
sum += delta;
y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); }
*v1=y;
*v2=z;
}
void decrypt(unsigned long *v1,unsigned long *v2, unsigned long *k)
{
unsigned long y=*v1, z=*v2, sum=0xC6EF3720, i;
unsigned long delta=0x9e3779b9;
unsigned long a=k[0], b=k[1], c=k[2], d=k[3];
for(i=0; i<32; i++) {
z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
sum -= delta; }
*v1=y;
*v2=z;
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
// *str内容中遇到%x的内,就会从cb中的值转成十六进显示 开始
code char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
void printuf(char *str, unsigned char cb) //*str内容中遇到%x的内,就会从cb中的值转成十六进显示
{
idata char *ct = str;
idata char cx1;
idata char cx2;
while (*ct != '\0')
{
if (*ct == '%')
{
if (*(ct + 1) == 'x')
{
ct += 2;
cx1 = cb / 16;
cx2 = cb % 16;
send_char (hex[cx1]);
send_char(hex[cx2]);
continue;
}
if (*(ct + 1) == 'c')
{
ct += 2;
send_char(cb);
continue;
}
}
if (*ct == '\n')
{
send_char(13);
}
send_char(*ct);
ct++;
}
}
// *str内容中遇到%x的内,就会从cb中的值转成十六进显示 结束
电脑上是用WIN-TC 1.91板。代码是
#include<stdio.h>
#include<string.h>
void encrypt(unsigned long *v1, unsigned long *v2,unsigned long *k);/*加密函数定义*/
void decrypt(unsigned long *v1,unsigned long *v2, unsigned long *k);/*解密函数定义*/
unsigned long *key = (unsigned long *)"1234567890abcde\0";/*常量密钥*/
void main()
{
unsigned char de[8];
unsigned char i;
unsigned long *y1,*y2;
de[0]=0x31;
de[1]=0x32;
de[2]=0x33;
de[3]=0x34;
de[4]=0x35;
de[5]=0x36;
de[6]=0x37;
de[7]=0x38;
for (i=0;i<8;i++)
printf("%c",(unsigned char)de);
printf("\n");
y1=(unsigned long *)&de[0];
y2=(unsigned long *)&de[4];
encrypt(y1,y2,key);/*加密*/ for (i=0;i<8;i++)
printf("%2x ",(unsigned char)de);
printf("\n");
y1=(unsigned long *)&de[0];
y2=(unsigned long *)&de[4];
decrypt(y1,y2,key);/*解密*/ for (i=0;i<8;i++)
printf("%c",(unsigned char)de);
printf("\n");
getch();
} void encrypt(unsigned long *v1, unsigned long *v2,unsigned long *k)
{ unsigned long y=*v1, z=*v2, sum=0, i;
unsigned long delta=0x9e3779b9;
unsigned long a=k[0], b=k[1], c=k[2], d=k[3];
for (i=0; i < 32; i++)
{sum += delta;
y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d); }
*v1=y;
*v2=z; }
void decrypt(unsigned long *v1,unsigned long *v2, unsigned long *k)
{ unsigned long y=*v1, z=*v2, sum=0xC6EF3720, i;
unsigned long delta=0x9e3779b9;
unsigned long a=k[0], b=k[1], c=k[2], d=k[3];
for(i=0; i<32; i++) {
z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
sum -= delta; }
*v1=y; *v2=z; }