.NET(C#):靈活運用CryptoStream,加密不是必須用CryptoStreamMode.Write

來源:互聯網
上載者:User

首先.NET中的ICryptoTransform是單向的,也就是只能從一個狀態將資料轉化成另一個狀態,反之是不可以的。當然手動操作ICryptoTransform還是比較繁瑣的,通過CryptoStream可以更輕鬆地操作一個ICryptoTransform。由於ICryptoTransform是單向的,所以加密解密這兩個過程就需要兩個ICryptoTransform,這個通過SymmetricAlgorithm類的CreateEncryptor和CreateDecryptor方法來建立。而用CryptoStream操作這兩個ICryptoTransform時,往往加密就是用CryptoStreamMode.Write,解密則用Read,這個從名稱上也是合情合理的,但是其實CryptoStream的操作模式不是局限於這樣的。

 

關於ICryptoTransform和CryptoStream的關係模式,可以看這個圖:

 

其實所謂的Read和Write僅僅是把ICryptoTransform操作的兩個資料狀態換了個位置,最終操作仍然是將ICryptoTransform的來源資料轉換成目標資料(單向),只不過不同的模式操作不一樣。

比如我們先使用CryptoStreamMode.Write來加密:

//+ using System.IO;

//+ using System.Security.Cryptography;

static void Main()

{

    using (var aes = Aes.Create())

    {

        var data = Encoding.Unicode.GetBytes("Mgen!");

        Console.WriteLine(BitConverter.ToString(Encrypt_Write(aes.CreateEncryptor(), data).ToArray()));

    }

}

 

static MemoryStream Encrypt_Write(ICryptoTransform ict, byte[] data)

{

    using (var ms = new MemoryStream())

    using (var cstream = new CryptoStream(ms, ict, CryptoStreamMode.Write))

    {

        cstream.Write(data, 0, data.Length);

        return ms;

    }

}

 

用CryptoStreamMode.Read也可以完成加密:

//+ using System.IO;

//+ using System.Security.Cryptography;

static void Main()

{

    using (var aes = Aes.Create())

    {

        var data = Encoding.Unicode.GetBytes("Mgen!");

        Console.WriteLine(BitConverter.ToString(Encrypt_Read(aes.CreateEncryptor(), data).ToArray()));

    }

}

 

static MemoryStream Encrypt_Read(ICryptoTransform ict, byte[] data)

{

    using (var ms = new MemoryStream(data))

    using (var cstream = new CryptoStream(ms, ict, CryptoStreamMode.Read))

    using (var destMs = new MemoryStream())

    {

        byte[] buffer = new byte[100];

        int readLen;

 

        while ((readLen = cstream.Read(buffer, 0, 100)) > 0)

            destMs.Write(buffer, 0, readLen);

        return destMs;

    }

}

 

兩者都會成功加密資料,並輸入:

DB-76-CA-5F-62-2C-59-C1-91-48-79-9F-10-B9-8E-2D

上面只講了加密,解密也是完全一樣的,CryptoStreamMode.Write或Read都可以解密!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.