Csharp/C Sharp/Development Class/ICryptoStream — различия между версиями

Материал из .Net Framework эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Текущая версия на 11:43, 26 мая 2010

Decrypting data.

 

using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
public class StoreCryptoStream : ICryptoStream {
    static byte[] tag1 = {(byte)"[",(byte)"S",(byte)"a",(byte)"u" ,(byte)"d" ,(byte)"e",(byte)"s" ,(byte)"]"};
    static byte[] tag2 = {(byte)"[",(byte)"S",(byte)"a",(byte)"u" ,(byte)"r" ,(byte)"c",(byte)"2" ,(byte)"]"};
    FileStream fs;
    public StoreCryptoStream(FileStream fout) {
        fs = fout;
    }
    public virtual void CloseStream() { fs.Close(); }
    public virtual void CloseStream(Object obj) { fs.Close(); }
    public virtual void SetSink(ICryptoStream pstm) { }
    public virtual void SetSource(CryptographicObject co) { }
    public virtual ICryptoStream GetSink() { return null; }
    public virtual void Write(byte[] bin) {
        int len = bin.GetLength(0);
        Write(bin, 0, len);
    }
    public virtual void Write(byte[] bin, int start, int len) {
        fs.Write(bin, start, len);
    }
}
public class MainClass {
    static byte[] symKey;
    static byte[] symIV;
    private static bool GenerateKey(string password) {
            int len;
            char[] cp = password.ToCharArray();
            len = cp.GetLength(0);
            byte[] bt = new byte[len];
            for (int i = 0; i < len; i++) {
                bt[i] = (byte)cp[i];
            }
            symKey = new byte[8];
            symIV = new byte[8];
            SHA1_CSP sha = new SHA1_CSP();
            sha.Write(bt);
            sha.CloseStream();
            for (int i = 0; i < 8; i++) {
                symKey[i] = sha.Hash[i];
            }
            for (int i = 8; i < 16; i++) {
                symIV[i - 8] = sha.Hash[i];
            }
            return true;
    }
    private static void DecryptData(string infile, string outfile) {
            FileStream fin = new FileStream(infile, FileMode.Open, FileAccess.Read);
            FileStream fout = new FileStream(outfile, FileMode.OpenOrCreate, FileAccess.Write);
            fout.SetLength(0);
            byte[] bin = new byte[4096];
            long totlen = fin.Length;
            long rdlen = 8;
            int len;
            SymmetricAlgorithm des = new DES_CSP();
            StoreCryptoStream scs = new StoreCryptoStream(fout);
            SymmetricStreamDecryptor ssd = des.CreateDecryptor(symKey, symIV);
            ssd.SetSink(scs);
            scs.SetSource(ssd);
            while (rdlen < totlen) {
                len = fin.Read(bin, 0, 4096);
                ssd.Write(bin, 0, len);
                rdlen = rdlen + len;
            }
            ssd.CloseStream();
            fin.Close();
            fout.Close();
    }
    public static void Main(string[] args) {
        GenerateKey(args[0]);
        DecryptData(args[1], args[2]);
    }
}


Encrypting data.

 

using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
public class StoreCryptoStream : ICryptoStream {
    static byte[] tag1 = {(byte)"[",(byte)"S",(byte)"a",(byte)"u" ,
        (byte)"d" ,(byte)"e",(byte)"s" ,(byte)"]"};
    static byte[] tag2 = {(byte)"[",(byte)"S",(byte)"a",(byte)"u" ,
        (byte)"r" ,(byte)"c",(byte)"2" ,(byte)"]"};
    FileStream fs;
    public StoreCryptoStream(FileStream fout) {
        fs = fout;
    }
    public virtual void CloseStream() { fs.Close(); }
    public virtual void CloseStream(Object obj) { fs.Close(); }
    public virtual void SetSink(ICryptoStream pstm) { }
    public virtual void SetSource(CryptographicObject co) { }
    public virtual ICryptoStream GetSink() { return null; }
    public virtual void Write(byte[] bin) {
        int len = bin.GetLength(0);
        Write(bin, 0, len);
    }
    public virtual void Write(byte[] bin, int start, int len) {
        fs.Write(bin, start, len);
    }
}
public class MainClass {
    static byte[] symKey;
    static byte[] symIV;
    private static bool GenerateKey(string password) {
        try {
            int len;
            char[] cp = password.ToCharArray();
            len = cp.GetLength(0);
            byte[] bt = new byte[len];
            for (int i = 0; i < len; i++) {
                bt[i] = (byte)cp[i];
            }
            symKey = new byte[8];
            symIV = new byte[8];
            SHA1_CSP sha = new SHA1_CSP();
            sha.Write(bt);
            sha.CloseStream();
            for (int i = 0; i < 8; i++) {
                symKey[i] = sha.Hash[i];
            }
            for (int i = 8; i < 16; i++) {
                symIV[i - 8] = sha.Hash[i];
            }
            return true;
        } catch (Exception e) {
            Console.WriteLine("An Exception Occurred in Generating eys:"
                + e.ToString());
            return false;
        }
    }
    private static void EncryptData(string infile, string outfile) {
        try {
            FileStream fin = new FileStream(infile, FileMode.Open, FileAccess.Read);
            FileStream fout = new FileStream(outfile, FileMode.OpenOrCreate, FileAccess.Write);
            fout.SetLength(0);
            byte[] bin = new byte[4096];
            long totlen = fin.Length;
            long rdlen = 0;
            int len;
            SymmetricAlgorithm des = new DES_CSP();
            StoreCryptoStream scs = new StoreCryptoStream(fout);
            SymmetricStreamEncryptor sse = des.CreateEncryptor(symKey, symIV);
            SHA1_CSP sha = new SHA1_CSP();
            sse.SetSink(sha);
            sha.SetSource(sse);
            sha.SetSink(scs);
            scs.SetSource(sha);
            while (rdlen < totlen) {
                len = fin.Read(bin, 0, 4096);
                sse.Write(bin, 0, len);
                rdlen = rdlen + len;
            }
            sse.CloseStream();
            fin.Close();
            fout.Close();
        } catch (Exception e) {
            Console.WriteLine("An exception occurred while encrypting :"
                 + e.ToString());
        }
    }
    public static void Main(string[] args) {
        GenerateKey(args[0]);
        EncryptData(args[1], args[2]);
    }
}