算法依据当前系统时间的月和日来校验,只不过带了很多垃圾字符混淆,详细逻辑看代码逻辑与注释。
. X3 ]1 p Q0 _" N2 e#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();
} 生成密文:
p/ }2 A2 f9 \+ `3 M0 ^
3 E1 r/ x& Z% |& i( _& N% M) I
/ U( M' s7 b0 ?可以根据上述的代码写出应用端的校验,也可以根据自己的需求改。 |