Menghitung Troughput GSM, GPRS , EDGE/EGPRS, EDGE2/EGPRS2


Throughput = (Simbol dalam 1 time slot)/(waktu 1 frame) x (jumlah frame untuk data)/(jumlah frame total)

GSM
Throughput Voice full rate GSM = (114 / 4.615 ms) x (24/26) = 22.8 kbps

GPRS
Throughput GPRS = (912 / 4.615) x (24/26) = 182.4 kbps

EDGE/EGPRS
Throughput EDGE = (912 / 4.615) x (24/26) x 3 = 547.2 kbps

EDGE2/EGPRS2
Throughput EDGE2 = (1088 / 4.615) x (24/26) = 217.6 kbps
Throughput EDGE2 (32 QAM) = (1088 / 4.615) x (24/26) x 5 = 1.08 mbps

Merubah dari Bytes ke Bentuk Hexadecimal & Contoh Enkripsi simple menggunakan algoritma simetrik


Enkripsi menggunakan JCE-JCA baik menggunakan provider bawaan java ataupun provider lain seperti BC mempunyai inputan, outputan dan kunci beupa array byte sesuai dengan panjang dari spesifikasi algoritma tersebut. Untuk memudahkan verifikasi hasil khususnya didalam console print kita dapat menggunakan format hexadecimal sebagai representasi dari data array byte, sebagai contoh berikut:

byte[] input = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

data diatas jika kita langsung System.out.println(input); maka hasil yang kita dapatkan adalah [B@372ea2bc, tidak sesuai dengan reperesentasi byte yang kita inginkan oleh karena itu diperlukan fungsi sebagai berikut

public class Utils
{
    private static String digits = "0123456789abcdef";
    /**
     * Return length many bytes of the passed in byte array as a hex string.
     *
     * @param data the bytes to be converted.
     * @param length the number of bytes in the data block to be converted.
     * @return a hex representation of length bytes of data.
     */
    public static String toHex(byte[] data, int length)
    {
        StringBuffer    buf = new StringBuffer();
        for (int i = 0; i != length; i++)
        {
            int v = data[i] & 0xff;
            buf.append(digits.charAt(v >> 4));
            buf.append(digits.charAt(v & 0xf));
        }
        return buf.toString();
    }
    /**
     * Return the passed in byte array as a hex string.
     *
     * @param data the bytes to be converted.
     * @return a hex representation of data.
     */
    public static String toHex(byte[] data)
    {
        return toHex(data, data.length);
    }
}

sebagai contoh, fungsi tersebut kita gunakan untuk Enkirpsi menggunakan AES dengan mode ECB dan tanpa padding, sebagai berikut:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class SimpleSymmetricExample
{
    public static void main(String[] args) throws Exception
    {
        byte[]        input = new byte[] {
                          0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
                          (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb,
                          (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff };
        byte[]        keyBytes = new byte[] {
                          0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                          0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
        SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
        Cipher        cipher = Cipher.getInstance("AES/ECB/NoPadding", "BC");
        System.out.println("input text : " + Utils.toHex(input));
        // encryption pass
        byte[] cipherText = new byte[input.length];
        cipher.init(Cipher.ENCRYPT_MODE, key);
        int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
        ctLength += cipher.doFinal(cipherText, ctLength);
        System.out.println("cipher text: " + Utils.toHex(cipherText)
                                                     + " bytes: " + ctLength);

        // decryption pass
        byte[] plainText = new byte[ctLength];
        cipher.init(Cipher.DECRYPT_MODE, key);
        int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
        ptLength += cipher.doFinal(plainText, ptLength);
        System.out.println("plain text : " + Utils.toHex(plainText)
                                                     + " bytes: " + ptLength);
    }
}

maka hasil yang kita dapatkan sebagai berikut:
input text : 00112233445566778899aabbccddeeff
cipher text: dda97ca4864cdfe06eaf70a0ec0d7191 bytes: 16
plain text : 00112233445566778899aabbccddeeff bytes: 16

Mengirim multiple Email menggunakan SSL Java


Kali ini misal kita dihadapkan case sebagai berikut:
– Kirimkan email berikut gambar dan attachment ke 20 list penerima
– email harus bersifat personal atau tanpa menggabung alamat-alamat email tersebut kedalam satu surat
– Judul disisipkan Nama penerima , dan juga format message disisipkan nama lengkap dan nama panggilan
– format message yang dimaksud sebagai berikut:

Continue reading “Mengirim multiple Email menggunakan SSL Java”

Install provider Bouncy castle


Sebenarnya kita dapat menggunakan library bawaan java yaoti JCA dan JCE, namun kali ini kita menggunakan provider lain yaitu Bouncy castle, BC sendiri adalah salah satu komunitas open source yang memiliki interest kebidang kirptografi sejak tahun 1990 khususnya didalam pemograman c# dan java. BC sendiri sudah mendukung algoritma kriptografi simetrik seperti GOST. Untuk menginstall dan menEnableKan berikut langkah-langkahnya

tambahkan didalam line berikut list provider java.security didirektori /usr/lib/jvm/java-8-oracle/jre/lib/security

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider

N adalah urutan sesuai nomor urut yang terdapat didalam java.security anda, sebagai contoh

#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC

maka tambahkandilne setelah N=9: security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

setelah itu install library bcprov-JdkVersion-Version.jar. sesuai versi yang anda inginkan, .jar dapat didownload di https://www.bouncycastle.org/latest_releases.html

cek apakah BC sudah terinstall:


import java.security.Security;
/**
* Basic class to confirm the Bouncy Castle provider is
* installed.
*/
public class SimpleProviderTest
{
public static void main(String[] args)
{
String providerName = "BC";
if (Security.getProvider(providerName) == null)
{
System.out.println(providerName + " provider not installed");
}
else
{
System.out.println(providerName + " is installed.");
}
}
}

Jika sudah di console akan terprint
BC is installed.

Continue reading “Install provider Bouncy castle”

Install Unrestricted policy files di Java Crypto


Normalnya key yang dapat digunakan di java crypto adalah tidak lebih dari 128 bit (terkecuali untuk 3DES) dan RSA yang dibatasi sampai 2048 bit. Bagaimana jika kita ingin mengunakan kunci lebih dari 128 misal untuk symetric algorithm seperti blowfish 192 bit?
untuk itu kita perlu mengaktifkan unrestrited policy files, untuk java7 dapat didownload di http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
dan java8 di http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

setelah itu jika menggunakan linux replace file kedalam direktori jvm sebagai berikut: /usr/lib/jvm/java-8-oracle/jre/lib/security US_export_policy.jar dan local_policy.jar dengan file yg kita download sebelumnya.
untuk linux diperlukan akses root untuk mereplace kedua file tersebut

gunakan script dibawah ini untuk mengetest apakan Policy sudah di unrestricted


import javax.crypto.*;
import javax.crypto.spec.*;
public class SimplePolicyTest
{
public static void main(String[] args) throws Exception
{
byte[] data = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
// create a 64 bit secret key from raw bytes
SecretKey key64 = new SecretKeySpec(
new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 },
"Blowfish");
// create a cipher and attempt to encrypt the data block with our key
Cipher c = Cipher.getInstance("Blowfish/ECB/NoPadding");
c.init(Cipher.ENCRYPT_MODE, key64);
c.doFinal(data);
System.out.println("64 bit test: passed");
// create a 192 bit secret key from raw bytes
SecretKey key192 = new SecretKeySpec(
new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
"Blowfish");
// now try encrypting with the larger key
c.init(Cipher.ENCRYPT_MODE, key192);
c.doFinal(data);

System.out.println("192 bit test: passed");
System.out.println("Tests completed");
}
}

Jika sukses maka print di console sebagai berikut
64 bit test: passed
192 bit test: passed
Tests completed

jika tidak maka:
64 bit test: passedException in thread “main”
java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
at javax.crypto.Cipher.init(Cipher.java:1245)
at javax.crypto.Cipher.init(Cipher.java:1186)
at SimplePolicyTest.main(SimplePolicyTest.java:24)

Algoritma Enkripsi Citra dengan Pseudo One-Time Pad yang Menggunakan Sistem Chaos [Rinaldi Munir]


Kali ini kita akan mencoba menelaah sebuah artikel yang dipublikasikan oleh Rinaldi Munir pada Konferensi Nasional Informatika – KNIF 2011 dengan judul Algoritma Enkripsi Citra dengan Pseudo One-Time Pad yang Menggunakan Sistem Chaos

algoritma yang diusulkan sebagai berikut
(a) Enkripsi
Masukan: citra, x0
Keluaran: citra terenkripsi

Step 1: Baca pixel-pixel citra dan simpan di dalam sebuah matriks. Jika citra tersebut citra 24-bit, maka setiap komponen R, G, dan B disimpan di dalam tiga matriks berbeda.

Step 2: Ekstraksi byte setiap pixel citra, misalkan byte-byte tersebut adalah p1, p2, …, pn.

Step 3: Iterasikan logistic map dengan nilai awal x0 (kunci rahasia). Konversikan setiap nilai chaotic menjadi integer dengan persamaan (2). Misalkan barisan integer yang dihasilkan adalah k1, k2, …, kn.

Step 4: Enkripsi setiap pi dengan ki menggunakan persamaan (4). hasil enkripsi adalah c1, c2, …, cn.

Step 5: Letakkan kembali byte-byte hasil enkripsi pada posisi pixel semula. Hasil dari langkah terakhir ini adalah citra terenkripsi.

(b) Dekripsi
Masukan: citra terenkripsi, x0
Keluaran: citra semula

Step 1: Baca pixel-pixel citra dan simpan di dalam sebuah matriks. Jika citra tersebut citra 24-bit, maka setiap komponen R, G, dan B disimpan di dalam tiga matriks berbeda.

Step 2: Ekstraksi byte setiap pixel citra, misalkan byte-byte tersebut adalah p1, p2, …, pn.

Step 3: Iterasikan logistic map dengan nilai awal x0 (kunci rahasia). Konversikan setiap nilai chaotic menjadi integer dengan persamaan (2). Misalkan barisan integer yang dihasilkan adalah k1, k2, …, kn.

Step 4: Enkripsi setiap pi dengan ki menggunakan persamaan (6). Hasil enkripsi adalah c1, c2, …, cn.

Step 5: Letakkan kembali byte-byte hasil enkripsi pada posisi pixel semula. Hasil dari langkah terakhir ini adalah citra semula.

berikut untuk implementasi nya : https://github.com/ridhb/Image-Encryption-with-Pseudo-One-Time-Pad