출처1 : https://github.com/MiloszKrajewski/lz4net

출처2 : https://www.nuget.org/packages/lz4net/


dotnet_remote_20171113.7z

Advanced .NET Remoting.pdf


PM> Install-Package lz4net -Version 1.0.15.93


.Net Remoting 환경일 때 Custom Sink 를 사용하여 암호화와 압축을 진행하는 방법이다. 

사용한 책과 소스를 첨부한다. 


압축에 관하여서는 몇 가지 테스트 해보았지만 Lz4 를 사용하는게 가장 적절했던 것 같다. (속도가 빠르다.)


아래는 암호화와 압축을 동시에 스트림에 적용하는 클래스이다. 


 public class EncryptionLz4Helper

{

    public static Stream ProcessOutboundStream(Stream inStream, String algorithm, byte[] encryptionkey, out byte[] encryptionIV)

    {

        //// 암호화 -> 압축

        SymmetricAlgorithm alg = SymmetricAlgorithm.Create(algorithm);

        alg.Key = encryptionkey;

        alg.GenerateIV();

        encryptionIV = alg.IV;

        MemoryStream msEncrypt = new MemoryStream();

        var rijndael = new RijndaelManaged();

        int tot = 0;

        byte[] buf = new Byte[1000];

        ICryptoTransform encryptor = rijndael.CreateEncryptor(encryptionkey, encryptionIV);

        CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

        using (LZ4Stream zip = new LZ4Stream(csEncrypt, LZ4StreamMode.Compress, LZ4StreamFlags.IsolateInnerStream))

        {

            int cnt = inStream.Read(buf, 0, 1000);

            while (cnt > 0)

            {

                tot += cnt;

                zip.Write(buf, 0, cnt);

                cnt = inStream.Read(buf, 0, 1000);

            }

        }

        csEncrypt.FlushFinalBlock();

        msEncrypt.Seek(0, SeekOrigin.Begin);

        return msEncrypt;

    }

 

    public static Stream ProcessInboundStream(Stream inStream, String algorithm, byte[] encryptionkey, byte[] encryptionIV)

    {

        //// 복호화 -> 압축풀기

        int cnt;

        byte[] buf = new Byte[1000];

        MemoryStream msDecrypt = new MemoryStream();

        var rijndael = new RijndaelManaged();

        using (ICryptoTransform decryptor = rijndael.CreateDecryptor(encryptionkey, encryptionIV))

        using (CryptoStream csDecrypt = new CryptoStream(inStream, decryptor, CryptoStreamMode.Read))

        using (LZ4Stream zip = new LZ4Stream(csDecrypt, LZ4StreamMode.Decompress))

        {

            cnt = zip.Read(buf, 0, 1000);

            while (cnt > 0)

            {

                msDecrypt.Write(buf, 0, cnt);

                cnt = zip.Read(buf, 0, 1000);

            }

            msDecrypt.Flush();

            msDecrypt.Seek(0, SeekOrigin.Begin);

        }

        msDecrypt.Seek(0, SeekOrigin.Begin);

        return msDecrypt;

    }

}





Posted by motolies
,