Enkripsi adalah adalah proses mengamankan suatu informasi dengan membuat informasi tersebut tidak dapat dibaca tanpa bantuan pengetahuan khusus. Salah satu tujuannya adalah untuk mengamankan data. Lalu bagaimana kita menerapkannya di dalam Game Maker:Studio ?
Postingan kali ini adalah tentang teknik atau cara yang bisa dilakukan untuk mengenkripsi data (text, maupun file) yang dapat dilakukan dengan Game Maker:Studio mulai dari yang mudah hingga yang sulit.
Di sini saya akan menggunakan Resource Script yaitu scr_enkrip dan scr_dekrip untuk mempermudah menerapkan teknik enkripsi ini di beberapa Object.
Dan berikut adalah beberapa macam teknik enkripsi beserta penjelasan dan cara penggunaannya.
Caesar Cipher
Caesar Cipher merupakan salah satu algoritma cipher tertua dan paling diketahui dalam perkembangan ilmu kriptografi. Caesar cipher merupakan salah satu jenis cipher substitusi yang membentuk cipher dengan cara melakukan penukaran (pergeseran) karakter pada plainteks. Misalnya huruf A menjadi D, huruf B menjadi E, huruf C menjadi F dan seterusnya.
A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|
D | E | F | G | H | I | J | K | L | M | N | O | P |
N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
Q | R | S | T | U | V | W | X | Y | Z | A | B | C |
Untuk implementasinya di dalam Game Maker:Studio adalah sebagai berikut.
scr_enkrip
/*=====================================================
scr_enkrip(string, key);
-------------------------------------------------------
Enkripsi Caesar Cipher. Hanya mendukung charakter
64 s/d 90 (A s/d Z).
Contoh: show_message(scr_enkrip('MUHARIF', 13));
=====================================================*/
var _res = '';
var _min = 65;
var _max = 91;
for(i=1;i<=string_length(argument[0]);i++){
_chr = ord(string_char_at(argument[0], i));
if(_chr >= _min && _chr <= _max){
_byte = ((_chr - _min ) + argument[1]) mod 26;
_res += chr(_byte + _min);
}
}
return _res;
Contoh penggunaannya adalah sebagai berikut.
Create
plain = 'ROTASITIGABELAS';
enkrip = scr_enkrip(plain, 13);
show_message(enkrip);
scr_dekrip
/*=====================================================
scr_dekrip(string, key);
-------------------------------------------------------
Mengembalikan (dekripsi) ke plain teks.
Contoh: scr_dekrip('HQNULSVL', 3);
=====================================================*/
var _res = '';
var _min = 65;
for(i=1;i<=string_length(argument[0]);i++){
_byte = ord(string_char_at(argument[0], i));
_chr = ((((_byte - _min) - argument[1]) + 26) mod 26);
_res += chr(_chr + _min);
}
return _res;
Contoh penggunaannya adalah sebagai berikut.
Create
enkrip = 'EBGNFVGVTNORYNF';
plain = scr_dekrip(enkrip, 13);
show_message(plain);
Vigènere Cipher
Teknik enkripsi jenis ini sangat dikenal karena mudah dipahami dan diimplementasikan. Teknik untuk menghasilkan ciphertext yang bisa dilakukan menggunakan substitusi angka atau menukarkan huruf dengan angka tertentu. Misalnya huruf A menjadi 0, huruf B menjadi 1, huruf C menjadi 2 dan seterusnya. Kemudian teks hasil subtitusi dujumlahkan dengan key (kunci) berupa teks yang juga sudah disubtitusi. Dan hasilnya diubah lagi ke bentuk teks dan kita mendapatkan chippertext.
A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
Contoh kasus mengenkripsikan 'MUHARIF' dengan kunci 'HANIF'.
PLAIN | 12 | 20 | 7 | 0 | 17 | 8 | 5 |
---|---|---|---|---|---|---|---|
KEY | 7 | 0 | 13 | 8 | 5 | 7 | 0 |
HASIL | 19 | 20 | 20 | 8 | 22 | 15 | 5 |
CHIPPER | T | U | U | I | Y | P | F |
Untuk implementasinya di dalam Game Maker:Studio adalah sebagai berikut.
scr_enkrip
/*=====================================================
scr_enkrip(string, key);
-------------------------------------------------------
Enkripsi Vigènere Cipher. Hanya mendukung charakter
64 s/d 90 (A s/d Z).
Contoh: show_message(scr_enkrip('MUHARIF', 'HANIF'));
=====================================================*/
var _res = '';
var _min = 65;
var _max = 91;
for(i=1;i<=string_length(argument[0]);i++){
_chr = ord(string_char_at(argument[0], i));
_key = ord(string_char_at(argument[1], i mod string_length(argument[1])));
if(_chr >= _min && _chr <= _max){
_byte = (_chr - _min ) + (_key - _min );
_res += chr(_byte + _min);
}
}
return _res;
Contoh penggunaannya adalah sebagai berikut.
Create
plain = 'MUHARIF';
enkrip = scr_enkrip(plain, 'HANIF');
show_message(enkrip);
scr_dekrip
/*=====================================================
scr_dekrip(string, key);
-------------------------------------------------------
Mengambalikan (dekripsi) ke plain teks.
Contoh: scr_dekrip('TUUIYPF', 'HANIF');
=====================================================*/
var _res = '';
var _min = 65;
for(i=1;i<=string_length(argument[0]);i++){
_byte = ord(string_char_at(argument[0], i));
_key = ord(string_char_at(argument[1], i mod string_length(argument[1])));
_chr = (_byte - _min) - (_key - _min);
_res += chr(_chr + _min);
}
return _res;
Contoh penggunaannya adalah sebagai berikut.
Create
enkrip = 'TUUIYPF';
plain = scr_dekrip(enkrip, 'HANIF');
show_message(plain);
ASCII to BINARY
Metode kali ini adalah digunakan untuk mengenkripsi file text menjadi file binary. Script ini menggunakan beberapa fungsi hash dan encoding salah satunya ds_map_write() yang mana value-nya akan berubah-ubah sesuai dengan isinya (key dan value).
Adapun proses jalannya data pada metode ini adalah sebagai berikut.
- User men-load file text yang ingin dienkripsi.
- File text tersebut dibaca per baris, masing-masing baris dimasukkan ke dalam Ds_list.
- Ds_list di-encode menggunakan fungsi ds_list_write() dan hasilnya dimasukkan ke dalam Ds_maps dengan memakai hasil hash key yang diinputkan oleh pengguna.
- Ds_maps di-encode menggunakan fungsi ds_map_write().
- Hasil teks encode Ds_maps di-looping per karakter.
- Masing-masing karakter diubah menjadi ASCII dan di-looping per karakter ASCII tersebut.
- Hasil looping ditulis menjadi file binary dan menuliskan byte NULL sehingga masing-masing karakter benilai 3 byte.
- Menambahkan 3 byte NULL sebagai penanda akhir file.
Berikut ini adalah implementasi script-nya.
scr_enkrip
/*=========================================================================
scr_enkrip(input, key, output)
===========================================================================
Write & Tested by: MUHARIF AL HANIF
Digunakan untuk mengenkripsi file text menjadi file binary dengan kunci.
argument[0] = input [file path]
argument[1] = key [string]
argument[2] = output [file path]
--------------------------------------------------------------------------*/
var _data_text = ds_list_create();
var _data_encrypt = ds_map_create();
//Membaca file teks
if(file_exists(argument[0])){
ftext = file_text_open_read(argument[0]);
char = file_text_read_string(ftext);
while(ord(char) == 0 or (ord(char) <= 255 && ord(char) >= 32)){
ds_list_add(_data_text, char);
file_text_readln(ftext);
char = file_text_read_string(ftext);
}
file_text_close(ftext);
}
else return false;
//Mengkonversi string menjadi ds_map data
ds_map_add(_data_encrypt, md5_string_unicode(argument[1]), ds_list_write(_data_text));
//Menulis file binary
fbin = file_bin_open(argument[2], 1);
file_bin_rewrite(fbin);
for(i=1;i<=string_length(ds_map_write(_data_encrypt));i++){
byte = ord(string_char_at(ds_map_write(_data_encrypt), i));
if(byte < 10){
file_bin_write_byte(fbin, 0);
file_bin_write_byte(fbin, 0);
}
else if(byte < 100){
file_bin_write_byte(fbin, 0);
}
for(j=1;j<=string_length(string(byte));j++){
dec = real(string_char_at(string(byte), j));
file_bin_write_byte(fbin, dec);
}
}
//3 byte sebagai patokan akhir data
file_bin_write_byte(fbin, 0);
file_bin_write_byte(fbin, 0);
file_bin_write_byte(fbin, 0);
file_bin_close(fbin);
ds_list_destroy(_data_text);
ds_map_destroy(_data_encrypt);
Contoh penggunaannya adalah sebagai berikut.
Create
file_to_encrypt = get_open_filename('Text File|*.txt', '');
file_encrypted = get_save_filename('Data File|*.data', '');
token = '3@5!2?A$';
if(file_to_encrypt != ""){
scr_enkrip(file_to_encrypt, token, file_encrypted );
}
return true;
scr_dekrip
/*=========================================================================
scr_dekrip(input, key, output)
===========================================================================
Write & Tested by: MUHARIF AL HANIF
Digunakan untuk mendekripsi (mengembalikan) file binary menjadi file text
dengan kunci.
argument[0] = input [file path]
argument[1] = key [string]
argument[2] = output [file path]
--------------------------------------------------------------------------*/
var _stren = '', _str = ''
var _data_encrypt = ds_map_create();
var _data_text = ds_list_create();
//Membaca file binary
if(file_exists(argument[0])){
fbin = file_bin_open(argument[0], 0);
byte = 32;
while(byte == 12 or (byte >= 32 && byte <= 255)){
temp = '';
repeat(3){
dec = file_bin_read_byte(fbin);
temp += string(dec);
}
byte = real(temp);
_stren += chr(byte);
}
file_bin_close(fbin);
}
//Mengkonversi ds_map data ke ds_map
ds_map_read(_data_encrypt, _stren);
if(ds_map_exists(_data_encrypt, md5_string_unicode(argument[1]))){
_str = _data_encrypt[? md5_string_unicode(argument[1])];
ds_list_read(_data_text, _str);
}
else return false;
ds_map_destroy(_data_encrypt);
//Menulis file terenkripsi
ftext = file_text_open_write(argument[2]);
for(i=0;i<ds_list_size(_data_text);i++){
file_text_write_string(ftext, _data_text[| i]);
if(i < ds_list_size(_data_text)-1){
file_text_writeln(ftext);
}
}
file_text_close(ftext);
ds_map_destroy(_data_text);
return true;
Contoh penggunaannya adalah sebagai berikut.
Create
file_to_decrypt = get_open_filename('Data File|*.data', '');
file_decrypted = get_save_filename('Text File|*.txt', '');
token = '3@5!2?A$';
if(file_to_decrypt != ""){
scr_dekrip(file_to_decrypt, token, file_decrypted);
}
Jika kalian masih kesulitan menerapkannya, kalian bisa mengunduh file sample (source) dengan tombol di bawah ini.
Demikianlah artikel saya kali ini, semua script di atas hanyalah hasil coba-coba dan iseng saja. Jika masih ada kesalahan baik code maupin tulisan artikel ini saya mohon maaf, kalau butuh bantuan dan saran silahkan berkomentar.