// представление массива бит в ввиде массива байт 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; }
// представление массива бит в виде байта 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; }
// представление массива байт в виде массива бит 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; }
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; }