Выберите только одну строку из миллионов [решено] - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть программа, которая проверяет миллионы результатов, чтобы перебрать пароль 3DES, но я хочу, чтобы он показывал мне только правильный, а не миллионы результатов гиббери sh, поэтому я думал о способах получить избавиться от результатов с помощью символов, отличных от ASCII, и попытаться использовать такие, как ifs.

[Возможное решение, которое сработало для меня]

// проверить слова, которые могут появиться в расшифрованном тексте, просто удалив ASCII делает это проще, но результат в моем случае также имел 3 избыточных ascii в качестве дополнительного, поэтому мы не могли сделать это таким образом, но это должно нормально работать.

if(decryptedText.Contains("WORDS")||...lots)
{
   Console.WriteLine(key);
   Console.WriteLine("Correct Text ="+decryptedText);
}

Я также попытался превратить все это в ASCII, но он дает почти такое же и такое же количество миллионов результатов, поскольку правильный результат имел в конце 3 избыточных не ASCII-символа.

var textoLimpio = LimpiarASCII.ReturnCleanASCII(decryptedText);

пример гиббери sh результат

1 Ответ

0 голосов
/ 13 апреля 2020

Вы делаете тонны манипуляции со строками. Каждое изменение строки занимает немного памяти.

Во-первых, если вы хотите сохранить структуру, вы должны переключиться с ArrayList на List<int>, чтобы он содержал ваш список догадок, и использовать строки только тогда, когда вы вынуждены при передаче строки ключей в расшифровку функция. Кроме того, никогда не используйте ArrayList для современного программирования, единственная причина, по которой класс существует, - это обратная совместимость со старым кодом. Если вы действительно должны иметь список, который может принимать все, используйте вместо этого List<object>, но использование указанного списка c, например List<int> или List<string>, работает намного лучше.

Однако posiblesClves3 совершенно не требуется Вы можете просто поместить расшифрованный код прямо в поле l oop. Вы также можете сравнить с числом 0xFFFFFF в вашем для l oop, и вам не нужно сравнение строк. Также вы можете использовать .ToString("X6") вместо .ToString(X).PadLeft('0',6), что экономит вам дополнительную строку на л oop.

Вот очень урезанная версия вашего кода с использованием как можно меньшего количества строк.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Collections;

namespace ProyectoEspiasSergioSolorzanoAriste
{
    class Program
    {
        static void Main(string[] args)
        {
            var encryptedText = "7iuYS0z/aIp/f+dNjJCkLULBY+3K5F3B4BYBSNoKEc0g8M3lcFFECqHMb2E9rv12sUCjJA/ve1uCxGNL/feZjEFBpANh0tAs/5+97+L+kuL0wZI78Ux40XhEbyTSIoEfGY4GsM7uce7PzZ1sYSb9Kql/0j6Qu9RGWXqJMPF9XYYv5FxgNLJ8y8bzoGcZVf6h7k95a5YoX6KP9T20TMPJcqUf+nEYTo2Y54K6vU8pAUC0UxTnLlxakzCT+QBIhXl0SRS6/36rbkSppNYd0GLq5HRN+/BEFvGF+0p9fRZQ5hyqEmy8OEFqFtSBeA0LotyszSHq1ZqJA56rqXjoSZZm6ljcITolbx101eNH7x0S1zjzNv1dovIsaONQfbt6ZUlldxFDSVrQrTrsso32LIO8JWGsUCp6mc8VhL5hAA8xY7d8cwSoDzlm7+46fqP6pEnL/dArS9As+vE6ZWh+JYmDQJ5pEs2KDEVTQb5o4rFB79QE8EmmysvsC23baZXsO5Qa1GqeMcUZ2mORTHUs1GTKhqY1DpOGtXbykpXs+0RlmNzvIEASf5yOqOnHOvhzxGGzjvrEiAc61t6DB/frmGlokVZEuZcziwcb883jCRwXOb21R/AtCaf4A1VHbVq/xoeS/XRExgOle6xZGibNMUHrvprtnj9Hhdwz4H0p6m6T3sR6GAzhzAl12MzMdG4VM6QFJsSND5nNQRlHByYTZ5ebWTupKbSIDPCaOu4FydZuJj4=";
            Console.WriteLine("After Encryption Text = " +
                   encryptedText + "/n");
            var solucionesDecrypt = new List<string>(0xFFFFFF); //Presize the list to hold all the values.


            for (int i = 0; i <= 0xFFFFFF; i++)
            {
                var decryptedText = ClsTripleDES.Decrypt(encryptedText, i.ToString("X6"));
                solucionesDecrypt.Add(decryptedText);

            }
            foreach (string decryptedText in solucionesDecrypt)
            {
                Console.WriteLine("After Decryption Text = " + decryptedText + "/n");
            }
            Console.ReadLine();
        }
    }
}
...