diff --git a/Markopy/src/CLI/markopy_cli.py b/Markopy/src/CLI/markopy_cli.py index 796d3882..de7d5139 100644 --- a/Markopy/src/CLI/markopy_cli.py +++ b/Markopy/src/CLI/markopy_cli.py @@ -24,6 +24,8 @@ parser.add_argument("-d", "--dataset", help="Dataset file to read input from for training. Will be ignored for generation mode.") parser.add_argument("-s", "--seperator",help="Seperator character to use with training data.(character between occurrence and value)") parser.add_argument("-w", "--wordlist", help="Wordlist file path to export generation results to. Will be ignored for training mode") +parser.add_argument("--min", default=6, help="Minimum length that is allowed during generation") +parser.add_argument("--max", default=12,help="Maximum length that is allowed during generation") parser.add_argument("-n", "--count", help="Number of lines to generate. Ignored in training mode.") parser.add_argument("-v", "--verbosity",action="count", help="Output verbosity.") args = parser.parse_args() @@ -89,7 +91,7 @@ def cli_generate(model): if(os.path.isfile(args.wordlist)): logging.pprint(f"{args.wordlist} exists and will be overwritten.", 1) - model.Generate(int(args.count), args.wordlist) + model.Generate(int(args.count), args.wordlist, args.min, args.max) diff --git a/MarkovModel/src/model.cpp b/MarkovModel/src/model.cpp index 91f9de17..2ff3ec06 100644 --- a/MarkovModel/src/model.cpp +++ b/MarkovModel/src/model.cpp @@ -93,16 +93,30 @@ bool Markov::Model::Export(const char* filename) { } template -NodeStorageType* Markov::Model::RandomWalk() { +NodeStorageType* Markov::Model::RandomWalk(int minSetting, int maxSetting) { Markov::Node* n = this->starterNode; int len = 0; NodeStorageType *ret = new NodeStorageType[64]; - + Markov::Node *temp_node; while (n != NULL) { - n = n->RandomNext(); + //n = n->RandomNext(); + temp_node = n->RandomNext(); //dirty cutoff, needs better solution - if (len == 60) break; - if (n == NULL) break; + if (len == 60) + break; + if (len > maxSetting) { + //std::cout<<"MAX ->"<< "node*: " << temp_node << ", len: " << len << "\n"; + break; + } + + if ((temp_node == NULL) && (len < minSetting)) { + //std::cout << "node*: " << temp_node << ", len: " << len << "\n"; + continue; + } + + if (temp_node == NULL) + break; + n = temp_node; //std::cout << n->NodeValue(); ret[len++] = n->NodeValue(); diff --git a/MarkovModel/src/model.h b/MarkovModel/src/model.h index 935d2a23..1e4be6ca 100644 --- a/MarkovModel/src/model.h +++ b/MarkovModel/src/model.h @@ -34,7 +34,7 @@ namespace Markov { * Start from the starter node, invoke RandomNext on current node until terminator node is reached. * @return Null terminated string that was generated. */ - NodeStorageType* RandomWalk(); + NodeStorageType* RandomWalk(int minSetting, int maxSetting); /** @brief Adjust the model with a single string. * Start from the starter node, and for each character, AdjustEdge the edge EdgeWeight from current node to the next, until NULL character is reached. diff --git a/MarkovPasswords/src/markovPasswords.cpp b/MarkovPasswords/src/markovPasswords.cpp index cfd16995..2075127d 100644 --- a/MarkovPasswords/src/markovPasswords.cpp +++ b/MarkovPasswords/src/markovPasswords.cpp @@ -70,7 +70,7 @@ std::ofstream* MarkovPasswords::Save(const char* filename) { } -void MarkovPasswords::Generate(unsigned long int n, const char* wordlistFileName) { +void MarkovPasswords::Generate(unsigned long int n, const char* wordlistFileName, int minLen, int maxLen) { char* res; char print[100]; std::ofstream wordlist; @@ -78,7 +78,7 @@ void MarkovPasswords::Generate(unsigned long int n, const char* wordlistFileName wordlist.open(wordlistFileName); for (int i = 0; i < n; i++) { - res = this->RandomWalk(); + res = this->RandomWalk(minLen, maxLen); #ifdef _WIN32 strcpy_s(print, 100, (char*)res); #else diff --git a/MarkovPasswords/src/markovPasswords.h b/MarkovPasswords/src/markovPasswords.h index 9769438c..5836567f 100644 --- a/MarkovPasswords/src/markovPasswords.h +++ b/MarkovPasswords/src/markovPasswords.h @@ -46,7 +46,7 @@ class MarkovPasswords : public Markov::Model{ * @param n - Number of passwords to generate. * @return std::ofstream* of the output file. */ - void Generate(unsigned long int n, const char* wordlistFileName); + void Generate(unsigned long int n, const char* wordlistFileName, int minLen=6, int maxLen=12); private: std::ifstream* datasetFile;