All pastes #874648 Raw Edit

Mine

public text v1 · immutable
#874648 ·published 2008-01-27 12:18 UTC
rendered paste body
#include <stdio.h>
#include <math.h>
#include <string.h>

#define ROT(k) ((((k) >> 7) & 33554431) | (((k) & 127) << 25))

int str_to_hex(char *s, int len)
{
   int i, ret = 0;
         
   for (i = 0; i < len; i++) {
      ret = ret * 16 + ((s[i] >= '0' && s[i] <= '9') ? (s[i] - '0') : (s[i] - 'A' + 10));
   }
   
   return ret;
}
         
int dcd_key(char *s)
{
   int aux;
         
   if (*s == 0) return 0;
   
   aux = str_to_hex(s, 2);
   aux = ((aux & 28) >> 2) * 2 + 2;
   
   return str_to_hex(&s[aux], 8) ^ 2875741179;
}

void dcd_text(char *buf, char *s, int k)
{
   int i, len = strlen(s);
   unsigned long aux;
         
   if (k == 0) {
      strcpy(buf, s);
      return;
   }
         
   for (i = 0; i < len / 2; i++) {
      aux = (str_to_hex(&s[i * 2], 2) ^ k) & 255;
      
      if (aux <= 31) {
         *(buf++) = '~';
      } else if (aux >= 128) {
         int uc = aux & 0x3F;
         k = ROT(k); 
		 i++;
         aux = (str_to_hex(&s[i * 2], 2) ^ k) & 255;
         uc = (uc << 6) + (aux & 0x3F);

         switch (uc) {
         case 0xe2:    *(buf++) = 'a'; break; // ^a
         case 0xc2:    *(buf++) = 'A'; break; // ^A
         case 0xee:    *(buf++) = 'i'; break;
         case 0xce:    *(buf++) = 'I'; break;
         case 0x0103: *(buf++) = 'a'; break;
         case 0x0102: *(buf++) = 'A'; break;
         case 0x0163: *(buf++) = 't'; break;
         case 0x0162: *(buf++) = 'T'; break;
         case 0x015F: *(buf++) = 's'; break;
         case 0x015E: *(buf++) = 'S'; break;
         case 0x0218: *(buf++) = 's'; break;
         case 0x0219: *(buf++) = 'S'; break;
         case 0x021B: *(buf++) = 't'; break;
         case 0x021A: *(buf++) = 'T'; break;
         default:    *(buf++) = '~'; break;
         }
      } else if (aux == 127) {
         *(buf++) = '~';
      } else {
         *(buf++) = (char)aux;
      }
   
      k = ROT(k);
   }
   
   *buf = 0;
}
         
int main() {
   char *k = "592DC16F1B2D717B0B10B6491C0C8A4F"; // cheia aleatoare generata de server
   char *q = // mesaj hashuit
      "0FE9F5B9FD2A1393A4BB79736BCAF3C516D2527B4EC8F78633A7341455487C81"
      "23F2FFE6FD1BB541A2F2777F6ADFF3D40DD55E3A596917CF63A2244E560760D7";
   char *op1 = "7CA6E0EAB31CA4"; // prima optiune
   char *op2 = "78A6E0EAB31CA454"; // a doua optiune
   char *op3= "7EA6E0EAB31CA454"; // a treia optiune
   char *op4 = "7EB6ADE7B849A354B3EE637E63"; // a patra optiune
         
   unsigned long key;
   char buf[1024];

   key = dcd_key(k);
   dcd_text(buf, q, key);
   printf("Intrebare %s\n", buf); // Box: Cat timp dureaza pauza dintre reprizele unui meci de box?
   dcd_text(buf, op1, key);
   printf("Prima optiune %s\n", buf); // 1 minut
   dcd_text(buf, op2, key);
   printf("A doua optiune %s\n", buf); // 5 minute
   dcd_text(buf, op3, key);
   printf("A treia optiune %s\n", buf); // 3 minute
   dcd_text(buf, op4, key);
   printf("A patra optiune %s\n", buf); // 30 de secunde
         
   return 0;
}