Advertisement
Guest User

Untitled

a guest
Jan 27th, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <openssl/des.h>
  3. #include <string.h>
  4.  
  5. typedef unsigned char uchar;
  6. typedef unsigned long long int ullong;
  7.  
  8. int NUM;
  9.  
  10. const int ENCRYPTION_OP_CODE = 1;
  11. const int DECRYPTION_OP_CODE = 2;
  12.  
  13. const int BITS_COUNT = 7;
  14. const uchar KEY_PART_RANGE_BORDER = 128;
  15. const int KEY_SIZE = 8;
  16.  
  17. ullong convert_to_ullong(uchar *p) {
  18.     int i;
  19.     ullong res = 0;
  20.     uchar* res_ptr = (uchar*)&res;
  21.  
  22.     for (i = 0; i < KEY_SIZE; i++)
  23.         res_ptr[i] = p[KEY_SIZE - i - 1];
  24.  
  25.     return res;
  26. }
  27.  
  28. void fill_encryption_table(uchar *msg, uchar *cmsg) {
  29.     FILE *fencr, *fdecr;
  30.  
  31.     char fencr_name[8], fdecr_name[8];
  32.     snprintf(fencr_name, 8, "%d.encr", NUM);
  33.     snprintf(fdecr_name, 8, "%d.decr", NUM);
  34.  
  35.     fencr = fopen(fencr_name, "w");
  36.     fdecr = fopen(fdecr_name, "w");
  37.  
  38.     uchar c0, c1, c2, c3;
  39.     uchar key[KEY_SIZE];
  40.     uchar encrypted_msg[KEY_SIZE];
  41.  
  42.     DES_key_schedule key_schedule;
  43.  
  44.     ullong key_as_num, encrypted_msg_as_num;
  45.  
  46.     for (c0 = (NUM-1)*4; c0 < NUM*4; c0++)
  47.         for (c1 = 0; c1 < KEY_PART_RANGE_BORDER; c1++)
  48.             for (c2 = 0; c2 < KEY_PART_RANGE_BORDER; c2++)
  49.                 for (c3 = 0; c3 < KEY_PART_RANGE_BORDER; c3++) {
  50.                     /* form key */
  51.                     key[0] = key[1] = key[2] = key[3] = 0x01;
  52.                     key[4] = c0 << 1;
  53.                     key[5] = c1 << 1;
  54.                     key[6] = c2 << 1;
  55.                     key[7] = c3 << 1;
  56.  
  57.                     /* set parity bits */
  58.                     DES_set_odd_parity(&key);
  59.  
  60.                     /* expand key to schedule */
  61.                     DES_set_key_checked(&key, &key_schedule);
  62.                     DES_key_sched(&key, &key_schedule);
  63.  
  64.                     /* convert key to num for printing */
  65.                     key_as_num = convert_to_ullong(key);
  66.  
  67.                     /* ============================== */
  68.                     DES_ecb_encrypt((const_DES_cblock*)msg, (DES_cblock*)encrypted_msg, &key_schedule, DES_ENCRYPT);
  69.                     encrypted_msg_as_num = convert_to_ullong(encrypted_msg);
  70.                     fprintf(fencr, "%llu\t%016LX\t%d\n", encrypted_msg_as_num, key_as_num, ENCRYPTION_OP_CODE);
  71.  
  72.                     /* ============================== */
  73.                     DES_ecb_encrypt((const_DES_cblock*)cmsg, (DES_cblock*)encrypted_msg, &key_schedule, DES_DECRYPT);
  74.                     encrypted_msg_as_num = convert_to_ullong(encrypted_msg);
  75.                     fprintf(fdecr, "%llu\t%016LX\t%d\n", encrypted_msg_as_num, key_as_num, DECRYPTION_OP_CODE);
  76.                     /* ============================== */
  77.  
  78.                 }
  79.  
  80.     fclose(fencr);
  81.     fclose(fdecr);
  82.  
  83. }
  84.  
  85. int main(int argc, char *argv[]) {
  86.     /* here is the number indicating which block of keys
  87.      * we will inspect */
  88.     sscanf(argv[1], "%d", &NUM);
  89.  
  90.     int i;
  91.  
  92.     // NOTE: padding with 0x01 (number of bytes to pad)
  93.     ullong msg_as_num = 0x6665617475526500;
  94.     uchar msg[8];
  95.  
  96.     /* reverse byte order */
  97.     uchar *p1 = (uchar*)&msg_as_num;
  98.     for (i = 0; i < KEY_SIZE; i++) {
  99.         msg[i] = p1[KEY_SIZE - i - 1];
  100.     }
  101.  
  102.     ullong cmsg_as_num = 0x77220D247542CA57;
  103.     uchar cmsg[8];
  104.  
  105.     /* reverse byte order */
  106.     uchar *p2 = (uchar*)&cmsg_as_num;
  107.     for (i = 0; i < KEY_SIZE; i++) {
  108.         cmsg[i] = p2[KEY_SIZE - i - 1];
  109.     }
  110.  
  111.     /* build tables for attack */
  112.     fill_encryption_table(msg, cmsg);
  113.  
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement