출처1 : https://github.com/MiloszKrajewski/lz4net
출처2 : https://www.nuget.org/packages/lz4net/
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;
}
}