Csharp/C Sharp/Development Class/ICryptoStream
Версия от 15:31, 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]);
}
}