Juli 2013 - Elang Sakti
Download Ebook Belajar Arduino PDF, Arduino untuk pemula
Jasa Pembuatan Program Arduino, pemrograman Arduino
# Hack Your Skills! to be Professional Mechatronics

Algortima dan Source Code Menentukan Bilangan Ganjil - Genap

1 komentar
Untuk menentukan suatu bilangan itu ganjil atau genap, kita bisa menggunakan fungsi matematika yang disebut modulo atau modulus. Modulo atau modulus adalah sisa hasil pembagian dalam bentuk bilangan bulat. Misalnya :
4  : 2 = 2 sisa 0; atau 2 x 2 + 0 = 4;
5  : 2 = 2 sisa 1; atau 2 x 2 + 1 = 5;
9  : 2 = 4 sisa 1; atau 2 x 4 + 1 = 9;
11 : 3 = 3 sisa 2; atau 3 x 3 + 2 = 11;
15 : 4 = 3 sisa 2; atau 4 x 3 + 2 = 15;

Nah, sisa 0, 1, 1, 2, dan 2 itu adalah modulo (sisa hasil pembagian). Dalam matematika, operasi modulo bisa dituliskan dengan cara A mod B = C, atau dalam bahasa pemrograman komputer bisa ditulis C = A % B (atau sebaliknya); dimana % adalah tanda untuk modulo.
4  mod 2 = 0; atau 4 % 2 = 0;
5  mod 2 = 1; atau 5 % 2 = 1;
9  mod 2 = 1; atau 9 % 2 = 1;
11 mod 3 = 2; atau 11% 3 = 2;
15 mod 4 = 2; atau 15% 4 = 2; 

Jadi, bilangan genap adalah bilangan yang habis dibagi 2, sedangkan bilangan ganjil adalah bilangan yang menghasilkan sisa 1 jika dibagi 2. Dengan kata lain :
if(a%2==0) genap;
if(a%2==1) ganjil;

Implementasi dalam script misalnya seperti berikut:
// pada php
<?php
for($a=1; $a<15; $a++){
 if($a%2==0){
  echo $a." bilangan genap\n";
 }else{
  echo $a." bilangan ganjil\n";
 }
}
?>

// pada java
public class tes{
 public static void main(String haripinter[]){
  for(int a=1; a<15; a++){
   if(a%2==0){
    System.out.println(a+" bilangan genap");
   }else{
    System.out.println(a+" bilangan ganjil");
   }
  }
 }
}

Written by ElangSakti
Algortima dan Source Code Menentukan Bilangan Ganjil - Genap
Bahasan: Untuk menentukan suatu bilangan itu ganjil atau genap, kita bisa menggunakan fungsi matematika yang disebut modulo atau modulus. Modulo at...
Published at Selasa, 16 Juli 2013, Updated at Selasa, 16 Juli 2013
Reviewed by dr. on
Rating: 4.7

1 komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Java ME : Algoritma Kriptografi Elliptic Curve Cryptography (ECC)

3 komentar
Dibawah ini adalah algoritma kriptografi kurva eliptik (ECC) dalam basaha java, khususnya J2ME. Pada kelas tersebut ada fungsi-fungsi yang sengaja dibuat untuk melengkapi kekurangan di J2ME, misalnya fungsi Split() untuk memecah string, sementara di J2ME fungsi untuk memecah string tidak ada. Kemudian fungsi powSqrt() sebagai fungsi perpangkatan sebagai pengganti fungsi Math.pow() yang ada juga di J2ME.
  • Fungsi isCurve() itu berguna untuk memeriksa apakah pasangan a, b, dan bilangan prima sudah sesuai dengan persamaan kurva eliptik yaitu y^2 = x^3+ax+b.
  • Funsi isPrime() untuk memeriksa apakah angka acak yang akan digunakan termasuk bilangan prima atau bukan.
  • Fungsi titik() untuk mencari titik-titik yang sesuai dengan persamaan sesua variabel a, b, dan bilangan prima yang ditentukan.
  • Fungsi arrAdd() sebagai tool agar proses penambahan array integer lebih mudah.
  • Fungsi invers() untuk mencari nilai invers dari suatu bilangan.
  • Fungsi kali() untuk implementasi aturan perkalian titik pada kurva eliptik.
  • Fungsi jumlah() untuk implementasi aturan penjumlah titik pada kurva eliptik.

Fungsi-fungsi di atas mengacu pada perhitungan pada posting sebelumnya :

import java.util.Vector;

/**
 *
 * @author x86
 */
public class Curve {

    /**
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
        
        //fungsi y^2 = x^3+ax+b
        int a = 1;
        int b = 1;
        System.out.println("Persamaan yang dipakai y^2 = x^3+x+1");
        
        //bilangan prima (random sesuai persamaan)
        int p = 193;
        System.out.println("Bilangan Prima (acak random) p="+p);
        
        //System.out.println();
        System.out.println("Anggota Himpunan di atas dengan batas atas bilangan prima "+p);
        for(int x=0; x<p; x++){
            titik(p,a,b,x);
        }
        System.out.println();
        
        // key (random sesuai persamaan)
        int k = 4;
        System.out.println("Privat key k (untuk penerima) = "+k);
        
        // titik awal (random sesuai persamaan)
        int[] P = {133,78};
        System.out.println("Titik awal kurva  P = ("+P[0]+","+P[1]+")");
        
        // key public penerima (random sesuai persamaan)
        System.out.println("Public Key k.P, dihitung dengan cara mengalikan private key k ke titik awal kurva P");
        System.out.println("k*P = "+k+"*("+P[0]+","+P[1]+")");
        int[] dP = kali(p,a,b,k,P);
        System.out.println("Jadi, Public Key k.P = ("+dP[0]+","+dP[1]+")");
        System.out.println("Catatan : Perkalian dan perhitungan titik kurva menggunakan aturan");
        System.out.println("Perkalian, penjumlahan, penggandaan, dan invers,");
        System.out.println("Jadi perkaliannya tidak sama denga perkalian matriks.");
        
        String pesan = "haripinter";
        System.out.println("Pesan yang akan di enkripsi : "+pesan);
        System.out.println();
        
        System.out.println("Proses Enkripsi :");
        System.out.println("-----------------------");
        String str = enkrip(P,dP,pesan,k,a,b,p);
        
        System.out.println();
        System.out.println("Proses Dekripsi :");
        System.out.println("-----------------------");
        String msg = dekrip(str,k,a,b,p);
    }
    
    static String enkrip(int[] P, int[] dP, String M, int k, int a, int b, int p){
        System.out.println("- Menentukan titik kkP sebagai titik pengenkripsi.");
        System.out.println("k*kP = "+k+"*"+"("+dP[0]+","+dP[1]+")");
        int[] kdP = kali(p, a, b, k, dP);
        System.out.println("Titik kkP : ("+kdP[0]+","+kdP[1]+")");
        System.out.println();
        int XkdP = kdP[0];
        
        System.out.println("- Menentukan titik Awal proses dekripsi.");
        System.out.println("k*P = "+k+"*"+" ("+P[0]+","+P[1]+")");
        int[] kP = kali(p, a, b, k, P);
        System.out.println("Titik kP : ("+kP[0]+","+kP[1]+")");
        System.out.println();
        
        String head = (char)kP[0]+"#"+(char)kP[1]+"#";
        System.out.println("Header titik kP dijadikan karakter kemudian disertakan dalam pesan (bisa jadi karakternya tidak tampak) : "+head);
        System.out.println();
        
        System.out.println("Ambil titik absis kkP untuk di-xor-kan ke pesan.");
        System.out.println(XkdP+" -> "+Integer.toBinaryString(XkdP));
        System.out.println();
        
        System.out.println("Konversi pesan ke integer sesuai format ASCII, kemudian jadikan biner. Selanjutnya di xor dengan absis titik kdP.");
        System.out.println("Setelah di xor, rangkai lagi menjadi pesan baru yang terenkripsi:");
        String MM="";
        for(int cd=0; cd<M.length(); cd++){
            System.out.print(M.charAt(cd)+" -> "+(int)M.charAt(cd)+" -> "+Integer.toBinaryString((int)M.charAt(cd)));
            int eMx = XkdP ^ M.charAt(cd);
            System.out.println(" xor "+Integer.toBinaryString(XkdP)+" => "+eMx+" ("+(char)eMx+")");
            MM = MM + (char)eMx;
        }
        System.out.println("Angka desimal pesan diatas kemudian dikembalikan menjadi karakter");
        System.out.println("Pesan Baru terenkripsi : "+MM);
        MM = head + MM;
        
        System.out.println("header + Pesan Baru terenkripsi : "+MM);
        return MM;
    }
    
    static String dekrip(String M, int d, int a, int b, int p){
        System.out.println("Pesan terenkripsi : "+M);
        System.out.println("Pisahkan header dan pesan asli. Kemudian ambil ke titik kp:");
        String msg = "";
        String[] dmp = Split(M,"#");
        
        if(dmp.length!=3) return M;
        
        // kp[0]#kp[1]
        int[] kP = {(int)dmp[0].charAt(0),(int)dmp[1].charAt(0)};
        System.out.println("Titik kP : ("+kP[0]+","+kP[1]+")");
        System.out.println();
        System.out.println("Hitung titik kP dengan k untuk mendapatkan titik-titik pesan");
        System.out.println(d+"*("+kP[0]+","+kP[1]+")");
        int[] dkP = kali(p,a,b,d,kP);
        System.out.println("Titik kkP : ("+dkP[0]+","+dkP[1]+")");
        System.out.println();
        
        System.out.println("Ambil titik absis kkP untuk di-xor-kan ke pesan terenkripsi.");
         System.out.println(dkP[0]+" -> "+Integer.toBinaryString(dkP[0]));
        System.out.println();
        System.out.println("Ambil pesan perkarakter, jadikan biner, kemudian xor-kan ke kkP");
        M = dmp[2];
        for(int dr=0; dr<M.length(); dr++){
            System.out.print(M.charAt(dr)+" -> "+(int)M.charAt(dr)+" -> "+Integer.toBinaryString((int)M.charAt(dr)));
            int eMX = dkP[0] ^ M.charAt(dr);
            System.out.println(" xor "+Integer.toBinaryString(dkP[0])+" => "+eMX+" ("+(char)eMX+")");
            msg = msg + (char) eMX;
        }
        
        System.out.println();
        System.out.println("Rangkai kembali menjadi pesan asli.");
        System.out.println(msg);
        return msg;
    }
    
    public static String[] Split(String splitStr, String delimiter) {
     StringBuffer token = new StringBuffer();
     Vector tokens = new Vector();
     // split
     char[] chars = splitStr.toCharArray();
     for (int i=0; i < chars.length; i++) {
         if (delimiter.indexOf(chars[i]) != -1) {
             // we bumbed into a delimiter
             if (token.length() > 0) {
                 tokens.addElement(token.toString());
                 token.setLength(0);
             }
         } else {
             token.append(chars[i]);
         }
     }
     // don't forget the "tail"...
     if (token.length() > 0) {
         tokens.addElement(token.toString());
     }
     // convert the vector into an array
     String[] splitArray = new String[tokens.size()];
     for (int i=0; i < splitArray.length; i++) {
         splitArray[i] = (String)tokens.elementAt(i);
     }
     return splitArray;
 }
    
    static double powSqrt(double x, double y){
  int den = 1024, num = (int)(y*den), iterations = 10;
  double n = Double.MAX_VALUE;
  
  while( n >= Double.MAX_VALUE && iterations > 1)
  {
   n = x;
   
   for( int i=1; i < num; i++ )n*=x;

   if( n >= Double.MAX_VALUE ) 
   {
    iterations--;
    den = (int)(den / 2);
    num = (int)(y*den);
   }
  } 

  for( int i = 0; i <iterations; i++ )n = Math.sqrt(n);
  
  return n;
 }

    
    static int[] arrAdd(int data,int[] datas){
        int max = datas.length;
        int[] temp = new int[max+1];
        for(int i=0; i<max; i++){
            temp[i]=datas[i];
        }
        temp[max] = data;
        return temp;
    }
    
    static int invers(double c, int p){
        int invc = 0;
        c = c%p;
        int[] a = {1,0,p};
        int[] b = {0,1,(int)c};
        boolean ulang = true;
        while(ulang){
            if(b[2]==0){
                ulang = false;
                break;
            }
            if(b[2]==1){
                invc = b[1]%p;
                ulang = false;
                break;
            }
            if(ulang){
                int q = (int) Math.floor(a[2]/b[2]);
                int[] t= {(a[0]-q*b[0]), a[1]-q*b[1], a[2]-q*b[2]};
                a = b;
                b = t;
            }
        }
        return invc;
    }
    
    static int[] kali(int p, int a, int b, int k, int[] xy){
        
        int n = k%2;
        k = (int)Math.floor(k/2);
        //System.out.println(k);
        int[] R = jumlah(p,a,b,xy[0],xy[1],xy[0],xy[1]);
        System.out.println("["+xy[0]+","+xy[1]+"]+"+"["+xy[0]+","+xy[1]+"]"+"="+"["+R[0]+","+R[1]+"]");
        if(k>1){
            R = kali(p, a, b, k, R);
        }
        if(n==1){
            System.out.print("["+R[0]+","+R[1]+"]");
            R = jumlah(p,a,b,R[0],R[1],xy[0],xy[1]);
            System.out.println("+"+"["+xy[0]+","+xy[1]+"]="+"["+R[0]+","+R[1]+"]");
        }
        return R;
    }
    
    static int[] jumlah(int p, int a, int b, int x1, int y1, int x2, int y2){
        int point[] = new int[2];
        int x3, y3;
        if(x1==0 && y1==0){
            x3 = x2;
            y3 = y2;
        }else if(x2==0 && y2==0){
            x3 = x1;
            y3 = y1;
        }else if(y1 == -y2){
            x3 = 0;
            y3 = 0;
        }else if(x1==x2 && y1==y2){
            double inv = invers(2*y1,p);
            //System.out.println(inv);
            double lambda = (3*powSqrt(x1, 2)+a)*inv;
            lambda = lambda%p;
            
            x3 = (int)powSqrt(lambda, 2) - 2*x1;
            y3 = -y1 + (int)lambda*(x1-x3);
            
            int n=1;
            while(x3<0){
                x3 = n*p+x3;
                n++;
            }
        
            n=1;
            while(y3<0){
                y3 = n*p+y3;
                n++;
            }
           
            point[0] = x3%p;
            point[1] = y3%p;
            //System.out.println(point[0]+","+point[1]);
        }else{
            int tX = (x2-x1);
            int tY = (y2-y1);
            int lambda = tY*(invers(tX,p));
            //System.out.println(invers(tX,p));
            lambda = lambda%p;
            //System.out.println("Lambda : "+lambda);
            x3 = (int)(powSqrt(lambda, 2)-x1-x2);
            y3 = lambda*(x1-x3)-y1;
            int n=1;
            while(x3<0){
                x3 = n*p+x3;
                n++;
            }
        
            n=1;
            while(y3<0){
                y3 = n*p+y3;
                n++;
            }
        
            point[0] = x3%p;
            point[1] = y3%p;
            //System.out.println(point[0]+","+point[1]);
        }
        return point;
    }
    
    static int[][] titik(int p, int a, int b, int x){
        int dmp[][] = new int[0][2];
        if(isCurve(a,b,p)){
            double yKuadrat = ((a*powSqrt(x,3))+x+b)%p;
            for(int i=0; i<p; i++){
                double t = powSqrt(i,2)%p;
                if(yKuadrat==t){
                    //dmp = addArr();
                    System.out.print("("+x+","+i+"), ");
                }
            }
        }else{
            System.out.println("coba nilai a atau b yang lain.");
        }
        return dmp;
    }
    
    public static boolean isCurve(int a, int b, int p){
        double hasil = (4*powSqrt(a, 3))+(27*powSqrt(b, 2));
        int modp  = (int)hasil%p;
        if(hasil==0){
            return false;
        }
        return true;
    }
    
    public static boolean isPrime(int p, int a){
        if(powSqrt(a, p)%p==a){
            return true;
        }
        return false;
    }
}



semoga bermanfaat :)

Written by ElangSakti
Java ME : Algoritma Kriptografi Elliptic Curve Cryptography (ECC)
Bahasan: Dibawah ini adalah algoritma kriptografi kurva eliptik (ECC) dalam basaha java, khususnya J2ME. Pada kelas tersebut ada fungsi-fungsi yang...
Published at Kamis, 11 Juli 2013, Updated at Kamis, 11 Juli 2013
Reviewed by dr. on
Rating: 4.7

3 komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Algoritma Menentukan Bilangan Prima dengan Teorema Fermat

1 komentar
Script di bawah ini dilakukan untuk menguji apakah suatu bilangan adalah bilangan prima menurup teori fermat yang memanfaatkan aturan perpangkatan dan modulo. Sebenarnya bilangan prima itu ada beberapa macam. Ada bilangan yang diduga prima, bilangan yang diduga kuat prima, bilangan yang diduga kuat berbasis prima (2,3,5,7), bilangan prima semu kuat berbasis (2,3,5,7), ada pula bilangan charmichael.

Penentuan bilangan tersebut dilakukan dengan beberapa uji komposit, uji komposit 1, uji komposit 2, dan uji komposit. Komposit adalah bilangan yang bukan prima. Kali ini saya contohkan bilangan prima basis 2. Dengan perhitungan dari rumus fermat, kita tidak perlu melakukan looping berkali-kali untuk menentukan bilangan tersebut termasuk prima atau bukan.

Script berikut akan menentukan bilangan prima dari angka 1 - 100 yang pada pada variabel 'awal' dan 'akhir'. Jika antara 1 - 100 ada bilangan prima, maka angka tersebut akan dicetak.

/**
 *
 * @author x86
 */
public class isPrime {
    public static void main(String haripinter[]){
        int awal = 1;
        int akhir = 100;
        int basis = 2;
        for(int a=awal; a<=akhir; a++){
            if(fermat(a,basis) || a==2){
                System.out.print(a+" ");
            }
        }
    }
   
    static boolean fermat(int p, int a){
        if(Math.pow(a, p)%p==a){
            return true;
        }
        return false;
    }
}

Hasilnya :
run:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 BUILD SUCCESSFUL (total time: 0 seconds)

Written by ElangSakti
Algoritma Menentukan Bilangan Prima dengan Teorema Fermat
Bahasan: Script di bawah ini dilakukan untuk menguji apakah suatu bilangan adalah bilangan prima menurup teori fermat yang memanfaatkan aturan perp...
Published at , Updated at
Reviewed by dr. on
Rating: 4.7

1 komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Algoritma (Fungsi) Pengganti Perpangkatan Math.pow() pada J2ME

Tidak ada komentar
Pada J2ME yang saya tahu belum ada fungsi untuk mencari perpangkatan bilangan yang biasa dipanggil dengan fungsi Math.pow(). Dengan demikian solusi untuk masalah tersebut yaitu menggunakan aturan akar. Untung saja Math.sqrt() masih ada, jadi kita bisa menggunakan fungsi tersebut untuk membuat pengganti fungsi Math.pow().

double powSqrt(double x, double y){
    int den = 1024, num = (int)(y*den), iterations = 10;
    double n = Double.MAX_VALUE;
    while( n >= Double.MAX_VALUE && iterations > 1){
        n = x;
        for( int i=1; i < num; i++ )n*=x;
        if( n >= Double.MAX_VALUE ){
            iterations--;
            den = (int)(den / 2);
            num = (int)(y*den);
        }
    }  
    for( int i = 0; i <iterations; i++ )n = Math.sqrt(n);
    return n;
}

Semoga bermanfaat.

Written by ElangSakti
Algoritma (Fungsi) Pengganti Perpangkatan Math.pow() pada J2ME
Bahasan: Pada J2ME yang saya tahu belum ada fungsi untuk mencari perpangkatan bilangan yang biasa dipanggil dengan fungsi Math.pow(). Dengan demiki...
Published at , Updated at
Reviewed by dr. on
Rating: 4.7

Tidak ada komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Perhitungan Algoritma Kriptografi Elliptic Curve (ECC)

2 komentar
Berikut proses perhitungan algoritma elliptic curve atau disebut juga dengan algoritma kurva eliptik.
Persamaan yang dipakai y^2 = x^3+x+1
Bilangan Prima (acak random) p=193
Anggota Himpunan Penyelesaian di atas dengan batas atas bilangan prima 193
(0,1), (0,192), (1,14), (1,179), (3,80), (3,113), (4,29), (4,164),
(5,18), (10,25), (10,168), (11,68), (11,125), (12,2), (12,191), (15,66),
(15,127), (19,33), (19,160), (20,84), (20,109), (22,40), (22,153),
(23,15), (23,178), (25,37), (25,156), (27,5), (27,188), (28,65), (28,128),
(29,78), (29,115), (31,78), (31,115), (32,50), (32,143), (35,79), (35,114),
(39,84), (39,109), (41,86), (41,107), (45,70), (45,123), (49,82), (49,111),
(51,43), (51,150), (52,93), (52,100), (53,30), (53,163), (54,80), (54,113),
(55,79), (55,114), (56,64), (56,129), (58,56), (58,137), (61,70), (61,123),
(62,6), (62,187), (66,46), (66,147), (67,41), (67,152), (69,38), (69,155),
(70,66), (70,127), (71,57), (71,136), (72,32), (72,161), (73,14), (73,179),
(74,81), (74,112), (79,2), (79,191), (81,1), (81,192), (82,67), (82,126),
(83,28), (83,165), (84,47), (84,146), (85,49), (85,144), (87,70), (87,123),
(90,55), (90,138), (91,34), (91,159), (93,42), (93,151), (94,59), (94,134),
(95,92), (95,101), (96,182), (100,19), (100,174), (101,13), (102,2),
(102,191), (103,79), (103,114), (104,92), (104,101), (108,66), (108,127),
(109,63), (109,130), (111,96), (111,97), (112,1), (112,192), (113,23),
(113,170), (114,34), (114,159), (115,94), (115,99), (117,105), (119,14),
(119,179), (120,81), (120,112), (123,49), (123,144), (127,3), (127,190),
(128,23), (128,170), (133,78), (133,115), (134,84), (134,109), (135,95),
(135,98), (136,80), (136,113), (138,55), (138,138), (140,35), (140,158),
(142,58), (142,135), (145,23), (145,170), (147,85), (147,108), (155,17),
(158,55), (158,138), (163,50), (163,143), (165,71), (165,122), (166,39),
(166,154), (168,62), (168,131), (169,7), (169,186), (171,77), (171,116),
(175,83), (175,110), (178,49), (178,144), (179,36), (179,157), (180,53),
(180,140), (181,34), (181,159), (187,92), (187,101), (188,8), (188,185),
(189,60), (189,133), (191,50), (191,143), (192,81), (192,112)

Privat key k (untuk penerima) = 4
Private key ini adalah salah satu angka yang ada pada Himpunan Penyelesaian persamaan di atas.

Titik awal kurva  P = (133,78)
Dipilih secara random.

Public Key k.P, dihitung dengan cara mengalikan private key k ke titik awal kurva P
k*P = 4*(133,78)
[133,78] +[133,78] =[112,192]
[112,192]+[112,192]=[163,143]
Jadi, Public Key k.P = (163,143)
Catatan : Perkalian dan perhitungan titik kurva menggunakan aturan perkalian, penjumlahan, penggandaan, dan invers, Jadi perkaliannya tidak sama denga perkalian matriks.


Dari pre-proses di atas kita dapatkan beberapa informasi:
Persamaan yang dipakai adalah : y^2 = x^3+x+1
Bilangan prima p : 193
Private key : 4
Titik kurva Awal : (133,78)
Public Key k.P : (163,143)


Pesan yang akan di enkripsi : haripinter

Proses Enkripsi :
-----------------------
- Menentukan titik kkP sebagai titik pengenkripsi.
k*kP = 4*(163,143)
[163,143]+[163,143]=[1,179]
[1,179]  +[1,179]  =[128,170]
Titik kkP : (128,170)
- Menentukan titik Awal proses dekripsi. (Sebenarnya ini adalah titik k.P yang sudah dihitung sebelum :) )
k*P = 4* (133,78)
[133,78] +[133,78] =[112,192]
[112,192]+[112,192]=[163,143]
Titik kP : (163,143)

Titik x dan y kP dikonversi ke karakter, selanjutkan karakter tersebut akan dikirim sebagai header pada pesan terenkripsi.
Karakter x, y, dan pesan akan dipisahkan oleh karakter #. Sehingga format pesan yang nantinya akan dikirim adalah X#Y#pesan_terenkripsi

Selanjutnya ambil titik absis kkP untuk di-xor-kan ke pesan.
128 -> 10000000

Konversi pesan ke integer sesuai format ASCII, kemudian jadikan biner. Selanjutnya di xor dengan absis titik kdP.
Setelah di xor, rangkai lagi menjadi pesan baru yang terenkripsi:
h -> 104 -> 1101000 xor 10000000 => 232 (è)
a -> 97  -> 1100001 xor 10000000 => 225 (á)
r -> 114 -> 1110010 xor 10000000 => 242 (ò)
i -> 105 -> 1101001 xor 10000000 => 233 (é)
p -> 112 -> 1110000 xor 10000000 => 240 (ð)
i -> 105 -> 1101001 xor 10000000 => 233 (é)
n -> 110 -> 1101110 xor 10000000 => 238 (î)
t -> 116 -> 1110100 xor 10000000 => 244 (ô)
e -> 101 -> 1100101 xor 10000000 => 229 (å)
r -> 114 -> 1110010 xor 10000000 => 242 (ò)
Angka desimal pesan diatas kemudian dikembalikan menjadi karakter
Pesan Baru terenkripsi : èáòéðéîôåò

Gabungkan karakter titik kP pada pesan.
Titik kP + Pesan terenkripsi : £##èáòéðéîôåò

Pada pesan tersebut titik X menjadi £ dan Y menjadi karakter yang tidak dikenal oleh format ASCII.


Proses Dekripsi :
-----------------------
Pesan terenkripsi : £##èáòéðéîôåò
Pisahkan header dan pesan asli. Kemudian ambil ke titik kP:
Titik kP : (163,143)

Hitung titik kP dengan k untuk mendapatkan titik-titik pesan
4*(163,143)
[163,143]+[163,143]=[1,179]
[1,179]  +[1,179]  =[128,170]
Titik kkP : (128,170)

Ambil titik absis kkP untuk di-xor-kan ke pesan terenkripsi.
128 -> 10000000

Ambil pesan perkarakter, jadikan biner, kemudian xor-kan ke kkP
è -> 232 -> 11101000 xor 10000000 => 104 (h)
á -> 225 -> 11100001 xor 10000000 => 97 (a)
ò -> 242 -> 11110010 xor 10000000 => 114 (r)
é -> 233 -> 11101001 xor 10000000 => 105 (i)
ð -> 240 -> 11110000 xor 10000000 => 112 (p)
é -> 233 -> 11101001 xor 10000000 => 105 (i)
î -> 238 -> 11101110 xor 10000000 => 110 (n)
ô -> 244 -> 11110100 xor 10000000 => 116 (t)
å -> 229 -> 11100101 xor 10000000 => 101 (e)
ò -> 242 -> 11110010 xor 10000000 => 114 (r)

Rangkai kembali menjadi pesan asli.
haripinter

Written by ElangSakti
Perhitungan Algoritma Kriptografi Elliptic Curve (ECC)
Bahasan: Berikut proses perhitungan algoritma elliptic curve atau disebut juga dengan algoritma kurva eliptik. Persamaan yang dipakai y^2 = x^3+x...
Published at , Updated at
Reviewed by dr. on
Rating: 4.7

2 komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Antara Sinyal, Gelombang, dan Getaran

Tidak ada komentar
Sinyal, atau sering juga disebut dengan istilah gelombang atau getaran. Ketika istilah tersebut saling terkait dalam arti harfiah dan penggunaannya dalam sehari-hari. Gelombang adalah getaran yang merambat tanpa ada informasi yang berarti. Sedangkan Sinyal adalah getaran yang merambat disertai informasi yang sudah disepakati antara pengirim dan penerima.

Akan tetapi terlepas dari perbedaan tersebut, kita akan fokus pada getaran, gelombang, dan sinyal yang dibahas pada fisika. Sehingga ketiga istilah tersebut kita sama, terlapas mau atau tidak, tetap harus disamakan agar dalam pembahasan selanjutnya sinyal yang saya maksud sama dengan sinyal yang pembaca pahami. Selanjutnya, sinyal dan getaran akan disebut sebagai gelombang. Biar sependapat. :D

Dalam Kehidupan sehari-hari, kita tidak mungkin lepas dari gelombang. Gelombang cahaya, gelombang suara, gelombang / sinyal listrik, dan gelombang-gelombang lainnya. Gelombang adalah gerakan dari tinggi ke rendah dan sebaliknya secara kontinyu, atau gelombang bisa disamakan naik turunnya energi secara spontan dan dalam waktu tertentu.

Oleh sebab itu, dalam gelombang dikenal dengan frekuensi, amplitudo, tinggi dan lebar gelombang. Semua itu berhubungan dengan waktu. Nantinya, gelombang akan dibagi-bagi lagi sesuai kriterianya atau model implementasinya. Ada gelombang periodik, diskrit, transfersal, longitudinal, analog, elektromagnetik, dll sesui dengan kriteri pembagiannya.

Kali ini belum ada rumus, ini masih pembahasan pembuka tentang sinyal / gelombang. So, keep learn.

Written by ElangSakti
Antara Sinyal, Gelombang, dan Getaran
Bahasan: Sinyal , atau sering juga disebut dengan istilah gelombang atau getaran . Ketika istilah tersebut saling terkait dalam arti harfiah dan pe...
Published at Rabu, 10 Juli 2013, Updated at Rabu, 10 Juli 2013
Reviewed by dr. on
Rating: 4.7

Tidak ada komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

1 Ramadhan 1434 H ~ Sekedar Pembuka

2 komentar
Tak semua mulut sama.
Bukan sekedar isolasi, itu seperti isotop pada semua materi

Lirikan membisik dari mata
Para pejuang tercenung
Para pengukir tak kenal lagi rupa kayu
Akhir bulan, akhir senyum yang kian layu
Akhir tahun, beras sudah jadi tepung
Lirikan membisik jadi kata

Lama sudah
Tak senyum sapa tawa canda dan tengkar
Di pojok kesedihan semua beruang tak lagi menanti
Ingatkah kalian ketika mata pertama kali terbuka?
Ingatkah kalian ketika mata mulai menutup?
Taukah kalian bahwa tubuh-tubuh kalian itu begitu menderita?

Tahukah kalian bahwa jiwa kalian itu lebih menderita...

Hai, sambil tersenyum kita menyentuh ramadhan tahun ini.
Tak tahu kita bisa menuntaskannya atau tidak.

Andai di sini seperti di Mesir
Apa yang akan Kau lakukan?
Written by ElangSakti
1 Ramadhan 1434 H ~ Sekedar Pembuka
Bahasan: Tak semua mulut sama. Bukan sekedar isolasi, itu seperti isotop pada semua materi Lirikan membisik dari mata Para pejuang tercenung Par...
Published at Selasa, 09 Juli 2013, Updated at Selasa, 09 Juli 2013
Reviewed by dr. on
Rating: 4.7

2 komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Ancur For Maintenace!

Tidak ada komentar
Bismillah... Bagi pengunjung elangsakti.com, mohon maaf jika ada kerusakan konten atau style di sana-sini. Sebab elangsakti.com sedang proses migrasi. Semoga perbaikan ini tidak memakan waktu lama.

Regards,

Haripinter

Written by ElangSakti
Ancur For Maintenace!
Bahasan: Bismillah... Bagi pengunjung elangsakti.com, mohon maaf jika ada kerusakan konten atau style di sana-sini. Sebab elangsakti.com sedang pro...
Published at Minggu, 07 Juli 2013, Updated at Minggu, 07 Juli 2013
Reviewed by dr. on
Rating: 4.7

Tidak ada komentar :

Posting Komentar

# Hack Your Skills! to be Professional Mechatronics

Road to ECC (1) : Perkalian Pada Algoritma Elliptic Curve Cryptography

Tidak ada komentar
Kurva-kurva eliptik ternyata perhitungannya bisa dijadikan algoritma enkripsi pesan dan tandatangan digital. Awalnya teori tersebut diajukan oleh si Fermat (Fermat's Last Theorem) sebagai ilmu sains hitunga matematika saja. Tapi belakangan (1985) malah diajukan sebagai teori untuk keamanan komputer oleh Victor Miller dan Neil Koblitz yang dikasi nama Elliptic Curve Public Key Cryptosystems (ECKP).

Dalam prosesnya, algoritma tersebut memiliki beberapa aturan untuk penggandaan kurva, yaitu aturan penjumlahan, perkalian, inversi, penggandaan, dan beberapa aturan untuk menjadikan kurva tersebut bisa diduplikasi. Pada artikel ini saya hanya bahas tentang cara menghitung aturan perkalian saja. Aturan tersebut berlaku untuk perkalian titik, jadi bukan perkalian matriks biasa.

Dalam referensi, aturan perkalian bisa dilakukan dengan cara berikut:
Misal point P = [x,y] dikalikan dengan 7, maka caranya yaitu menerapkan aturan penjumlahan. Nah, aturan penjumlahan nanti saja kita bahas. Perkalian tersebut buakn perkalian seperti 7P != 7*[x,y], bukan, yang benar adalah 7P = P+P+P+P+P+P+P = 2P+2P+2P+P = 2(2P)+2P+P. Nah, 2P itu mengikuti aturan penjumlahan. Untuk visualisasi proses perkaliannya adalah sebagai berikut:
P  P  P  P  P  P  P
|__|  |__|  |__|  |
 2P    2P    2P   |
 |______|____|____|
   2(2P)  +  2P + P

Di berbagai sumber, cara menghitungnya ada beberapa metode, diantaranya menggunakan algortima booth (kalo tidak salah ingat). Algoritma tersebut merupakan algoritma perkalian biner. Itu dibuatnya dulu, sebelum ada OOP kayaknya. Ada juga algoritma Addition-Substractin Algortihm dan Repeat Doubling Algorithm, semuanya bikin saya bingung. Daripada bingung, saya bikin prosesnya satu-satu kemudian mikir.

Nah, akhirnya dapet juga cara gampangnya. Kayaknya lebih simple dan lebih masuk di akal saya pribadi. Daripada make algoritma orang lain, kalo kita bisa bikin, kenapa ndak bikin saja sendiri? Hehhe.. Berikut contoh kode dalam java.
static int[] kali(int p, int a, int b, int k, int[] xy){
    int n = k%2;
    k = (int)Math.floor(k/2);
    if(k>1){
        R = kali(p, a, b, k, R);
    }
    if(n==1){
        R = jumlah(p,a,b,R[0],R[1],xy[0],xy[1]);
    }
    return R;
}

Nah, cara di atas kayaknya lebih enak dan masuk di kepala saya, hehe.

Written by ElangSakti
Road to ECC (1) : Perkalian Pada Algoritma Elliptic Curve Cryptography
Bahasan: Kurva-kurva eliptik ternyata perhitungannya bisa dijadikan algoritma enkripsi pesan dan tandatangan digital. Awalnya teori tersebut diajuk...
Published at Selasa, 02 Juli 2013, Updated at Selasa, 02 Juli 2013
Reviewed by dr. on
Rating: 4.7

Tidak ada komentar :

Posting Komentar