Rabu, 19 Maret 2014

Beta rc4

Ini adalah library .net 4.0 rc4 (beta) krn belum di tes pakai. Pastikan semua byte array hasil dari UTF8.getbytes dan UTF8.getstring.
Menurut penuturan berapa ahli enkrip, algo rc4 sebelum diisi harus diberi banyak byte pada awal byte yang akan dienkripsi agar susah di crack.
class RC4
{
 // stel sendiri: 127, 255, 511
 private int keyLen = 127; 

 // xor
 private byte[] xorBytes(byte[] bytes1, byte[] bytes2)
 {
  for (int i = 0; i < bytes2.Length; i++)
   bytes2[i] ^= bytes1[i];
  return bytes2;
 }

 private byte[] createKeys(byte[] key, byte[] salt)
 {
  // cek inputan
  if (key.Length == 0 || salt.Length == 0) return null;

  // gen key
  byte[] _key = this.xorBytes(key, salt);

  // string ascii untuk dapatkan panjang key
  char[] _keyChar = new char[Encoding.ASCII.GetCharCount(_key, 0, _key.Length)];
  Encoding.ASCII.GetChars(_key, 0, _key.Length, _keyChar, 0);
  string _keyString = new string(_keyChar);
  long _keyLen = _keyString.Length, _index = 0;

  byte[] _box = new byte[this.keyLen];

  try
  {
   for (long _counter = 0; _counter < this.keyLen; _counter++) _box[_counter] = (byte)_counter;
   for (long _counter = 0; _counter < this.keyLen; _counter++)
   {
    _index = (_index + _box[_counter] + _keyChar[_counter % _keyLen]) % this.keyLen;
    byte _temp = _box[_counter];
    _box[_counter] = _box[_index];
    _box[_index] = _temp;
   }
  }
  catch { _box = new byte[0]; }
  finally
  {
   // clear semua
   _key = null;
   _keyChar = null;
   _keyString = null;
   _keyLen = _index = 0;
  }
  return _box;
 }

 public byte[] EncDec(byte[] input, byte[] key, byte[] salt)
 {
  // cek inputan
  if (input.Length == 0 || key.Length == 0 || salt.Length == 0) return new byte[0];

  // cloning bytes salt dan key
  byte[] _key = new byte[key.Length];
  byte[] _salt = new byte[salt.Length];
  key.CopyTo(_key, 0);
  salt.CopyTo(_salt, 0);

  // buat key sebenarnya
  byte[] _keyBox = this.createKeys(_key, _salt);
  if (_keyBox==null) return new byte[0];

  // temp
  long _sLen = input.Length + 1, _x = 0, _y = 0;
  byte _temp, _aIn, _bIn;
  byte[] _out = new byte[input.Length];

  // algo rc4 dsni
  try
  {
   for (long _o = 0, _l = input.Length; _o < _l; _o++)
   {
    _x = (_x + 1) % this.keyLen;
    _y = (_y + _keyBox[_x]) % this.keyLen;
    _temp = _keyBox[_x];
    _keyBox[_x] = _keyBox[_y];
    _keyBox[_y] = _temp;
    _aIn = input[_o];
    _bIn = _keyBox[(_keyBox[_x] + _keyBox[_y]) % this.keyLen];
    _out[_o] = (byte)((int)_aIn ^ (int)_bIn);
   }
  }
  catch { _out = new byte[0]; }
  finally
  {
   // clear semua
   _key = _salt =_keyBox = null;
   _temp = 0; 
   _sLen = _x = _y = 0;
   _aIn =_bIn = 0;
  }
  return _out;
 }
}

cara menggunakannya seperti ini:
  string pesan = "hello saya adalah pesan";
  byte[] kunci = Utf8.utf8Encoding.getBytes("kuncinya");
  byte[] garam = Utf8.utf8encoding.getBytes("garamnya");
  RC4 _rc4 = new RC4();
  byte[] enPesan = _rc4.EncDec(Utf8.utf8encoding.getBytes(pesan), kunci, garam);

enPesan bertipe byte array memiliki nilai yg sudah terenkripsi. cara mendekrip :
  string diterima = Utf8.utf8enconding.GetString( 
    _rc4.EncDec(enPesan, kunci, garam)
  );

variable diterima sudah memiliki nilai yg sama dengan pesan.

Tidak ada komentar:

Posting Komentar

Jika ada kritik dan saran, komentari Artikel ini.