⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc1crypt.c

📁 这个通用的Bootloader可以支持大部分具有自编程功能、带有Boot区和UART串口的AVR单片机(主要是Mega系列)。如果是多串口的单片机
💻 C
字号:
/*

                           e Y8b    Y8b YV4.08P888 88e
                          d8b Y8b    Y8b Y888P 888 888D
                         d888b Y8b    Y8b Y8P  888 88"
                        d888WuHan8b    Y8b Y   888 b,
                       d8888888b Y8b    Y8P    888 88b,
           8888 8888       ,e,                                  888
           8888 888820088e  " Y8b Y888P ,e e, 888,8, dP"Y ,"Y88b888
           8888 8888888 88b888 Y8b Y8P d88 88b888 " C88b "8" 888888
           8888 8888888 888888  Y8b "  888   ,888    Y88D,ee 888888
           'Y88 88P'888 888888   Y8P    "YeeP"888   d,dP "88 888888
   888 88b,                    d8  888                     888
   888 88P' e88 88e  e88 88e  d88  888 e88 88e  ,"Y88b e88 888 ,e e, 888,8,
   888 8K  d888 888bd888 8Shaoziyang88d888 888b"8" 888d888 888d88 88b888 "
   888 88b,Y888 888PY888 888P 888  888Y888 888P,ee 888Y888 888888   ,888
   888 88P' "88 88"  "88 88"  888  888 "88 88" "88 888 "88 888 "YeeP"888


  Project:       AVR 通用 BootLoader
  File:          pc1crypt.c
                 PC1 加密算法( Pukall Cipher 1 ) 源自 "http://membres.lycos.fr/pc1/"
                 128/256 位密钥
                 为 avr 8 位单片机进行了优化
  Version:       1.2

  Compiler:      WinAVR 20071221 + AVR Studio 4.14.589

  Author:        Shaoziyang
                 Shaoziyang@gmail.com
                 http://avrubd.googlepages.com
                 http://groups.google.com/group/avrub?hl=en
                 
  Date:          2008.6

  See readme.htm to get more information.

*/


#ifndef PC1_128
#define PC1_128   1
#endif

#ifndef PC1_256
#define PC1_256   2
#endif

#ifndef Algorithm
#define Algorithm PC1_128
#endif

unsigned int ax, bx, cx, dx, inter, cfc, cfd;
unsigned int si, x1a2;

#if (Algorithm == PC1_128)
unsigned int x1a0[9];
#elif  (Algorithm == PC1_256)
unsigned int x1a0[17];
#else
#error "Unknow encrypt algorithm!"
#endif

#define DecryptInit()                                                     \
        {                                                                 \
                           si = 0;                                        \
                           x1a2 = 0;                                      \
        }

void exchange(unsigned int *a, unsigned int *b)
{
  unsigned int tmp;

  tmp = *a;
  *a = *b;
  *b = tmp;
}

#if (Algorithm == PC1_128)
void PC1assemble128()
{
  unsigned char i;

  inter = 0;
  x1a0[0] = 0;
  for(i = 0; i < 8; i++)
  {
    x1a0[i + 1] = x1a0[i] ^ ((DecryptKey[i * 2] * 256) + DecryptKey[i * 2 + 1]);

    dx = x1a2 + i;
    ax = x1a0[i + 1];
    cx = 0x015A;
    bx = 0x4E35;

    exchange(&ax, &si);
    exchange(&ax, &dx);

    if (ax != 0)
    {
      ax = ax * bx;
    }

    exchange(&ax, &cx);

    if (ax != 0)
    {
      ax = ax * si;
      cx = ax + cx;
    }

    exchange(&ax, &si);

    ax = ax * bx;
    dx = cx + dx;
    ax = ax + 1;

    x1a2 = dx;
    x1a0[i + 1] = ax;

    inter = inter ^ (ax ^ dx);
  }
}

//解密一个字节
unsigned char PC1Dec128Byte(unsigned char c)
{
  unsigned char i;

  PC1assemble128();
  cfc = inter >> 8;
  cfd = inter & 255;
  c = c ^ (cfc ^ cfd);

  for(i = 0; i < 16; i++)
    DecryptKey[i] = DecryptKey[i] ^ c;

  return c;
}

#endif //PC1_128

#if (Algorithm == PC1_256)
void PC1assemble256()
{
  unsigned char i;

  inter = 0;
  x1a0[0] = 0;
  for(i = 0; i < 16; i++)
  {
    x1a0[i + 1] = x1a0[i] ^ ((DecryptKey[i * 2] * 256) + DecryptKey[i * 2 + 1]);

    dx = x1a2 + i;
    ax = x1a0[i + 1];
    cx = 0x015A;
    bx = 0x4E35;

    exchange(&ax, &si);
    exchange(&ax, &dx);

    if (ax != 0)
    {
      ax = ax * bx;
    }

    exchange(&ax, &cx);

    if (ax != 0)
    {
      ax = ax * si;
      cx = ax + cx;
    }

    exchange(&ax, &si);

    ax = ax * bx;
    dx = cx + dx;
    ax = ax + 1;

    x1a2 = dx;
    x1a0[i + 1] = ax;

    inter = inter ^ (ax ^ dx);
  }
}

//解密一个字节
unsigned char PC1Dec256Byte(unsigned char c)
{
  unsigned char i;

  PC1assemble256();
  cfc = inter >> 8;
  cfd = inter & 255;
  c = c ^ (cfc ^ cfd);

  for(i = 0; i < 32; i++)
    DecryptKey[i] = DecryptKey[i] ^ c;

  return c;
}

#endif //PC1_256

//解密数据块
void DecryptBlock(unsigned char *buf, unsigned int nSize)
{
  unsigned int n;

  for( n = nSize; n > 0; n--)
  {
#if (Algorithm == PC1_128)
    *buf = PC1Dec128Byte(*buf);
#else
    *buf = PC1Dec256Byte(*buf);
#endif
    buf++;
  }
}

//销毁密钥
void DestroyKey()
{
  unsigned char i;

#if (Algorithm == PC1_128)
  for(i = 0; i < 16; i++)
#else
  for(i = 0; i < 32; i++)
#endif
  {
    DecryptKey[i] = 0;
  }
}

//end of file

⌨️ 快捷键说明

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