PassWord.cs
a
b
.
.
.
z
aa
ab
..
az
aaa
aab
.
.
假设可能字符的总数是M个,则“生成1位到2位到3位,最后N位的字符串”的问题,
可以理解为:N个数位,M进制的计数问题,每个数位上的值就是M个字符的索引,
1)我们创建一个数组,初始时候都是索引为0;
2) 根据当前的数位个数反向,也就是从低外到高位做+1 操作;
3)如果+1后,没有到达M字符边界,则完成;
4)如果+1后,到达了M字符边界,
分为
4.1)如果是最高位,则需要进位,则需要将数位+1,之前各位索引都是0;
4.2)如果不是罪高位,则当前位设置为0;前1位需要进位,转到 3)。
using System;
using System.Collections.Generic;
using System.Text;
namespace testExcelPwd
{
public class PassWord
{
string lowerstr = @"abcdefghijklmnopqrstuvwxyz";
string upperstr = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string numstr = @".0123456789";
string otherstr = "`~!@#$%^&*()-_=+[]{}\\|;:'\",<.>/?";
int[] maskIndex = new int[100];
public int NumPwd = 1;
public int NumPwdMax { get; set; }
public int NumPwdMin { get; set; }
private char[] allChars;
private int nChars;
Int64 count = 0;
public PassWord()
{
string all = numstr + lowerstr + upperstr + otherstr;
allChars = all.ToCharArray();
nChars = allChars.Length;
// NumPwd = NumPwdMin;
for (int i=0; i<100; i++)
{
maskIndex[i] = 0;
}
}
// [0] [1] [25]
public string getStr()
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < NumPwd; i++)
{
int index = maskIndex[i];
char c = allChars[index];
builder.Append(c);
}
// 执行加1
setMask();
return builder.ToString();
}
public string getMask()
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < NumPwd; i++)
{
int index = maskIndex[i];
builder.Append(index.ToString());
builder.Append('-');
}
return builder.ToString().TrimEnd("-".ToCharArray());
}
// 流程:这个算法相当于一个N进制的+1算法,
// 对末尾的
private int setMask()
{
++count;
for (int i = NumPwd - 1; i >= 0; --i)
{
++maskIndex[i]; // 末尾执行加1操作;
if (maskIndex[i] >= nChars) // 执行进位
{
maskIndex[i] = 0;
if (i == 0) // 到达最高位了,位数加1
{
++NumPwd;
return NumPwd;
}
else // 不是最高位,下一循环,执行进位
{
continue;
}
}
else // 无进位
{
return NumPwd;
}
}
return NumPwd;
}// end setmask
}
}
使用方法:
PassWord pwd = new PassWord();
// 循环获取字符串
string text = pwd.getMask() + " 是 " + pwd.getStr() + "\r\n";
这个类本来是想用来暴力破解excel的,但是发现,无论是spire库,或者使用COM组件,
测试一次口令后,需要重新生成对象,否则后续就会报错,
懒得用VC测试了,发现了hashcat,
见另一篇日记。