简体   繁体   中英

Asp.net core 3.1 decrypting CryptoStream getting “The input data is not a complete block”

I am trying encryption and decryption in asp.net core 3.1 using this blog post. https://tudip.com/blog-post/how-to-securely-transfer-web-api-data-in-asp-net-core/

Where it shows how to encrypt & decrypt every request and response using middleware

JSON string I am trying to encrypt is = "{"pageViews":37,"subscriberCount":2}"

private static Aes GetEncryptionAlgorithm()
    {
        Aes aes = Aes.Create();
        aes.Key = Convert.FromBase64String("73kczzrPtnn5GXxQtOI6m4AewK34F4IkT/yaeYZxr+M=");
        aes.IV = Convert.FromBase64String("b8LAfmzY8WxGNrZeTye4hw==");
        return aes;
    }

private static CryptoStream EncryptStream(Stream responseStream)
    {
        Aes aes = GetEncryptionAlgorithm();
        CryptoStream base64EncodedStream = new CryptoStream(responseStream, new ToBase64Transform(), CryptoStreamMode.Write);
        CryptoStream cryptoStream = new CryptoStream(base64EncodedStream, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write);
        return cryptoStream;
    }

string responseBody = new StreamReader(memStream).ReadToEnd();

responseBody = "ueArUlJZD2e+KaC6I/fvp1GdG0lXAVWIXJ0MPkG9"; //Encrypted string.

//Trying to decrypt

private static Stream DecryptStream(Stream cipherStream)
    {
        Aes aes = GetEncryptionAlgorithm();
        CryptoStream base64DecodedStream = new CryptoStream(cipherStream, new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces), CryptoStreamMode.Read);
        CryptoStream decryptedStream = new CryptoStream(base64DecodedStream, aes.CreateDecryptor(aes.Key, aes.IV), CryptoStreamMode.Read);
        return decryptedStream;
    }

static async Task Main(string[] args)
    {
        string text2 = "ueArUlJZD2e+KaC6I/fvp1GdG0lXAVWIXJ0MPkG9";
        MemoryStream ms = new MemoryStream();
        var streamWriter = new StreamWriter(ms);
        await streamWriter.WriteAsync(text2);
        streamWriter.Flush();
        ms.Position = 0;
        var decypted = DecryptStream(ms);
        StreamReader reader = new StreamReader(decypted);
        string text = await reader.ReadToEndAsync();

        Console.ReadLine();
    }

//Getting exception at reader.ReadToEndAsync() "The input data is not a complete block"

One more issue is there at client side I am receiving encrypted string shorter.

var httpResponseMessage = await httpclient.SendAsync(request, cancellationToken);
        var test = await httpResponseMessage.Content.ReadAsStreamAsync();
        StreamReader reader = new StreamReader(test);
        string text = reader.ReadToEnd(); // encrypted response "ueArUlJZD2e+KaC6I/fvp1GdG0lXAVWIXJ0M"

Encrypted data received at client side is shorter than server encrypted string.

encrypted string server side = "ueArUlJZD2e+KaC6I/fvp1GdG0lXAVWIXJ0MPkG9"; encrypted string client side = "ueArUlJZD2e+KaC6I/fvp1GdG0lXAVWIXJ0M"'

在 CryptoStream 对象上调用 Write 方法后,您必须始终调用 DisposeAsync。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM