Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ongelmia DESn kanssa

Jalmari91 [01.02.2010 13:59:24]

#

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?

Jalmari91 [02.02.2010 00:45:24]

#

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 :/

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta