0

I'm trying to encrypt the string, but it seems to be giving an error in the json, because it's cutting 5 characters from the string.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;

namespace Test
{
    public class Test
    {
        public static void Run()
        {
            string encryptedString = "";

            // Create a sample JSON object
            var data = new
                       {
                           name = "Alice",
                           age = 30,
                           email = "alice@example.com"
                       };

            // Serialize the JSON object to a byte array
            var jsonBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));

            // Create an AES encryption algorithm instance
            using (var aes = Aes.Create())
            {
                // Generate a random encryption key and IV
                aes.GenerateKey();
                aes.GenerateIV();
  
                // Encrypt the JSON byte array
                byte[] encryptedBytes;

                using (var encryptor = aes.CreateEncryptor())
                using (var memoryStream = new MemoryStream())
                using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(jsonBytes, 0, jsonBytes.Length);
                    cryptoStream.FlushFinalBlock();
                    encryptedBytes = memoryStream.ToArray();
                }

                // Combine the encrypted bytes with the key and IV
                byte[] combinedBytes = new byte[aes.Key.Length + aes.IV.Length + encryptedBytes.Length];
                Console.WriteLine($"{combinedBytes.Length},  {aes.Key.Length} {aes.IV.Length}");

                Array.Copy(aes.Key, 0, combinedBytes, 0, aes.Key.Length);
                Array.Copy(aes.IV, 0, combinedBytes, aes.Key.Length, aes.IV.Length);
                Array.Copy(encryptedBytes, 0, combinedBytes, aes.Key.Length + aes.IV.Length, encryptedBytes.Length);

                // Convert the result to a base64-encoded string
                encryptedString = Convert.ToBase64String(combinedBytes);
                Console.WriteLine(encryptedString);
            }

        {
            // Convert the base64-encoded string to a byte array
            var encryptedBytes = Convert.FromBase64String(encryptedString);
            // Extract the key and IV from the byte array
            var key = new byte[32];
            var iv = new byte[16];
            Array.Copy(encryptedBytes, 0, key, 0, key.Length);
            Array.Copy(encryptedBytes, key.Length, iv, 0, iv.Length);

            // Create an AES encryption algorithm instance and set its key and IV
            using (var aes = Aes.Create())
            {
                aes.Key = key;
                aes.IV = iv;

                // Decrypt the remaining bytes in the array
                var decryptedBytes = new byte[encryptedBytes.Length - key.Length - iv.Length];
                using (var decryptor = aes.CreateDecryptor())
                using (var memoryStream = new MemoryStream(encryptedBytes, key.Length + iv.Length, decryptedBytes.Length))
                using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                {
                    cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length);
                }
                // Convert the decrypted byte array to a string and deserialize the JSON object
                var jsonString = Encoding.UTF8.GetString(decryptedBytes);
                System.Console.WriteLine(jsonString);
                var json = JsonConvert.DeserializeObject(jsonString);
                Console.WriteLine(json);
            }
        }
    }
}

}

OUTPUT

1xjfMTczKpZQIsBQ8nmlxdc4K9dX/07hV1zCiiXqny43jxYMWYAjkU/lfoD5DMav6RC1bJBU9mLDrPXiI7ruMnUXn5zhPC6HebsQNDuHx+8EpKrU2bpaDjeJZ0vCTQRL7EQ1tv/b1U7refFcP2u1nw==
{"name":"Alice","age":30,"email":"alice@example.

Unhandled exception. Newtonsoft.Json.JsonReaderException: Unterminated string. Expected delimiter: ". Path 'email', line 1, position 64. at Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char quote) at Newtonsoft.Json.JsonTextReader.ParseValue() at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateJObject(JsonReader reader) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value) at Test.Test.Run() in /home/user/Documentos/C#/project/Test.cs:line 81 at Project.Program.Main(String[] args) in /home/user/Documentos/C#/project/Program.cs:line 14

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Thomas Caio
  • 83
  • 1
  • 1
  • 11
  • 2
    What's the return value of `cryptoStream.Read(...)`? A stream may deliver less bytes than requested; then you have to loop until all data is read. – Klaus Gütter Feb 26 '23 at 16:22
  • @Topaco Yes. Thanks bro. For some reason, cryptoStream was the last 5 characters. But "new StreamReader(cryptoStream).ReadToEnd()" read it entirely. – Thomas Caio Feb 26 '23 at 16:48
  • @KlausGütter Was returning "{"name":"Alice","age":30,"email":"alice@example.". – Thomas Caio Feb 26 '23 at 16:49
  • 1
    I meant: if you write `var bytesRead = cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length);` - what is the value of `bytesRead`? – Klaus Gütter Feb 26 '23 at 18:20
  • @KlausGütter 48 – Thomas Caio Feb 26 '23 at 18:25
  • 1
    This is probably less than `decryptedBytes.Length`, or? As said before, Read is free to read only part of the requested bytes. You then have to continue reading. Or use ReadToEnd as you aleady found out. – Klaus Gütter Feb 26 '23 at 18:29

0 Answers0