Зашифровать строку до фиксированной длины - PullRequest
5 голосов
/ 03 марта 2011

Я хочу зашифровать строку в base64, ввод строки может быть разной длины (ограничение составляет 16 символов), и я хочу получить зашифрованную строку фиксированной длины.

Кто-нибудь знает, как это сделать в .NET Framework? или есть алгоритм для этого?

Ответы [ 4 ]

6 голосов
/ 03 марта 2011

(РЕДАКТИРОВАТЬ: я предполагал, что вы хотите либо зашифровать строку, а затем кодировать результат как base64, всегда заканчивая с одинаковой длиной вывода. Это будетпомогите, если бы вы могли уточнить вопрос, чтобы подтвердить это, или объяснить, что вы делаете , если это не так.)

Ну, есть довольно простой алгоритм, который будет работать при любой схеме шифрованиякоторый всегда зашифровывает вход фиксированной длины на выход фиксированной длины (а их много):

  • Кодирует строку в двоичном виде с использованием UTF-16 (который всегда будет давать одно и то жедлина байтового массива для ввода той же строки)
  • Дополнить двоичные данные 32 байтами (т.е. максимальным размером), используя случайные данные
  • Добавить дополнительный байт в конце (или начале), указывающийисходная длина
  • Шифрование двоичных данных (которые всегда будут 33 байтами)
  • Преобразование результата в base64 с использованием Convert.ToBase64String

Чтобы расшифровать, просто перевернитепроцесс:

  • Преобразовать текст base64 в зашифрованные двоичные данные, используя Convert.FromBase64String
  • Расшифровать двоичные данные (обратно в двоичный текст "незашифрованный")
  • Найти длину от первого илипоследний байт
  • Расшифруйте соответствующий раздел двоичного текста в виде текста UTF-16

(используйте MSDN для поиска деталей каждого шага и не стесняйтесь обращаться за помощью к конкретномучасть.Ваш выбор алгоритма шифрования будет зависеть от того, что вы пытаетесь сделать, и я не являюсь экспертом в этом, я боюсь.)

РЕДАКТИРОВАТЬ: Если вам нужен только хэш, тогда приходят другие вопросыв игру.Хотели бы вы, чтобы одна и та же строка хэшировалась с до одной и той же строки?Обычно это желательно для хеширования, но не для шифрования.

0 голосов
/ 03 марта 2011

Во-первых, «base64» - это не шифрование, это просто кодировка или транспортная инкапсуляция.Он предназначен для передачи двоичных данных по транспорту, который допускает только символы ASCII.

Во-вторых, «base64» сам по себе имеет переменную длину, поэтому мы должны дополнить закодированную строку вручную и удалить заполнение для декодирования.

Однако следующий код демонстрирует, как достичь вашей цели.

using System;
using System.Text;

namespace encodingtest
{
    class Program
    {
        public static void Main(string[] args)
        {
            string encoded = Encode("Hello World!", 43);
            Console.WriteLine(encoded);
            Console.WriteLine(Decode(encoded));

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }

        static public string Encode(string source, int length)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(source);

            StringBuilder buffer = new StringBuilder(length);
            buffer.Append(System.Convert.ToBase64String(bytes));
            while (buffer.Length < length) {
                buffer.Append('=');
            }
            return buffer.ToString();
        }

        static public string Decode(string encoded) {
            int index = encoded.IndexOf('=');
            if (index >0) {
                encoded = encoded.Substring(0, ((index + 3) / 4) * 4);
            }
            byte[] bytes = System.Convert.FromBase64String(encoded);
            return System.Text.Encoding.UTF8.GetString(bytes);
        }
    }
}
0 голосов
/ 03 марта 2011

есть очень четкий пример внизу этого MSDN-справка
Другими словами, вам нужно использовать RSA с алгоритмом хеширования, таким как SHA1 в предыдущем примере.Использование алгоритмов SHA состоит в том, чтобы преобразовать любую строку произвольной длины в строку фиксированной длины и, таким образом, если длина строк составляет, например, 1 000 000 000 символов ... вам не потребуется 1 000 000 000 байтов для их хранения.Вам нужно будет сохранить полученную строку только после применения алгоритмов SHA, что в случае SHA1 составляет 160 символов.Я думаю, что в вашем случае вам нужно только хэшировать, а не шифровать. Преимущество использования алгоритмов SHA заключается в защите ваших закодированных данных.в противном случае любой умный чувак сможет расшифровать вашу зашифрованную строку.

РЕДАКТИРОВАТЬ
Поскольку вам требуется результирующий хэш, длина которого меньше, чем у известных функций хеширования, существует несколько способов, одним из известных способов является XOR первые 22 байта результирующего хэша в цикле For до конца исходного хэша.В результате вы получите 22-символьную строку. Однако это не рекомендуется, поскольку чем меньше символов в вашем хэше, тем больше вероятность того, что у вас возникнет коллизия или результирующий хэш с меньшей длиной, похожий на другой в вашей системе.

0 голосов
/ 03 марта 2011

Если вы ищете одностороннее шифрование (не нужно расшифровывать), вы можете использовать SHA1

        string secretKey = "MySecretKey";
        string salt = "123";
        System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create();
        byte[] preHash = System.Text.Encoding.UTF32.GetBytes(secretKey + salt);
        byte[] hash = sha.ComputeHash(preHash);
        string password = System.Convert.ToBase64String(hash);

Если вы хотите зашифровать и расшифровать, вы, вероятно, можете использовать RSA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...