Monday, 27 December 2010

Cryptography Sederhana (3)


"aBcDvWxYz = Saya Gamer dan Programmer!"


Tulisan ini merupakan lanjutan dari:
Cryptography Sederhana (1)
Cryptography Sederhana (2)

Waktunya proteksi si 'Dia'. Ok, berikut ini kode yang akan meminta user memasukkan angka lalu disimpannya :


/*
Source Code ini adalah bahan/materi
yang berasal dari blog:

http://membuatgamedengancpp.blogspot.com/

*/
#include <stdio.h>
#include <conio.h>
#include <string>
#include <fstream>
#include <sstream>
#include <cstdlib>

int main(){
    int angka=0;
    printf("Masukkan Angka = ");
    scanf("%d",&angka);

    std::stringstream angkaPalsu;
    angkaPalsu << angka;
    std::string samarkan;
    samarkan = angkaPalsu.str();

    for( int c=0;c < samarkan.length();c++){
        samarkan[c]+= (10 + c);
    }

    printf("\n\nAngka Asli = %d\n",angka);
    printf("Angka disamarkan = %s\n"
            "Dan telah disimpan\n\n",samarkan.c_str());

    std::ofstream saveAngka("data.hs");
    saveAngka << samarkan;
    saveAngka.close();

    system("pause");
    return 0;
}

//- krofz

Format yang disimpan adalah .hs, yang tidak lain adalah file teks biasa. Sebelum angka yang dimasukkan user disimpan ke dalam file, terlebih dahulu kita enkripsikan. Berbeda dengan cipher sebelumnya yang hanya menambahkan 1 poin, disini yang ditambahkan berjumlah 10 + c. Yang dimana nilai c ini berubah sesuai panjangnya karakter. Contoh jika kita masukkan nilai 2500, maka bilangan 2500 ini dikonversi terlebih dulu kedalam bentuk string yang berarti ada 4 karakter, yaitu '2','5','0', dan '0'. Baru setelah ini dienkripsi dengan menambahkan urutan karakter (lihat Cryptography Sederhana (2)), sehingga 2500 menjadi <@<=. Atau terlihat seperti gambar berikut:

Gambar 1. Angka 2500 ditambah 10 + c.

Setelah save game pasti ada load game atau continue. Berikut kode load game-nya:


/*
Source Code ini adalah bahan/materi
yang berasal dari blog:

http://membuatgamedengancpp.blogspot.com/

*/
#include <stdio.h>
#include <string>
#include <fstream>
#include <sstream>
#include <cstdlib>

int main(){

    //jika file tidak ada maka angkanya adalah 0
    int angkaNya = 0;
    std::ifstream getAngka("data.hs");

    if( getAngka != NULL){
        //strAngka = string angka
        std::string strAngka = "2500";
        getAngka >> strAngka;

        bool error = false;
        for( int c=0;c < strAngka.length();c++){
            strAngka[c] -= (10 + c);

            //jika saat deskripsi yang didapat bukan angka 0-9
            //intinya harus mikir 2 kali kalau mau nge-hack ;)
            if( strAngka[c] < '0' || strAngka[c] > '9'){
                error = true;
                break;
            }
        }

        if( error){
            printf("Maaf, angka yang diproses gagal\n\n");
        }
        else{
            //strToAngka = String ke angka
            std::stringstream strToAngka;
            strToAngka << strAngka.c_str();
            strToAngka >> angkaNya;
            printf("Angka = %d\n\n",angkaNya);
        }
    }
    else{
        printf("Maaf, file tidak ditemukan\n\n");
    }

    getAngka.close();

    system("pause");
    return 0;
}

Algoritmanya adalah kebalikan dari sebelumnya, jika sebelumnya ditambahkan sekarang dikurangi. Hanya tinggal mengganti operan yang digunakan hehe . Karena file ini dapat diutak-atik dengan notepad, sehingga rentan sekali untuk diganti menjadi huruf atau karakter lainnya. Jika saat di deskripsi atau dikonversi ke angka terjadi kesalahan karena hasilnya bukan karakter angka (0-9). Maka dapat dipastikan 99% file ini telah dihack! dengan gagal hahahaha , 1%-nya adalah kesalahan program, penulisan file yang gagal, file korup di Harddisk, virus, dsb (buset 1% dengan banyak kemungkinan).

Semua Source Code dan Program diatas (atau kode sebelumnya) dapat di download melalui link ini. Jika anda masih bingung dengan kode-kode aneh diatas silahkan lihat artikel-artikel sebelumnya .

- krofz

Friday, 24 December 2010

Cryptography Sederhana (2)


"aBCD eFGHi = Saya Programmer!"


Tulisan ini merupakan lanjutan dari:
Cryptography Sederhana (1)

Melanjutkan bahasan sebelumnya, mari kita coba dengan kode sederhana berikut ini:


/*
Source Code ini adalah bahan/materi
yang berasal dari blog:

http://membuatgamedengancpp.blogspot.com/

*/
#include <stdio.h>
#include <conio.h>
#include <string>
#include <cstdlib>

int main(){
    std::string kalimat, ciphertext;

    printf("Masukkan 10 karakter = ");
    for(int c=0;c < 10;c++){
        kalimat+=getche();
        ciphertext+= (kalimat[c]+1);
    }
 
    printf("\n\nKalimat Asli = %s\n",kalimat.c_str());
    printf("Kalimat disamarkan = %s\n\n",ciphertext.c_str());

    system("pause");
    return 0;
}

//- krofz

Program diatas akan meminta user memasukkan 10 karakter baik huruf (a-z / A-Z), angka (0-9), spasi, atau karakter spesial (!,?,#,dst). Disini kita menggunakan fungsi 'getche()' sebagai fungsi inputnya. Kenapa tidak menggunakan cin, scanf(), gets(), atau semacamnya? Karena hanya untuk berkreasi hehehe . Tidak, tidak.. bukan itu alasannya. Pertama, fungsi cin tidak dapat begitu saja memperoleh karakter spasi alias akan error jika ada spasi. Kedua, begitu pula dengan scanf() yang hampir sama dengan cin. Ketiga, gets() memang dapat memperoleh karakter spasi tetapi selama aku berekperimen selalu error jika karakter yang dimasukkan lebih dari 18 karakter (nggak tau angka pastinya). Dan sampai saat ini ketiga masalah tersebut belum aku selesaikan jika user memasukkan karakter spasi. Kalau memang masalahnya adalah spasi maka kasih peringatan saja kalau program bakal error jika diinput spasi <- Kurang bijak . Atau batasi saja tombol yang akan dimasukkan dengan melakukan pengecualian pada karakter spasi <- Kagak tau caranya .

Bagaimana dengan getche()? Coba jalankan dan ketik apa saja (termasuk juga karakter spasi) selama tak lebih dari 10. Dan semua terlihat seperti tidak ada masalah (bukan?). Tapi walau bagaimanapun segala sesuatunya tidak ada yang sempurna, coba saja tekan Esc, Backspace, atau Enter, dan wussh.... programnya jadi error (~_~). Tapi sebelum masalah menjadi panjang, kita kembali lagi ke masalah utama terlebih dahulu yaitu bagaimana kita menyamarkan informasi. Jalankan program dan coba ketikan kalimat atau seperti gambar berikut:

Gambar 1. Kamu pasti bisa!

Dapat dilihat bahwa setelah huruf S (s besar) iyalah huruf T (t besar), sesuai dengan cipher atau metode penyamaran yang digunakan. Lalu bagaimana dengan karakter spasi? Menjadi apakah dia? Ia menjadi karakter selanjutnya sesuai dengan urutan karakter ASCII:

Gambar 2. ASCII chart (sumber: Search Engine yang mencari dari Internet yang amat sangat luas dan sedikit modifikasi).

Urutan spasi pada gambar adalah pada nomor 32, yang dilanjutkan dengan karakter tanda seru ('!') nomor 33. Begitu pula dengan angka 9 bukan menjadi 0, z menjadi a atau Z menjadi A, karena cipher yang digunakan menambahkan 1 poin/tingkat sesuai standar karakter ASCII tersebut. Disini kita baru meminta user memasukkan kalimat lalu menampilkan ciphertext-nya. Lalu dimana proteksi untuk sih 'nilai.hs'-nya!!! Harusnya anda sudah dapat membuatnya ;). Tapi jangan khawatir selanjutnya kita akan proteksi dia.

- krofz
 

back to top

back to top