Расшифровка строки AES работает не так, как ожидалось

#c# #cryptography

Вопрос:

Я пытаюсь расшифровать простую строку AES BqvGk lyQ pyhSqwV3MfRg== (что переводится как Hello World) при вводе пользователем жестко закодированного ключа, но я получаю ошибку. Может ли это быть проблемой, когда он пытается прочитать строку base64 из терминала? Не знаю, как это исправить.

    at EncryptionDecryptionUsingSymmetricKey.AesOperation.DecryptString(String key) in \visualstudioAES_DecryptorAES_DecryptorProgram.cs:line 32
   at EncryptionDecryptionUsingSymmetricKey.AesOperation.Main(String[] args) in \visualstudioAES_DecryptorAES_DecryptorProgram.cs:line 21
 
 using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace EncryptionDecryptionUsingSymmetricKey
{
    public class AesOperation
    {
        static void Main(string[] args)
        {
            var key = "b14ca5898a4e4133bbce2ea2315a1916";

            Console.WriteLine("[ ] Decrypt: ");
            var str = Console.ReadLine();
           
            var decryptedString = AesOperation.DecryptString(key);
            Console.WriteLine($"[ ] Original payload: {decryptedString}");

        }

        private static object DecryptString(string key)
        {
            throw new NotImplementedException();
        }

        public static string DecryptString(string key, string cipherText)
        {
            byte[] iv = new byte[16];
            byte[] buffer = Convert.FromBase64String(cipherText);

            using (Aes aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.IV = iv;
                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

                using (MemoryStream memoryStream = new MemoryStream(buffer))
                {
                    using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
                        {
                            return streamReader.ReadToEnd();
                        }
                    }
                }
            }
        }
    }
}
 

Комментарии:

1. Может быть, вы вызываете AesOperation.DecryptString(key) , и эта функция просто private static object DecryptString(string key) { throw new NotImplementedException(); }

Ответ №1:

Этот метод работает. Когда я бегу:

     void Main()
    {
        var key = "b14ca5898a4e4133bbce2ea2315a1916";

        var decryptedString = DecryptString(key, "BqvGk lyQ pyhSqwV3MfRg==");
        Console.WriteLine($"[ ] Original payload: {decryptedString}");
    }
 

В результате получается:

 [ ] Original payload: Hello World!
 

Я также использую ваш собственный метод:

 public static string DecryptString(string key, string cipherText)
{
    byte[] iv = new byte[16];
    byte[] buffer = Convert.FromBase64String(cipherText);

    using (Aes aes = Aes.Create())
    {
        aes.Key = Encoding.UTF8.GetBytes(key);
        aes.IV = iv;
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

        using (MemoryStream memoryStream = new MemoryStream(buffer))
        {
            using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }
    }
}
 

Поэтому я думаю, что вам нужно либо предоставить больше сообщений об ошибках, если таковые имеются, либо нам нужно больше кода. Потому что ваш ключ прекрасно расшифровывает строку AES с помощью вашего собственного метода.

Если бы мне пришлось угадывать, проблема заключается в 1 из 2 вещей.

var str = Console.ReadLine();

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

 private static object DecryptString(string key)
    {
        throw new NotImplementedException();
    }
 

Комментарии:

1. Хорошо, спасибо! Это решило проблему . Мне не хватало переменной в моем DecryptString()

2. Здорово. Спасибо за голосование и отметку о решении! Счастливого программирования 🙂