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

📄 blowfish.c

📁 攻防自卫 ddos stachel-yps.tar.gz
💻 C
字号:
#include "blowfish.h"#include "bf_tab.h"#include <string.h>#define BOXES  3/* #define S(x,i) (bf_S[i][x.w.byte##i])  */#define S0(x) (bf_S[0][x.w.byte0])#define S1(x) (bf_S[1][x.w.byte1])#define S2(x) (bf_S[2][x.w.byte2])#define S3(x) (bf_S[3][x.w.byte3])#define bf_F(x) (((S0(x) + S1(x)) ^ S2(x)) + S3(x))#define ROUND(a,b,n) (a.word ^= bf_F(b) ^ bf_P[n])struct box_t {   UWORD_32bits *P;   UWORD_32bits **S;   char key[81];   char keybytes;} box[BOXES];UWORD_32bits *bf_P;UWORD_32bits **bf_S;void blowfish_encipher (UWORD_32bits * xl, UWORD_32bits * xr){   union aword Xl;   union aword Xr;   Xl.word = *xl;   Xr.word = *xr;   Xl.word ^= bf_P[0];   ROUND(Xr, Xl, 1);   ROUND(Xl, Xr, 2);   ROUND(Xr, Xl, 3);   ROUND(Xl, Xr, 4);   ROUND(Xr, Xl, 5);   ROUND(Xl, Xr, 6);   ROUND(Xr, Xl, 7);   ROUND(Xl, Xr, 8);   ROUND(Xr, Xl, 9);   ROUND(Xl, Xr, 10);   ROUND(Xr, Xl, 11);   ROUND(Xl, Xr, 12);   ROUND(Xr, Xl, 13);   ROUND(Xl, Xr, 14);   ROUND(Xr, Xl, 15);   ROUND(Xl, Xr, 16);   Xr.word ^= bf_P[17];   *xr = Xl.word;   *xl = Xr.word;}void blowfish_decipher (UWORD_32bits *xl, UWORD_32bits *xr){   union aword Xl;   union aword Xr;   Xl.word = *xl;   Xr.word = *xr;   Xl.word ^= bf_P[17];   ROUND(Xr, Xl, 16);   ROUND(Xl, Xr, 15);   ROUND(Xr, Xl, 14);   ROUND(Xl, Xr, 13);   ROUND(Xr, Xl, 12);   ROUND(Xl, Xr, 11);   ROUND(Xr, Xl, 10);   ROUND(Xl, Xr, 9);   ROUND(Xr, Xl, 8);   ROUND(Xl, Xr, 7);   ROUND(Xr, Xl, 6);   ROUND(Xl, Xr, 5);   ROUND(Xr, Xl, 4);   ROUND(Xl, Xr, 3);   ROUND(Xr, Xl, 2);   ROUND(Xl, Xr, 1);   Xr.word ^= bf_P[0];   *xl = Xr.word;   *xr = Xl.word;}void blowfish_init (UBYTE_08bits * key, short keybytes, int bxtouse){   int i, j, bx; //  time_t lowest;   UWORD_32bits data;   UWORD_32bits datal;   UWORD_32bits datar;   union aword temp;   for (i = 0; i < BOXES; i++)      if (box[i].P != NULL) {	 if ((box[i].keybytes == keybytes) &&	 (strncmp((char *) (box[i].key), (char *) key, keybytes) == 0)) {	    bf_P = box[i].P;	    bf_S = box[i].S;	    return;	 }      }   bx = (-1);   for (i = 0; i < BOXES; i++) {      if (box[i].P == NULL) {	 bx = i;	 i = BOXES + 1;      }   }   if (bx < 0) {bx = bxtouse;      free(box[bx].P);      for (i = 0; i < 4; i++)	 free(box[bx].S[i]);      free(box[bx].S);   }   box[bx].P = (UWORD_32bits *) malloc((bf_N + 2) * sizeof(UWORD_32bits));   box[bx].S = (UWORD_32bits **) malloc(4 * sizeof(UWORD_32bits *));   for (i = 0; i < 4; i++)      box[bx].S[i] = (UWORD_32bits *) malloc(256 * sizeof(UWORD_32bits));   bf_P = box[bx].P;   bf_S = box[bx].S;   box[bx].keybytes = keybytes;   strncpy(box[bx].key, key, keybytes);   for (i = 0; i < bf_N + 2; i++)      bf_P[i] = initbf_P[i];   for (i = 0; i < 4; i++)      for (j = 0; j < 256; j++)	 bf_S[i][j] = initbf_S[i][j];   j = 0;   for (i = 0; i < bf_N + 2; ++i) {      temp.word = 0;      temp.w.byte0 = key[j];      temp.w.byte1 = key[(j + 1) % keybytes];      temp.w.byte2 = key[(j + 2) % keybytes];      temp.w.byte3 = key[(j + 3) % keybytes];      data = temp.word;      bf_P[i] = bf_P[i] ^ data;      j = (j + 4) % keybytes;   }   datal = 0x00000000;   datar = 0x00000000;   for (i = 0; i < bf_N + 2; i += 2) {      blowfish_encipher(&datal, &datar);      bf_P[i] = datal;      bf_P[i + 1] = datar;   }   for (i = 0; i < 4; ++i) {      for (j = 0; j < 256; j += 2) {	 blowfish_encipher(&datal, &datar);	 bf_S[i][j] = datal;	 bf_S[i][j + 1] = datar;      }   }}#define SALT1  0xdeadd061#define SALT2  0x23f6b095char *base64 = "./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";int base64dec (char c){   int i;   for (i = 0; i < 64; i++)      if (base64[i] == c)	 return i;   return 0;}char *encrypt_string2 (char *key, char *str,int sizi){   UWORD_32bits left, right;   char *p, *s, *dest, *d;   int i;   int countilein;   dest = malloc((sizi + 9) * 2);   s = (char *) malloc(sizi + 9);   printf("huhu\n");     memcpy(s, str,sizi);   countilein=0;   p = s;/*   while (countilein < sizi)      p++;*/   p=p+sizi;/*   for (i = 0; i < 8; i++)      *p++ = 0; */   blowfish_init(key, strlen(key), 0);   p = s;   d = dest;   d = dest;   while (countilein < sizi) {      countilein++;      left = ((*p++) << 24);      left += ((*p++) << 16);      left += ((*p++) << 8);      left += (*p++);      right = ((*p++) << 24);      right += ((*p++) << 16);      right += ((*p++) << 8);      right += (*p++);      blowfish_encipher(&left, &right);      for (i = 0; i < 6; i++) {         *d++ = base64[right & 0x3f];         right = (right >> 6);      }      for (i = 0; i < 6; i++) {         *d++ = base64[left & 0x3f];         left = (left >> 6);      }   }   *d = 0;   free(s);   return dest;}char *encrypt_string (char *key, char *str){   UWORD_32bits left, right;   char *p, *s, *dest, *d;   int i;   dest = (char *) malloc((strlen(str) + 9) * 2);   s = (char *) malloc(strlen(str) + 9);   strcpy(s, str);   p = s;   while (*p)      p++;   for (i = 0; i < 8; i++)      *p++ = 0;   blowfish_init(key, strlen(key), 0);   p = s;   d = dest;   while (*p) {      left = ((*p++) << 24);      left += ((*p++) << 16);      left += ((*p++) << 8);      left += (*p++);      right = ((*p++) << 24);      right += ((*p++) << 16);      right += ((*p++) << 8);      right += (*p++);      blowfish_encipher(&left, &right);      for (i = 0; i < 6; i++) {         *d++ = base64[right & 0x3f];         right = (right >> 6);      }      for (i = 0; i < 6; i++) {         *d++ = base64[left & 0x3f];         left = (left >> 6);      }   }   *d = 0;   free(s);   return dest;}char *decrypt_string (char *key, char *str){   UWORD_32bits left, right;   char *p, *s, *dest, *d;   int i;   dest = (char *) malloc(strlen(str) + 12);   s = (char *) malloc(strlen(str) + 12);   strcpy(s, str);   p = s;   while (*p)      p++;   for (i = 0; i < 12; i++)      *p++ = 0;   blowfish_init(key, strlen(key), 0);   p = s;   d = dest;   while (*p) {      right = 0L;      left = 0L;      for (i = 0; i < 6; i++)         right |= (base64dec(*p++)) << (i * 6);      for (i = 0; i < 6; i++)         left |= (base64dec(*p++)) << (i * 6);      blowfish_decipher(&left, &right);      for (i = 0; i < 4; i++)         *d++ = (left & (0xff << ((3 - i) * 8))) >> ((3 - i) * 8);      for (i = 0; i < 4; i++)         *d++ = (right & (0xff << ((3 - i) * 8))) >> ((3 - i) * 8);   }   *d = 0;   free(s);   return dest;}

⌨️ 快捷键说明

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