#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. Здорово. Спасибо за голосование и отметку о решении! Счастливого программирования 🙂