./c0de/c/xtea.txt

0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
// XTEA Implementation - by amk
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
 
static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
#define BAD -1
 
static const char base64val[] =
{
   BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,
   BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,
   BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD,BAD, 62,BAD,BAD,BAD, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61,BAD,BAD,BAD,BAD,BAD,BAD,
   BAD,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,BAD,BAD,BAD,BAD,BAD,
   BAD, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,BAD,BAD,BAD,BAD,BAD
};
 
#define DECODE64(c) (isascii(c) ? base64val[c] : BAD)
 
void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
{
   for (; inlen >= 3; inlen -= 3)
   {
      *out++ = base64digits[in[0] >> 2];
      *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
      *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
      *out++ = base64digits[in[2] & 0x3f];
      in += 3;
   }
 
   if (inlen > 0)
   {
      unsigned char fragment;
      *out++ = base64digits[in[0] >> 2];
      fragment = (in[0] << 4) & 0x30;
 
      if (inlen > 1)
         fragment |= in[1] >> 4;
 
      *out++ = base64digits[fragment];
      *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
      *out++ = '=';
   }
 
   *out = '\0';
}
 
int from64tobits(char *out, const char *in)
{
   int len = 0;
   register unsigned char digit1, digit2, digit3, digit4;
 
   if (in[0] == '+' && in[1] == ' ')
      in += 2;
   if (*in == '\r')
      return 0;
 
   do {
      digit1 = in[0];
      if (DECODE64(digit1) == BAD)
         return -1;
      digit2 = in[1];
      if (DECODE64(digit2) == BAD)
         return -1;
      digit3 = in[2];
      if (digit3 != '=' && DECODE64(digit3) == BAD)
         return -1;
      digit4 = in[3];
      if (digit4 != '=' && DECODE64(digit4) == BAD)
         return -1;
      in += 4;
      *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4);
      ++len;
      if (digit3 != '=')
      {
         *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2);
         ++len;
         if (digit4 != '=')
         {
            *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4);
            ++len;
         }
      }
   } while (*in && *in != '\r' && digit4 != '=');
 
   return len;
}
 
void XTEA_enc (unsigned int num_rounds, unsigned long* v, unsigned long* k)
{
    unsigned long v0 = v[0], v1 = v[1], i;
    unsigned long sum = 0, delta = 0x9E3779B9;
 
    for(i = 0; i < num_rounds; i++)
   {
        v0  += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]);
        sum += delta;
        v1  += ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[sum >> 11 & 3]);
    }
    v[0] = v0;
   v[1] = v1;
}
 
void XTEA_dec (unsigned int num_rounds, unsigned long* v, unsigned long* k)
{
    unsigned long v0 = v[0], v1 = v[1], i;
    unsigned long delta = 0x9E3779B9, sum = delta * num_rounds;
 
    for(i = 0; i < num_rounds; i++)
   {
        v1  -= ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[sum >> 11 & 3]);
        sum -= delta;
        v0  -= ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]);
    }
    v[0] = v0;
   v[1] = v1;
}
 
void encode (char *in, char *out, char *pwd)
{
   int len = strlen(in);
 
   while ((len%8) != 0)
   {
      strcat(in, "\xFF");
      len++;
   }
   pwd[15] = '\0';
   while ((strlen(pwd)%16) != 0)
      strcat(pwd, "\xFF");
 
   XTEA_enc(64, (unsigned long*)in, (unsigned long*)pwd);
   to64frombits((unsigned char *)out, (const unsigned char *)in, len);
}
 
void decode (char *in, char *out, const char *pwd)
{
   int len = from64tobits((char *)out, in);
 
   XTEA_dec(64, (unsigned long*)out, (unsigned long*)pwd);
   out[len] = 0;
   while (out[len] == 0xFF)
      out[len--] = 0;
}
 
int main (int argv, char *argc[])
{
   char txt[1024];
   char pwd[1024];
   char cry[1024];
   char dec[1024];
 
   while (1)
   {
      printf("Enter string : ");
      gets(txt);
      printf("Enter a pass : ");
      gets(pwd);
 
      encode(txt, cry, pwd);
      printf("Encoded          : %s\n", cry);
 
      decode(cry, dec, pwd);
      printf("Decoded          : %s\n", dec);
      getch();
   }
 
   return 0;
}

Back