10进制转62进制,实现穷举指定位数的所有密码组合(暴力破解)

因为我们这里要穷举的密码包括0-9,a-z,A-Z共62个字符,所以我们采用62进制来遍历。

首先,我们实现一个10进制转62进制的方法。

        private static char[] charSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
        //private static string[] charSet = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
        //                                      "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
        //                                      "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
        //                                      "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
        //                                      "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

        /// <summary>
        /// 将指定数字转换为指定长度的62进制
        /// </summary>
        /// <param name="value">要转换的数字</param>
        /// <param name="length">需要的长度</param>
        /// <returns>62进制表示格式</returns>
        public static string ConvertTo62(long value, int length)
        {
            string sixtyNum = string.Empty;
            if (value < 62)
            {
                sixtyNum = charSet[value].ToString().PadLeft(length, ‘0‘);
            }
            else
            {
                long result = value;
                //char[] ch = new char[length];
                while (result > 0)
                {
                    long val = result % 62;
                    //ch[--length] = charSet[val];
                    sixtyNum = charSet[val] + sixtyNum;
                    result = result / 62;
                }
                sixtyNum = sixtyNum.PadLeft(length, ‘0‘);
                //for (int i = 0; i < length; i++)
                //{
                //    ch[i] = ‘0‘;
                //}
                //sixtyNum = new string(ch);
            }
            return sixtyNum;
        }

进过测试发现把charSet定义成char类型比string的要快一点,但马中的计算也采用char的方式(我注释掉的代码)也要快一点。

Console.WriteLine(ConvertTo62(520, 5));//输出:0008o

因为520转换成为62进制是8o,不足5位前面加0补齐。

然后,我们就可以写一个方法来遍历指定长度的密码了。

        /// <summary>
        /// 遍历指定位数之间的所有组合
        /// </summary>
        /// <param name="minLength">最短位数</param>
        /// <param name="maxLength">最长位数</param>
        public static void testPassword(int minLength, int maxLength)
        {
            for (int i = minLength; i <= maxLength; i++)
            {
                long maxNum = (long)Math.Pow(62, i);
                for (long j = 0; j < maxNum; j++)
                {
                    Console.WriteLine(ConvertTo62(j, i));
                }
            }
        }

调用:

testPassword(2, 3); 

程序将会输出2位和3位密码的所有组合形式。(从:00-ZZZ)

根据这个思路,我们还可以写出更多形式的穷举算法。比如我们遍历的密码还包含小数点“.”,那么我们只需要把算法改成63进制即可。

时间: 2024-10-09 11:42:51

10进制转62进制,实现穷举指定位数的所有密码组合(暴力破解)的相关文章

C# 10进制与62进制互转 数据大无压力 10进制与72,96进制任意转换

因项目需要把10进制的ID转换成62进制的字符串,分享给别人. 于是在网上搜索了很多算法,但都未能满足需要,项目里的ID是固定算法算出来的18~20位数据的ulong整型. 如:17223472272256398107,509488277152981097. 网上找的算法问题在于,将ulong的值转换62进制的字符串后,再将字符串转换成ulong值时会不准确. 于是各种测试与假象问题所在,最后确定算法确实没有问题,于是开始怀疑数据类型的问题. 果然,原因是使用了Math.Pow(double x

javascript 10进制和62进制的转换

function string10to62(number) { var chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split(''), radix = chars.length, qutient = +number, arr = []; do { mod = qutient % radix; qutient = (qutient - mod) / radix; arr.unshift(char

&lt;13&gt;【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制

1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 //定义10进制数,打印出10.8.16进制的值 6 int a = 13; 7 printf("%d\n",a); 8 printf("%o\n",a); 9 printf("%x\n",a); 10 11 //int 64 4个字节 12 int b = 0b0000000000000000

python中2进制、10进制、16进制等之间的转换

10转2: bin(8) # '0b1000' 2转10: int('1000', 2) # 8 10转16: hex(15) # '0xf' 16转10: int('f', 16) # 15 2进制和16进制中间通过转10进制可以相互转换

华为笔试练习题----解析9进制,11进制的字符串为10进制的数字输出

                                                                              解析9进制,11进制的字符串为10进制的数字输出 描述: 解析9进制,11进制的字符串为10进制的数字输出,输入的字符串有效位(0v0012345678)长度不超过8位,前面的00不算做有效位.解析后以10进制的数字输出.如果解析到非法字符串则返回-1 9进制: 9进制的数的范围:0,1,2,3,4,5,6,7,8 9进制的开始为:0V或者0

javascript 10进制和64进制的转换

原文:javascript 10进制和64进制的转换 function string10to64(number) { var chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ-~'.split(''), radix = chars.length, qutient = +number, arr = []; do { mod = qutient % radix; qutient = (qutient - m

( 转)Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法

一.类型比较 bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据,存储大小为 8 个字节.一个字节就是8位,那么bigint就有64位 int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据,存储大小为 4 个字节.int类型,最大可以存储32位的数据 smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据,存储大小为 2 个

Project Ruler 算法练习之 10 进制 转 2进制 以及数字对称

问题描述: The decimal number, 585 = 10010010012 (binary), is palindromic in both bases. Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2. (Please note that the palindromic number, in either base, may not inc

自己实现10进制转2进制和16进制

1 public class Test { 2 3 public static void main(String[] args) { 4 System.out.println(toBinary(9)); 5 System.out.println(toHex(559)); 6 System.out.println(Integer.toBinaryString(9)); 7 System.out.println(Integer.toHexString(559)); 8 /*1001 9 22F 10