Olen jo jonkin aikaa paininut sellaisen ongelman kanssa, että en saa luotua oikeita avaimia DESiin. Olen tehnyt tällaisen koodin
//des.cc
#include "des.h" DES::DES(uint64_t block,uint64_t key) { uint32_t kl,kr; keyPermutation(key); for(int i = 0;i < 16;i++) { kl = (key >> 28); kr = (key & 0xFFFFFFF); kl = ((kl << ks[i]) | (kl >> (28-ks[i]))) & 0xFFFFFFF; kr = ((kr << ks[i]) | (kr >> (28-ks[i]))) & 0xFFFFFFF; K[i] = ((uint64_t) kl << 28) | (kr & 0xFFFFFFF); key = K[i]; compressionPermutation(K[i]); } for(int i = 0;i < 16;i++) std::cout << "Avain numero " << i+1 << " on " << K[i] << std::endl; } void DES::keyPermutation(uint64_t& key) { uint64_t buf = key; key = 0; for(int i = 0;i < 56;i++) key |= ((buf >> kp[i]-1) & 0x01) << i; } void DES::compressionPermutation(uint64_t& key) { uint64_t buf = key; key = 0; for(int i = 0;i < 48;i++) key |= ((buf >> cp[i]-1) & 0x01) << i; }
//des.h
#ifndef _DES_H #define _DES_H #include <iostream> typedef unsigned long long uint64_t; typedef unsigned int uint32_t; static int kp[56] = { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 }; static int cp[48] = { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 }; static int ks[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; class DES { private: uint64_t block; uint64_t K[16]; public: DES(uint64_t,uint64_t); ~DES() { } void keyPermutation(uint64_t&); void compressionPermutation(uint64_t&); }; #endif
//main.cc
#include <iostream> #include "des.h" int main() { //salattava teksti on 1234 5678 90AB CDEF //avain on 3B38 9837 1520 F75E uint64_t block = 0x1234567890ABCDEFLL; uint64_t key = 0x3b3898371520f75eLL; DES des(block,key); return 0; }
Tämä tuottaa ensimmäiseksi avaimeksi 130258235231914, vaikka oikea avain tämän mukaan on 101190710169423. Osaako joku sanoa, missä teen väärin?
Ongelma ratkaistu! Vika oli siinä, että ajattelin että ensimmäinen bitti on vähiten merkitsevä ja viimeinen eniten merkitsevä, mutta se onkin toisin päin :/
Aihe on jo aika vanha, joten et voi enää vastata siihen.