基于C++实现的密码枚举算法

/** Copyright 2021 Qsaker(qsaker@outlook.com). All rights reserved.*/#include 
#include 
#include 
#include /*** @brief enumerate_passwrod: 枚举密码* @param dictionary: 密码字典* @param length: 密码长度* @param callback: 每枚举出一个密码,调用一次该函数*/
void enumerate_passwrod(const std::string &dictionary, const unsigned long long length, void (*callback)(const std::string))
{unsigned long long dictionary_length = dictionary.length();unsigned long long *dictionary_index = new unsigned long long[length]();bool finished = false;std::string password;while (!finished) {// 每次枚举前清空密码缓存password.clear();// 枚举一个密码for(unsigned long long i = 0; i < length; i++){password.push_back(dictionary[dictionary_index[i]]);}// 如果设置有枚举回调函数则调用,每枚举出一个密码,调用一次回调函数if (callback) {(*callback)(password);}// 更新枚举参数(下标)for (unsigned long long j = length - 1; j >= 0; j--) {dictionary_index[j]++;if (dictionary_index[j] == dictionary_length) {// 相等则表示第j位密码的所有取值轮询了一遍,将位密码索引复位dictionary_index[j] = 0;if (j == 0) {// 如果第一位密码也轮询了一遍,则表示枚举了所有可能的密码组合finished = true;break;}} else {break;}}}delete []dictionary_index;}/*** @brief enumerated_callback: 枚举回调函数,没次枚举一个密码,调用一次该函数* @param password: 枚举出来的密码*/
void enumerated_callback(const std::string password)
{std::cout << password << std::endl;
}int main()
{// 定义一个密码字典,也就是组成密码的可能字符,此处简单单点,以10个阿拉伯字符为例const std::string password_dictionary = "0123456789";// 枚举长度为10个字符的所有字符组合,没枚举一个会调用回调函数一次enumerate_passwrod(password_dictionary, 10, enumerated_callback);return 0;
}

以下是枚举10位长度密码时的运行截图


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部