算法依据当前系统时间的月和日来校验,只不过带了很多垃圾字符混淆,详细逻辑看代码逻辑与注释。
; }+ Z7 X+ b: T& B" w4 R
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <windows.h>
- #include <random>
- #include <chrono>
- #include <ctime>
- #include <string>
- #include <fstream>
- using namespace std;
- //约定源验证位置
- #define CHECK_FLAG 325
- //密文生成长度
- #define PWD_LENTH 1000
-
- int main()
- {
- //生成随机数种子
- random_device rd; // 用于获取随机种子
- mt19937 gen(rd()); // 使用Mersenne Twister 19937算法作为随机数生成器
- uniform_int_distribution<int> dis(0, 78); // 定义一个产生0到99之间均匀分布的整数的随机数分布器
- //生成密码表
- unsigned char passtable[80] = { 0 };
- int j = 0;
- for (int i = 48 ;i<128; i++) {
- passtable[j] = i;
- j++;
- }
- //生产PWD_LENTH位随机密码字符
- unsigned char password[PWD_LENTH] = { 0 };
- for (int i = 1; i < PWD_LENTH; i++) {
- password[i] = passtable[dis(gen)];
- }
- //约定第CHECK_FLAG=325位为起源验证字节
- //获取当前系统时间的月的第一位,号的第一位分别转为字符作为核心验证字节
- //325位的ascll码存了月的第一位存在位置,月所在位置的下一位又存了号的第一位所存在的位置
- chrono::system_clock::time_point now = chrono::system_clock::now();
- time_t time = chrono::system_clock::to_time_t(now);
- tm local_time = *localtime(&time);
- int month = local_time.tm_mon + 1; // 获取当前月份,并加1(因为tm_mon的取值范围是0-11)
- int day = local_time.tm_mday;
- char month_digit = to_string(month).c_str()[0];
- char day_digit = to_string(day).c_str()[0];
- int month_loc = password[CHECK_FLAG];
- password[month_loc] = month_digit;
- int day_loc = password[month_loc + 1];
- password[day_loc] = day_digit;
- //将密文写出为password.txt
- fstream pwdtxt;
- pwdtxt.open("password.txt", ios::binary |ios::out);
- for (int i = 0; i< PWD_LENTH; i++) { // 循环写入字符
- pwdtxt.put(password[i]);
- }
- pwdtxt.close();
- }
生成密文: ) q- ], a- @9 d h5 S) r# c& L
& w0 E( O8 }0 y* \+ S( s5 g
7 U# s# \9 I: O/ S V; d9 o
可以根据上述的代码写出应用端的校验,也可以根据自己的需求改。 |