Saturday, May 30, 2009

Encrypting data from one stream to another and attaching hash of the password

using System.Security.Cryptography;
using System.IO;
using System.Data;
using System;
using System.Collections;
using System.ComponentModel;

public class PasswordEncryptor
{
private byte[] _keyBytes;
private byte[] _IVBytes;
private int _bufferSize=256;
private byte[] _hash;

public PasswordEncryptor(string password)
{
byte[] saltValueBytes = null;
PasswordDeriveBytes pdb = new PasswordDeriveBytes(password,saltValueBytes,"SHA1",50);
_keyBytes = pdb.GetBytes(32);
_IVBytes = pdb.GetBytes(16);

HashAlgorithm hasher = SHA256.Create();
_hash = hasher.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes("password"));
}

public void EncryptWithHash(Stream input, ref Stream output)
{
output.Write(_hash,0,_hash.Length);

RijndaelManaged rj = new System.Security.Cryptography.RijndaelManaged();
rj.Mode= CipherMode.CBC;

ICryptoTransform trans = rj.CreateEncryptor(_keyBytes, _IVBytes);

CryptoStream cs = new CryptoStream(output, trans, CryptoStreamMode.Write);

byte[] bytes = new byte[_bufferSize];

int byteCount;

while((byteCount = input.Read(bytes, 0, bytes.Length))!= 0)
{
cs.Write(bytes,0,byteCount);
}

cs.FlushFinalBlock();
//cs.Close();
}

public void DecryptWithHash(Stream input, ref Stream output)
{
byte[] inputHash = new byte[_hash.Length];
input.Read(inputHash,0,_hash.Length);

if (inputHash.Length!=_hash.Length) throw new Exception("Invalid Password");

for (int i=0;i<_hash.Length;i++)
{
if (_hash[i]!=inputHash[i]) throw new Exception("Invalid Password");
}

RijndaelManaged rj = new System.Security.Cryptography.RijndaelManaged();
rj.Mode= CipherMode.CBC;

ICryptoTransform trans = rj.CreateDecryptor(_keyBytes, _IVBytes);

CryptoStream cs = new CryptoStream(input, trans, CryptoStreamMode.Read);

byte[] bytes = new byte[_bufferSize];

int byteCount;

while((byteCount = cs.Read(bytes, 0, bytes.Length))!= 0)
{
output.Write(bytes,0,byteCount);
}

cs.Flush();
}

}

2 comments:

  1. The information you have posted is very useful. The sites you have referred was good. Thanks for sharing...
    澳洲cs代写

    ReplyDelete
  2. I love the way you write and share your niche! Very interesting and different! Keep it coming!
    java代写

    ReplyDelete