Beispiel #1
0
vector<unsigned char> DESCoder::encode(vector<unsigned char> data)
{
	if (data.size() != 8)
	{
		throw WRONG_DATA_SIZE;
	}

	// представляем входные данные в виде массива бит
	_dataBits = _bytesArrayToBits(data); 

	// проводим первоначальную перестановку
	_IP();

	// разделяем входные биты на левую и правую половины
	_left.clear();
	_left.insert(_left.end(), _dataBits.begin(), _dataBits.begin() + 32);
	_right.clear();
	_right.insert(_right.end(), _dataBits.begin() + 32, _dataBits.end() );

	// далее выполняются 16 основных шагов алгоритма,
	// в которых преобразуются правая и левая части
	for (int i = 0; i < 16; i++)
	{
		_makeDesStep(_keys[i]);
	}

	vecUnsChar tmp = _right;
	_right = _left;
	_left = tmp;

	// после этого собираем вместе правую и левую половины
	_dataBits.clear();
	_dataBits.insert(_dataBits.end(), _left.begin(), _left.end());
	_dataBits.insert(_dataBits.end(), _right.begin(), _right.end());

	// и проводим окончательную перестановку, обратную первой
	_inverseIP();

	// теперь массив бит превращаем обратно в массив байт
	vecUnsChar result;
	for (int i = 0; i < _dataBits.size() / 8; i++)
	{
		vecUnsChar iBits;
		iBits.insert(iBits.end(), _dataBits.begin() + i * 8, _dataBits.begin() + i * 8 + 8); 
		unsigned char iByte = 0;

		// представление массива бит в виде байта
		unsigned char pow2 = 1; // степень 2, на которую необходимо умножать очередной бит
		for (int i = 0; i < iBits.size(); i++)
		{
			iByte += iBits[i] * pow2;
			pow2 *= 2;
		}
		result.push_back(iByte);
	}

	// на этом всё, возвращаем результат
	return result;
}
Beispiel #2
0
// представление массива бит в ввиде массива байт
vecUnsChar DESCoder::_bitesArrayToBytes(vecUnsChar bites)
{
	vecUnsChar res;
	for (int i = 0; i < bites.size() / 8; i++)
	{
		vecUnsChar iBits;
		iBits.insert(iBits.end(), bites.begin() + i * 8, bites.begin() + i * 8 + 8); 
		unsigned char iByte = _bitsToByte(iBits);
		res.push_back(iByte);
	}
	return res;
}
Beispiel #3
0
// представление массива бит в виде байта
unsigned char DESCoder::_bitsToByte (vecUnsChar bits)
{
	unsigned char res = 0;
	unsigned char pow2 = 1; // степень 2, на которую необходимо умножать очередной бит
	for (int i = 0; i < bits.size(); i++)
	{
		res += bits[i] * pow2;
		pow2 *= 2;
	}

	return res;
}
Beispiel #4
0
// представление массива байт в виде массива бит
vecUnsChar DESCoder::_bytesArrayToBits(vecUnsChar bytes)
{
	vecUnsChar res; 
	for (int i = 0; i < bytes.size(); i++)
	{
		// временный вектор, куда будет записаны биты очередного байта
		vecUnsChar iByteBits = _byteToBits(bytes[i]);

		// "приклеиваем" очередную порцию бит к уже полученным
		res.insert(res.end(), iByteBits.begin(), iByteBits.end());
	}
	return res;
}