#ifndef GENERATEKEYS_H #define GENERATEKEYS_H #include #include #include #include #include #include #include #include"Characters.h" #include"GenerateDate.h" #include"FolderStructure.h" #include"Key.h" using std::vector; using std::string; using std::forward_list; using std::array; using std::stringstream; using std::size_t; using std::to_string; using std::fstream; class GenerateKeys : public Characters { public: GenerateKeys(); ~GenerateKeys() = default; void keyMove(Key<>&); void keyDump(Key<>&); friend class Encryption; friend class Decryption; friend class KeyManagementWindow; private: void generatedFileName(); void populateSymbols(); void populateNumbers(); void populateLetters(); template void addToDesignatedContainer(C&, const L&); template void addRange(C&, DT, const DT); template void addToCentralContainer(C&); template void generateKey(S&, const DT); bool isThereRepetition(const Key<>&); template void print(const C&); template char getChar(const C&); string defaultKeyFileName; //KeySize show equal the value in key const int keySize{5}; }; GenerateKeys::GenerateKeys() { srand(time(0)); populateSymbols(); populateNumbers(); populateLetters(); addToCentralContainer(symbols); addToCentralContainer(numbers); addToCentralContainer(letters); generatedFileName(); } void GenerateKeys::generatedFileName() { GenerateDate gd; defaultKeyFileName.assign(gd.retrieveDateString()); for (auto index=0; index!=8; ++index) { if (index==0) defaultKeyFileName.append("_"); else { auto randomInteger = rand()%10; defaultKeyFileName.append(to_string(randomInteger)); } } defaultKeyFileName.append(".txt"); } void GenerateKeys::populateSymbols() { forward_list symbolCodes; addRange(symbolCodes, 10, 10); addRange(symbolCodes, 32, 47); addRange(symbolCodes, 58, 64); addRange(symbolCodes, 91, 96); addRange(symbolCodes, 123, 126); symbolCodes.sort(); addToDesignatedContainer(symbols, symbolCodes); } void GenerateKeys::populateNumbers() { forward_list numberCodes; addRange(numberCodes, 48, 57); numberCodes.sort(); addToDesignatedContainer(numbers, numberCodes); } void GenerateKeys::populateLetters() { forward_list letterCodes; addRange(letterCodes, 65, 90); addRange(letterCodes, 97, 122); letterCodes.sort(); addToDesignatedContainer(letters, letterCodes); } template void GenerateKeys::addToDesignatedContainer(C& cont, const L& listOfValues) { auto listIter = listOfValues.begin(); for (auto index = 0; index!=cont.size() && listIter!=listOfValues.end(); ++index) { cont[index] = *listIter++; } } template void GenerateKeys::addRange(C& ch, DT from, const DT to) { auto range = to - from; for (auto index = 0; index<=range; ++index, ++from) ch.push_front(from); } template void GenerateKeys::addToCentralContainer(C& con) { for (auto index = 0u; index!=con.size(); ++index) allCharacters.push_back(*&con[index]); } template void GenerateKeys::generateKey(S& key, const DT size) { S ky; ky.resize(size); auto begKy = ky.begin(); for (auto index = 0; index!=size; ++index, ++begKy) { if (index < 2) *begKy = getChar(letters); else if (index < 3 && index > 1) *begKy = getChar(symbols); else *begKy = getChar(numbers); } key.assign(ky); } template void GenerateKeys::print(const C& ch) { for (auto beg = ch.begin(); beg!=ch.end(); ++beg) std::cout << *beg << " "; std::cout << std::endl; } void GenerateKeys::keyMove(Key<>& theKey) { vector iGotTheKeysDurf; for (auto index = 0u; index!=allCharacters.size(); ++index) { string tmpKey{}; generateKey(tmpKey, keySize); iGotTheKeysDurf.push_back(tmpKey); } theKey.keysInit(iGotTheKeysDurf); if (isThereRepetition(theKey)) { iGotTheKeysDurf.clear(); keyMove(theKey); } std::cout << "No repetitions in keys" << std::endl; } void GenerateKeys::keyDump(Key<>& theKey) { fstream dump{}; auto path = theKey.path(); auto iGotTheKeysDurf = theKey.retrieveKeys(); dump.open(path, std::ios::out); for (auto index = 0u; index!=iGotTheKeysDurf.size(); ++index) dump << iGotTheKeysDurf[index] << '\n'; dump.close(); } template char GenerateKeys::getChar(const C& ch) { char whitespace = 32; char newLine = 10; char hc = ch[rand() % ch.size()]; while (hc==whitespace || hc==newLine) hc = getChar(ch); return hc; } bool GenerateKeys::isThereRepetition(const Key<>& theKey) { vector iGotTheKeysDurf = theKey.retrieveKeys(); for (auto index = 0u; index!=allCharacters.size(); ++index) { string chosenOne{iGotTheKeysDurf[index]}; auto repetition = 0; for (auto innerIndex = 0u; innerIndex!=allCharacters.size(); ++innerIndex) if (chosenOne == iGotTheKeysDurf[innerIndex]) ++repetition; if (repetition > 1) { std::cout << "Too much repetitive stuff" << std::endl; return true; } } return false; } #endif