daily pastebin goal
38%
SHARE
TWEET

Hill Cipher( bener gk bang logika metodenya

RakaArdiansyah Jun 22nd, 2018 72 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public class HillCipher {
  2.     String char_db = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ?!.,";
  3.     //String char_db = "ABCDEFGHIJKLMNOPQRSTUVWXYZabc";
  4.     int[] array_angka, array_angka2;
  5.     int[] array_angka_cipher, array_angka_decrypted;
  6.  
  7.  
  8.  
  9.     int[][] M_key = new int[2][2];
  10.     int[][] M_inverse = new int [2][2];
  11.     int i;
  12.     String key_input, ciphertext, plaintext;
  13.     int db_length = char_db.length();
  14.  
  15.     public static String encryptionMessage(String Msg)
  16.     {
  17.         String hillpesan = Msg;
  18.         HillCipher objek = new HillCipher();
  19.         String plainHill = objek.pertama(hillpesan);
  20.         //String plainHill = new HillCipher().pertama(hillpesan);
  21.         return plainHill.toString();
  22.         //return hillpesan;
  23.     }
  24.  
  25.     public static String decryptionMessage(String Msg)
  26.     {
  27.         //String cipherpesan = "";
  28.         String cipherpesan = Msg;
  29.         HillCipher objek = new HillCipher();
  30.         String cipherHill = objek.kedua(cipherpesan);
  31.         //String cipherHill = new HillCipher().kedua(cipherpesan); // Yang ini SUURRRR
  32.         return cipherHill.toString();
  33.         //return cipherpesan;
  34.     }
  35.  
  36.     public String pertama(String Plaintext){
  37.         //String plainTextInput = Msg;
  38.  
  39.         char[] array_huruf = Plaintext.toCharArray();
  40.  
  41.         if(array_huruf.length%2!=0)
  42.             array_angka = new int[array_huruf.length+1];
  43.         else
  44.             array_angka = new int[array_huruf.length];
  45.  
  46.         for (i=0 ; i < array_huruf.length ; i++){
  47.  
  48.             int posisi_huruf =  char_db.indexOf(array_huruf[i]);
  49.  
  50.             //Toast.makeText(this, "Tombol ditekan " +  posisi_huruf , Toast.LENGTH_SHORT).show();
  51.             array_angka[i] = posisi_huruf; //if I disable this line the code should run well
  52.         }
  53.  
  54.  
  55.  
  56.         //jika panjang array ganjil letakkan spasi diakhir array
  57.         if(array_huruf.length % 2 != 0 ){
  58.             array_angka[array_huruf.length] = 62;
  59.         }
  60.  
  61.         check_kunci();
  62.  
  63.         array_angka_cipher = new int[array_angka.length];
  64.  
  65.         array_angka_cipher = encrypt_hill(Plaintext ,M_key, array_angka);
  66.  
  67.         ciphertext = to_char(array_angka_cipher);
  68.         //txtCipher.setText(Arrays.toString(array_angka) +"\n\n" + Arrays.toString(array_angka_cipher) + "\n\n" + to_char(array_angka_cipher) );
  69.         return ciphertext;
  70.  
  71.     }
  72.  
  73.     public String kedua(String ciphertext){
  74.         char[] array_cipher = ciphertext.toCharArray();
  75.         array_angka2 = new int[array_cipher.length];
  76.  
  77.         for (i=0 ; i < array_cipher.length ; i++){
  78.  
  79.             int posisi_huruf =  char_db.indexOf(array_cipher[i]);
  80.             array_angka2[i] = posisi_huruf;
  81.         }
  82.  
  83.         check_kunci();
  84.  
  85.         array_angka_decrypted = new int[array_cipher.length];
  86.  
  87.         array_angka_decrypted = decrypt_hill(ciphertext , M_inverse, array_angka2);
  88.  
  89.         plaintext = to_char(array_angka_decrypted);
  90.  
  91.         return plaintext;
  92.     }
  93.  
  94.     public void check_kunci(){
  95.  
  96.         //String kunci = "Pasti Lulus";
  97.         String kunci = "abay";
  98.         char[] array_kunci = kunci.toCharArray();
  99.  
  100.         int j = 0;
  101.  
  102.         while ( j < array_kunci.length){
  103.  
  104.             //masukkan masing-masing nilai ke matriks kunci
  105.             for (int x=0; x < 2; x++){
  106.                 for (int y=0; y<2; y++){
  107.                     M_key[x][y] = char_db.indexOf(array_kunci[j]);
  108.                     j = j+1;
  109.                 }
  110.             }
  111.         }
  112.  
  113.         int det = determinant(M_key);
  114.         if (det == 0){
  115.  
  116.         } else if (det%67==0){
  117.  
  118.         } else {
  119.  
  120.             M_inverse = getInverse(M_key, mi(det));
  121.  
  122.  
  123.             String tampil_banding = M_key[0][0] + " " + M_key[0][1] + " " + M_key[1][0] + " " + M_key[1][1] +"\n\n" + M_inverse[0][0] + " " + M_inverse[0][1] + " " + M_inverse[1][0] + " " + M_inverse[1][1];
  124.  
  125.  
  126.         }
  127.  
  128.     }
  129.  
  130.     public int[][] getInverse(int key[][], int mi){
  131.         int[][] key_inv = new int[2][2];
  132.  
  133.         key_inv[0][0] = ((key[1][1]*mi)%67);
  134.         key_inv[0][1] = (((-1*key[0][1])*mi)%67);
  135.         key_inv[1][0] = (((-1*key[1][0])*mi)%67);
  136.         key_inv[1][1] = ((key[0][0]*mi)%67);
  137.  
  138.         return key_inv;
  139.  
  140.     }
  141.  
  142.     public int determinant(int[][] A){
  143.  
  144.         int res;
  145.  
  146.         res = A[0][0]*A[1][1] - A[1][0]*A[0][1];
  147.  
  148.         return res;
  149.     }
  150.  
  151.     public int mi(int d)
  152.     {
  153.         int q,r1,r2,r,t1,t2,t;
  154.         r1=67;
  155.         r2=d;
  156.         t1=0;
  157.         t2=1;
  158.  
  159.         while(r1!=1&&r2!=0)
  160.         {
  161.             q=r1/r2;
  162.             r=r1%r2;
  163.             t=t1-(t2*q);
  164.             r1=r2;
  165.             r2=r;
  166.             t1=t2;
  167.             t2=t;
  168.         }
  169.  
  170.         return (t1+t2);
  171.     }
  172.  
  173.     public int[] encrypt_hill(String Msg, int[][] key, int[] p){
  174.         int str_length;
  175.         str_length = Msg.length();
  176.  
  177.         if(str_length%2!=0)
  178.             str_length = str_length+1;
  179.  
  180.         int[] c = new int[str_length];
  181.         int i = 0;
  182.         int zz = 0;
  183.  
  184.         for (int b=0; b< str_length/2 ; b++){
  185.             for(int j=0; j<2; j++){
  186.                 for(int x=0; x<2 ; x++){
  187.                     c[i] += key[j][x]*p[x+zz];
  188.                 }
  189.                 i++;
  190.             }
  191.             zz += 2;
  192.         }
  193.         return c;
  194.     }
  195.  
  196.     public int[] decrypt_hill(String cipherText, int[][] key_invers, int[] p){
  197.         int str_length;
  198.         str_length = cipherText.length();
  199.  
  200.         if(str_length%2!=0)
  201.             str_length = str_length+1;
  202.  
  203.         int[] c = new int[str_length];
  204.         int i = 0;
  205.         int zz = 0;
  206.  
  207.         for (int b=0; b< str_length/2 ; b++){
  208.             for(int j=0; j<2; j++){
  209.                 for(int x=0; x<2 ; x++){
  210.                     c[i] += key_invers[j][x]*p[x+zz];
  211.                 }
  212.                 i++;
  213.             }
  214.             zz += 2;
  215.         }
  216.         return c;
  217.     }
  218.  
  219.     private String to_char(int[] num_cipher){
  220.         int[] mod_result = new int[num_cipher.length];
  221.  
  222.         char[] parse_cipher = new char[num_cipher.length];
  223.  
  224.         for(int i=0;i<num_cipher.length;i++){
  225.             mod_result[i] = Math.abs(num_cipher[i]%67);
  226.             parse_cipher[i] = char_db.charAt(mod_result[i]);
  227.         }
  228.  
  229.         String cipher_result = new String(parse_cipher);
  230.  
  231.         return cipher_result;
  232.     }
  233.  
  234. }public class HillCipher {
  235.     String char_db = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ?!.,";
  236.     //String char_db = "ABCDEFGHIJKLMNOPQRSTUVWXYZabc";
  237.     int[] array_angka, array_angka2;
  238.     int[] array_angka_cipher, array_angka_decrypted;
  239.  
  240.  
  241.  
  242.     int[][] M_key = new int[2][2];
  243.     int[][] M_inverse = new int [2][2];
  244.     int i;
  245.     String key_input, ciphertext, plaintext;
  246.     int db_length = char_db.length();
  247.  
  248.     public static String encryptionMessage(String Msg)
  249.     {
  250.         String hillpesan = Msg;
  251.         HillCipher objek = new HillCipher();
  252.         String plainHill = objek.pertama(hillpesan);
  253.         //String plainHill = new HillCipher().pertama(hillpesan);
  254.         return plainHill.toString();
  255.         //return hillpesan;
  256.     }
  257.  
  258.     public static String decryptionMessage(String Msg)
  259.     {
  260.         //String cipherpesan = "";
  261.         String cipherpesan = Msg;
  262.         HillCipher objek = new HillCipher();
  263.         String cipherHill = objek.kedua(cipherpesan);
  264.         //String cipherHill = new HillCipher().kedua(cipherpesan); // Yang ini SUURRRR
  265.         return cipherHill.toString();
  266.         //return cipherpesan;
  267.     }
  268.  
  269.     public String pertama(String Plaintext){
  270.         //String plainTextInput = Msg;
  271.  
  272.         char[] array_huruf = Plaintext.toCharArray();
  273.  
  274.         if(array_huruf.length%2!=0)
  275.             array_angka = new int[array_huruf.length+1];
  276.         else
  277.             array_angka = new int[array_huruf.length];
  278.  
  279.         for (i=0 ; i < array_huruf.length ; i++){
  280.  
  281.             int posisi_huruf =  char_db.indexOf(array_huruf[i]);
  282.  
  283.             //Toast.makeText(this, "Tombol ditekan " +  posisi_huruf , Toast.LENGTH_SHORT).show();
  284.             array_angka[i] = posisi_huruf; //if I disable this line the code should run well
  285.         }
  286.  
  287.  
  288.  
  289.         //jika panjang array ganjil letakkan spasi diakhir array
  290.         if(array_huruf.length % 2 != 0 ){
  291.             array_angka[array_huruf.length] = 62;
  292.         }
  293.  
  294.         check_kunci();
  295.  
  296.         array_angka_cipher = new int[array_angka.length];
  297.  
  298.         array_angka_cipher = encrypt_hill(Plaintext ,M_key, array_angka);
  299.  
  300.         ciphertext = to_char(array_angka_cipher);
  301.         //txtCipher.setText(Arrays.toString(array_angka) +"\n\n" + Arrays.toString(array_angka_cipher) + "\n\n" + to_char(array_angka_cipher) );
  302.         return ciphertext;
  303.  
  304.     }
  305.  
  306.     public String kedua(String ciphertext){
  307.         char[] array_cipher = ciphertext.toCharArray();
  308.         array_angka2 = new int[array_cipher.length];
  309.  
  310.         for (i=0 ; i < array_cipher.length ; i++){
  311.  
  312.             int posisi_huruf =  char_db.indexOf(array_cipher[i]);
  313.             array_angka2[i] = posisi_huruf;
  314.         }
  315.  
  316.         check_kunci();
  317.  
  318.         array_angka_decrypted = new int[array_cipher.length];
  319.  
  320.         array_angka_decrypted = decrypt_hill(ciphertext , M_inverse, array_angka2);
  321.  
  322.         plaintext = to_char(array_angka_decrypted);
  323.  
  324.         return plaintext;
  325.     }
  326.  
  327.     public void check_kunci(){
  328.  
  329.         //String kunci = "Pasti Lulus";
  330.         String kunci = "abay";
  331.         char[] array_kunci = kunci.toCharArray();
  332.  
  333.         int j = 0;
  334.  
  335.         while ( j < array_kunci.length){
  336.  
  337.             //masukkan masing-masing nilai ke matriks kunci
  338.             for (int x=0; x < 2; x++){
  339.                 for (int y=0; y<2; y++){
  340.                     M_key[x][y] = char_db.indexOf(array_kunci[j]);
  341.                     j = j+1;
  342.                 }
  343.             }
  344.         }
  345.  
  346.         int det = determinant(M_key);
  347.         if (det == 0){
  348.  
  349.         } else if (det%67==0){
  350.  
  351.         } else {
  352.  
  353.             M_inverse = getInverse(M_key, mi(det));
  354.  
  355.  
  356.             String tampil_banding = M_key[0][0] + " " + M_key[0][1] + " " + M_key[1][0] + " " + M_key[1][1] +"\n\n" + M_inverse[0][0] + " " + M_inverse[0][1] + " " + M_inverse[1][0] + " " + M_inverse[1][1];
  357.  
  358.  
  359.         }
  360.  
  361.     }
  362.  
  363.     public int[][] getInverse(int key[][], int mi){
  364.         int[][] key_inv = new int[2][2];
  365.  
  366.         key_inv[0][0] = ((key[1][1]*mi)%67);
  367.         key_inv[0][1] = (((-1*key[0][1])*mi)%67);
  368.         key_inv[1][0] = (((-1*key[1][0])*mi)%67);
  369.         key_inv[1][1] = ((key[0][0]*mi)%67);
  370.  
  371.         return key_inv;
  372.  
  373.     }
  374.  
  375.     public int determinant(int[][] A){
  376.  
  377.         int res;
  378.  
  379.         res = A[0][0]*A[1][1] - A[1][0]*A[0][1];
  380.  
  381.         return res;
  382.     }
  383.  
  384.     public int mi(int d)
  385.     {
  386.         int q,r1,r2,r,t1,t2,t;
  387.         r1=67;
  388.         r2=d;
  389.         t1=0;
  390.         t2=1;
  391.  
  392.         while(r1!=1&&r2!=0)
  393.         {
  394.             q=r1/r2;
  395.             r=r1%r2;
  396.             t=t1-(t2*q);
  397.             r1=r2;
  398.             r2=r;
  399.             t1=t2;
  400.             t2=t;
  401.         }
  402.  
  403.         return (t1+t2);
  404.     }
  405.  
  406.     public int[] encrypt_hill(String Msg, int[][] key, int[] p){
  407.         int str_length;
  408.         str_length = Msg.length();
  409.  
  410.         if(str_length%2!=0)
  411.             str_length = str_length+1;
  412.  
  413.         int[] c = new int[str_length];
  414.         int i = 0;
  415.         int zz = 0;
  416.  
  417.         for (int b=0; b< str_length/2 ; b++){
  418.             for(int j=0; j<2; j++){
  419.                 for(int x=0; x<2 ; x++){
  420.                     c[i] += key[j][x]*p[x+zz];
  421.                 }
  422.                 i++;
  423.             }
  424.             zz += 2;
  425.         }
  426.         return c;
  427.     }
  428.  
  429.     public int[] decrypt_hill(String cipherText, int[][] key_invers, int[] p){
  430.         int str_length;
  431.         str_length = cipherText.length();
  432.  
  433.         if(str_length%2!=0)
  434.             str_length = str_length+1;
  435.  
  436.         int[] c = new int[str_length];
  437.         int i = 0;
  438.         int zz = 0;
  439.  
  440.         for (int b=0; b< str_length/2 ; b++){
  441.             for(int j=0; j<2; j++){
  442.                 for(int x=0; x<2 ; x++){
  443.                     c[i] += key_invers[j][x]*p[x+zz];
  444.                 }
  445.                 i++;
  446.             }
  447.             zz += 2;
  448.         }
  449.         return c;
  450.     }
  451.  
  452.     private String to_char(int[] num_cipher){
  453.         int[] mod_result = new int[num_cipher.length];
  454.  
  455.         char[] parse_cipher = new char[num_cipher.length];
  456.  
  457.         for(int i=0;i<num_cipher.length;i++){
  458.             mod_result[i] = Math.abs(num_cipher[i]%67);
  459.             parse_cipher[i] = char_db.charAt(mod_result[i]);
  460.         }
  461.  
  462.         String cipher_result = new String(parse_cipher);
  463.  
  464.         return cipher_result;
  465.     }
  466.  
  467. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top