1

以下に示すように、レインボーテーブルを生成します。

今2つの質問:

  1. bigint を使用せずに (たとえば、2 つのネストされた for ループ) 、順序を保持しながらこれを行うにはどうすればよいですか (つまり、アルファベット 0-9 は 2 桁で 0 から 99 までカウントされます)。
  2. すべてのプロセッサスロットとすべてのコアを利用して、ハッシュテーブルをより高速/最も効率的に生成するさまざまな方法は何ですか?

2) では、範囲をさまざまなグループに分割し、これをスレッドで実行します。
ただし、.NETが自動的にそれを行わない限り、これは異なるコアを使用しません(私はそれぞれ2つのコアを持つ4つのプロセッサを持っています)。

( https://github.com/ststeiger/RainbowTableGeneratorのプロジェクト全体)

using System.Windows.Forms;


namespace RainbowTableGenerator
{


    public partial class Form1 : Form
    {


        public Form1()
        {
            InitializeComponent();
            NativeMethods.SetPlaceHolderText(this.txtNumDigits, "Num Digits");
        }


        private void btnPermute_Click(object sender, System.EventArgs e)
        {
            int digits;
            if (!System.Int32.TryParse(this.txtNumDigits.Text, out digits))
                digits = 2;

            this.dgvDisplayData.DataSource = Permute(digits);
        }


        public static string MD5(string input, System.Text.Encoding enc)
        {
            // step 1, calculate MD5 hash from input
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] inputBytes = enc.GetBytes(input);
            byte[] hash = md5.ComputeHash(inputBytes);

            // step 2, convert byte array to hex string
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }


        public System.Data.DataTable Permute(int digits)
        {
            this.txtNumDigits.Text = digits.ToString();

            System.Data.DataTable dt = new System.Data.DataTable();
            dt.Columns.Add("i", typeof(System.Numerics.BigInteger));
            dt.Columns.Add("Text", typeof(string));
            dt.Columns.Add("MD5-Hash (ASCII)", typeof(string));
            dt.Columns.Add("MD5-Hash (UTF8)", typeof(string));


            // char[] allowedAlphabet = new char[] { '0', '1'};
            // char[] allowedAlphabet = new char[] { '0', '1', '2'};
            // char[] allowedAlphabet = new char[] { 'a', 'b', 'c'};
            // char[] allowedAlphabet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

            char[] allowedAlphabet = @"aåáàâäbcç¢deéèêëfghiïjklmnñoœóôöpqrsßtuûüvwxyzAÅÁÀÂÄBCÇ¢DEÉÈÊËFGHIÏJKLMNÑOŒÓÔÖPQRSTUÛÜVWXYZ #=+-_*°§%@¦|&!?.:;~^()[]{}<>\/€$£¬'`´""".ToCharArray();

            // Add reference to System.Numerics.dll
            System.Numerics.BigInteger numChars = allowedAlphabet.LongLength;

            // int nm = (int)System.Math.Pow(numChars, digits);
            System.Numerics.BigInteger nm = System.Numerics.BigInteger.Pow(numChars, digits);

            System.Data.DataRow dr = null;
            for (System.Numerics.BigInteger i = 0; i < nm; ++i)
            {

                // int decimalNumber = i;
                // int remainder;
                System.Numerics.BigInteger decimalNumber = i;
                System.Numerics.BigInteger remainder;

                string result = string.Empty;
                do
                {
                    // remainder = decimalNumber % numChars;
                    // decimalNumber /= numChars;
                    // result = remainder.ToString() + result;

                    remainder = System.Numerics.BigInteger.Remainder(decimalNumber, numChars);
                    decimalNumber = System.Numerics.BigInteger.Divide(decimalNumber, numChars);

                    int iRemain = (int)remainder;
                    result = allowedAlphabet[iRemain].ToString() + result;
                } while (decimalNumber > 0);


                dr = dt.NewRow();
                dr["i"] = i;
                dr["Text"] = result;
                dr["MD5-Hash (ASCII)"] = MD5(result, System.Text.Encoding.ASCII);
                dr["MD5-Hash (UTF8)"] = MD5(result, System.Text.Encoding.UTF8);

                dt.Rows.Add(dr);
                // System.Console.WriteLine("Combination:  {0}", result);
            } // Next i 

            System.Console.WriteLine("Finished {0} entries", dt.Rows.Count);
            System.Console.WriteLine(System.Environment.NewLine);

            return dt;
        } // End Function Permute


    }


}





namespace RainbowTableGenerator
{


    class NativeMethods
    {

        private const uint EM_SETCUEBANNER = 0x1501;

        [System.Runtime.InteropServices.DllImport("user32.dll",SetLastError=true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern System.IntPtr SendMessage(System.IntPtr hWnd, uint msg, System.IntPtr wParam,
            [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]string lParam);



        // http://www.fluxbytes.com/csharp/set-placeholder-text-for-textbox-cue-text/
        public static void SetPlaceHolderText(System.Windows.Forms.TextBox txt, string Text)
        {
            if(System.Environment.OSVersion.Platform != System.PlatformID.Unix)
                SendMessage(txt.Handle, EM_SETCUEBANNER, System.IntPtr.Zero, Text);
        }


    }


}
4

0 に答える 0