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.