切换到宽版
  • 4963阅读
  • 11回复

求助TEA加解密问题,用电脑和单片机加密同一个内容结果不一样? [复制链接]

上一主题 下一主题
离线fhl323225577
 

发帖
196
M币
1673
专家
1
粉丝
12
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-02-21
求助     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;  }
  
  
离线fhl323225577

发帖
196
M币
1673
专家
1
粉丝
12
只看该作者 1楼 发表于: 2013-02-22
请登录后查看
离线std_johnwoo

发帖
628
M币
10
专家
3
粉丝
15
只看该作者 2楼 发表于: 2013-02-23
回 1楼(fhl323225577) 的帖子
请登录后查看
离线cmheia

发帖
11646
M币
6479
专家
9
粉丝
117
只看该作者 3楼 发表于: 2013-02-23
回 2楼(std_johnwoo) 的帖子
请登录后查看
离线fhl323225577

发帖
196
M币
1673
专家
1
粉丝
12
只看该作者 4楼 发表于: 2013-02-23
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线fhl323225577

发帖
196
M币
1673
专家
1
粉丝
12
只看该作者 5楼 发表于: 2013-02-23
回 2楼(std_johnwoo) 的帖子
请登录后查看
离线liyf

发帖
1712
M币
1286
专家
5
粉丝
65
只看该作者 6楼 发表于: 2013-02-23
请登录后查看
离线风云剑

发帖
1398
M币
2713
专家
3
粉丝
20
只看该作者 7楼 发表于: 2013-02-23
请登录后查看
离线wb.chn

发帖
503
M币
3854
专家
2
粉丝
18
只看该作者 8楼 发表于: 2013-02-23
请登录后查看
[ 此帖被wb.chn在2013-02-23 23:30重新编辑 ]
离线fhl323225577

发帖
196
M币
1673
专家
1
粉丝
12
只看该作者 9楼 发表于: 2013-02-24
请登录后查看
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个