Почему мое базовое шифрование AES256 C# не соответствует онлайн-шифровальщикам?

Я пишу простую реализацию AES и хочу использовать онлайн-шифраторы AES для проверки. Однако при вводе одной и той же конфигурации (тот же ключ, режим ECB, размер ключа 256) я всегда получаю разные выходные строки (как для base64, так и для шестнадцатеричного). Однако все онлайн-шифровальщики выводят одну и ту же зашифрованную строку, поэтому они выровнены. Что мне не хватает?

Ссылки на онлайн-инструменты: https://devglan.com/online-tools/aes-encryption-decryption и https://anycript.com/crypto

Мой код

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

namespace AesApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            using (Aes myAes = Aes.Create())
            {
                myAes.Mode = CipherMode.ECB;
                myAes.Key = Convert.FromBase64String("gHyP6i8mXqmdFK4rKsKP7EqvzfxwbtyE");

                string plaintext = "test";
                Console.WriteLine($"Plaintext : {plaintext}");

                ICryptoTransform encryptor = myAes.CreateEncryptor();

                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plaintext);
                        }

                        byte[] encrypted = msEncrypt.ToArray();
                        string encryptedString = Convert.ToBase64String(encrypted);
                        Console.WriteLine($"Encrypted : {encryptedString}");
                    }
                }
            }
        }
    }
}

конфигурация:

ECB mode, 
256 key size, 
sample key string = "gHyP6i8mXqmdFK4rKsKP7EqvzfxwbtyE", 
sample plaintext to encrypt = "test",

My output =     "/Ylo00TXuzmuBNYPZy5YOA= = "
Online output = "yyO1N4G9uxXJlQ8FLU3KfQ= = "
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
92
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Размер ключа 256 означает, что длина ключа составляет 256 бит (32 байта). Поскольку ваша примерная строка ключа уже имеет длину 32 байта, декодирование с помощью Base64 приведет к тому, что длина ключа станет 192 бита (24 байта). Поэтому вам следует использовать такие методы, как Encoding.UTF8.GetBytes, для преобразования ключевой строки в массив байтов, а не использовать FromBase64String.

Ответ принят как подходящий

Вы декодируете ключ как base64, а это не то же самое, что онлайн-сайты, подобные тем, которые вы упомянули, декодируют, они декодируют ключ как ASCII. Если вы хотите получить ту же ценность, что и онлайн-сайты, вам следует использовать следующий код:

myAes.Key = System.Text.Encoding.ASCII.GetBytes("gHyP6i8mXqmdFK4rKsKP7EqvzfxwbtyE");

Кстати, код, который вы написали, не ошибочный и правильный, просто размер вашего ключа не 256, а 192-битный.

Другие вопросы по теме