зашифровать и расшифровать строку данного ключа - PullRequest
0 голосов
/ 21 января 2020

Я унаследовал код ниже. К сожалению, расшифрованное значение hello_world - это не

hello world

, а (в моем случае):

&�|ktR���ڼ��S����%��< ���8�

Есть идеи? Также кажется, что результат каждый раз отличается, что довольно очевидно, учитывая код. Могу ли я изменить это так, чтобы я мог один раз отправить данные в зашифрованном виде, а затем снова расшифровать в будущем? Спасибо!

Код:

using System;
using System.IO;
using System.Security.Cryptography;

namespace crypt
{
    class Program
    {
        static void Main(string[] args)
        {
            var key = @"abcdefghijklmnopqrstuvw==";

            using (var aesAlg = Aes.Create())
            {
                aesAlg.Mode = CipherMode.CBC;
                aesAlg.Padding = PaddingMode.PKCS7;
                aesAlg.Key = Convert.FromBase64String(key);
                aesAlg.GenerateIV();
                var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                var enc_hello_world = EncryptProperty(encryptor, "hello world");

                var hello_world = DecryptProperty(encryptor, enc_hello_world);
            }

        }
        private static string EncryptProperty(ICryptoTransform encryptor, string valueToEncrypt)
        {
            byte[] encrypted;
            using (var msEncrypt = new MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (var swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(valueToEncrypt);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
            return Convert.ToBase64String(encrypted);
        }

        private static string DecryptProperty(ICryptoTransform decryptor, string valueToDecrypt)
        {
            string decrypted;

            using (var msDecrypt = new MemoryStream(Convert.FromBase64String(valueToDecrypt)))
            {
                using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (var srDecrypt = new StreamReader(csDecrypt))
                    {
                        decrypted = srDecrypt.ReadToEnd();
                    }
                }
            }
            return decrypted;
        }
    }
}

1 Ответ

0 голосов
/ 21 января 2020

AES-CB C требует две переменные для кодирования и декодирования данных: ключ и IV (вектор инициализации). Вектор инициализации может быть отправлен в виде открытого текста, и это не приведет к ухудшению безопасности вашего шифрования.

aesAlg.GenerateIV();

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

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

Вот хороший пример AES в C#: https://gist.github.com/mark-adams/87aa34da3a5ed48ed0c7 (похоже, он использовал упомянутый мной метод).

...