Advertisement
and_cesbo

triple_des_set_key

Apr 10th, 2024 (edited)
601
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.52 KB | Cybersecurity | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include <openssl/des.h>
  5.  
  6. // Build: gcc $(pkg-config --libs --cflags libcrypto) -o x x.c
  7.  
  8. static void triple_des_set_key(const uint8_t *des_key, const uint8_t *key, size_t key_size) {
  9.     uint8_t tmp_key[14];
  10.     memcpy(tmp_key, des_key, sizeof(tmp_key));
  11.  
  12.     // set key
  13.     for(size_t i = 0; i < key_size; ++i)
  14.         tmp_key[i % sizeof(tmp_key)] ^= key[i];
  15.  
  16.     uint8_t triple_des_key[16];
  17.     DES_key_schedule ks1;
  18.     DES_key_schedule ks2;
  19.  
  20.     triple_des_key[0] = tmp_key[0] & 0xfe;
  21.     triple_des_key[1] = ((tmp_key[0] << 7) | (tmp_key[1] >> 1)) & 0xfe;
  22.     triple_des_key[2] = ((tmp_key[1] << 6) | (tmp_key[2] >> 2)) & 0xfe;
  23.     triple_des_key[3] = ((tmp_key[2] << 5) | (tmp_key[3] >> 3)) & 0xfe;
  24.     triple_des_key[4] = ((tmp_key[3] << 4) | (tmp_key[4] >> 4)) & 0xfe;
  25.     triple_des_key[5] = ((tmp_key[4] << 3) | (tmp_key[5] >> 5)) & 0xfe;
  26.     triple_des_key[6] = ((tmp_key[5] << 2) | (tmp_key[6] >> 6)) & 0xfe;
  27.     triple_des_key[7] = tmp_key[6] << 1;
  28.     triple_des_key[8] = tmp_key[7] & 0xfe;
  29.     triple_des_key[9] = ((tmp_key[7] << 7) | (tmp_key[8] >> 1)) & 0xfe;
  30.     triple_des_key[10] = ((tmp_key[8] << 6) | (tmp_key[9] >> 2)) & 0xfe;
  31.     triple_des_key[11] = ((tmp_key[9] << 5) | (tmp_key[10] >> 3)) & 0xfe;
  32.     triple_des_key[12] = ((tmp_key[10] << 4) | (tmp_key[11] >> 4)) & 0xfe;
  33.     triple_des_key[13] = ((tmp_key[11] << 3) | (tmp_key[12] >> 5)) & 0xfe;
  34.     triple_des_key[14] = ((tmp_key[12] << 2) | (tmp_key[13] >> 6)) & 0xfe;
  35.     triple_des_key[15] = tmp_key[13] << 1;
  36.  
  37.     DES_set_odd_parity((DES_cblock *)&triple_des_key[0]);
  38.     DES_set_odd_parity((DES_cblock *)&triple_des_key[8]);
  39.  
  40.     DES_key_sched((DES_cblock *)&triple_des_key[0], &ks1);
  41.     DES_key_sched((DES_cblock *)&triple_des_key[8], &ks2);
  42.  
  43.     const uint8_t *ks1_ptr = (const uint8_t *)&ks1;
  44.     printf("ks1: 0x");
  45.     for(int i = 0; i < sizeof(ks1); i++)
  46.         printf("%02x", ks1_ptr[i]);
  47.     printf("\n");
  48.  
  49.     const uint8_t *ks2_ptr = (const uint8_t *)&ks2;
  50.     printf("ks2: 0x");
  51.     for(int i = 0; i < sizeof(ks2); i++)
  52.         printf("%02x", ks2_ptr[i]);
  53.     printf("\n");
  54. } /* triple_des_set_key */
  55.  
  56. int main() {
  57.     const uint8_t des_key[] = {
  58.         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  59.         0x09, 0x10, 0x11, 0x12, 0x13, 0x14
  60.     };
  61.  
  62.     const uint8_t key[] = {
  63.         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  64.         0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D,
  65.     };
  66.  
  67.     triple_des_set_key(des_key, key, sizeof(key));
  68.  
  69.     return 0;
  70. }
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement