Anda di halaman 1dari 8

______ _ _____ ___ __ _(_) __|___ __| |___|____ | / _ \ / _` | |\ \ / _ \ / _` |__ \ |_ | \__ | | | | |_\ \ (_) | | | |__) |__| | |___/|_| |_|_|____\___/|_|

|_|___/_____| [ echo|zine, volume 6 issue 19 ] Digital Signature secara gampangnya Brought To You By : mamasexy email: mamasexy/at/null/dev ======= Pendahuluan ---| Digital Signature Tanda tangan dijital adalah bentu tiruan tanda tangan onvensional e dalam bentu dijital. Tetapi bu an file scan tanda tangan di ertas. Sebutan digital signature ini sebenarnya onsep. Dalam dunia nyata, tanda tangan dijital itu bentu nya adalah rang aian byte-byte yang ji a diperi sa bisa diguna an untu memeri sa apa ah suatu do umen dijital, juga termasu email, benar berasal dari orang tertentu atau tida . Misalnya, Alice mengirim an do umen penting epada Bob melalui email. Ternyata, Trent yang tahu abar ini emudian mencoba memalsu an email Alice. Do umen attachment Alice diganti. Keti a Bob terima email Alice (yang attachmentnya sudah diganti oleh Trent), dia merasa aneh, arena isinya tida sesuai dengan pembicaraan sebelumnya. Bob curiga. Bob memeri sa (mem-verifi asi) digital signature pada email tersebut. Bob tahu, ternyata surat itu tanda tangannya tida coco . Konsep ini se arang telah diimplementasi an dalam bentu S/MIME dan PGP. Saya tida a an bahas S/MIME dan PGP, tapi saya a an bahas bagaimana membuat dan memeri sa easlian tanda tangan dijital. ======= Implementasi ---|

Bagaimana membuat tanda tangan dijital? 1. Alice mengambil nilai hash dari pesan/data. Fungsi hash yang bisa pa ai misalnya MD5 atau SHA1 2. Alice mengen rip nilai hash tersebut dengan algoritma en ripsi public ey, contohnya RSA (dipa ai di S/MIME; sedang an PGP pa ai algoritma El Gamal). Hasil en ripsi hash dengan private ey pengirim inilah yang disebut digital signature. 3. Alice menempel an (concat) digital signature e pesan/data. 4. Alice mengirim pesan/data yang sudah ditempeli digital signature tersebut epada Bob Bagaimana mem-verifi asi tanda tangan dijital? 1. Bob mengambil emailnya, emudian memisah an bagian tanda tangan dijital dengan bagian pesan/datanya 2. Bob mende rip digital signature pesan tersebut dengan public ey Alice. Public ey Alice sudah pernah diberi an oleh Alice sebelumnya, atau bisa diambil dari website Alice 3. Hasil de ripsi digital signature emudian dicoco an dengan nilai hash bagian pesan/data email tersebut

Pre-requisit sebelum onsep ini bisa diimplementasi an 1. Alice harus punya pasangan public ey dan private Di-generate (dibang it an) dong!

ey. Caranya?

4. Ji a hasilnya sama, berarti tanda tangan dijital dinilai valid sedang an bila beda, berarti digital signature tida valid (do umen telah dipalsu an atau pengirimnya pasti bu an Alice) Beri utnya, untu memperjelas onsep ini saya beri an contoh program dalam bahasa Java. Spesifi asi ebutuhan - fungsi untu menghasil an digital signature - fungsi untu mem-verifi asi apa ah digital signature valid atau tida - algoritma yang diguna an adalah RSA dengan fungsi hash MD5 - digital signature yang dihasil an berupa byte array Hasil - Sebuah class Java bernama DigitalSignatureVerifier Kebutuhan JCA (Java Cryptography Architecture) yang ada secara default pada JRE & JDK seja Java 1.5. Menghasil an digital signature byte[] getDigitalSignature(String message, PrivateKey p ) Input: - Message/data yang a an diambil digital signature nya. Data bertipe String. - Private ey pemberi tanda tangan. Private ey adalah obje dari class PrivateK ey Hasil: Array byte digital signature mengguna an algoritma RSA dan fungsi hash MD5. Memverifi asi validitas digital signature boolean verifySignature(String message, PublicKey pb, byte[] signature) Input: - Message/data yang diperi sa. Data bertipe String. - Public ey pembuat digital signature. Public ey adalah obje dari class Publi cKey - Signature adalah array byte digital signature yang diperi sa validitasnya Hasil: Ji a digital signature valid, method a an menghasil an nilai true. Ji a tida , ma a nilai yang di embali an adalah false. Petunju penggunaan Detil petunju penggunaan ada di file Main.java 1. Sebelum mengguna an DigitalSignatureVerifier, sebuah obje DigitalSignatureVerifier perlu dibuat terlebih dahulu. Perintahnya adalah sebagai beri ut: DigitalSignatureVerifier dsv = new DigitalSignatureVerifier();

KeyPair p = dsv.generateRSAKeyPair(); 3. Private ey dan public ey dari pasangan unci dapat diambil dengan method getPrivate() dan getPublic() dari class KeyPair. PrivateKey p = p.getPrivate(); PublicKey pb = p.getPublic();

2. Membang it an pasangan unci private ey dan public dipermudah dengan memanggil method generateRSAKeyPair().

ey RSA, dapat

String message = "A DIGITALLY SIGNED MESSAGE."; byte[] signature = dsv.getDigitalSignature(message, p ); 5. Contoh perintah untu memverifi asi apa ah digital signature yang diberi an valid atau tida boolean verified = dsv.verifySignature(message, pb, signature);

byte[] priv = dsv.getPrivateKeyAsBytes(p ); byte[] pub = dsv.getPublicKeyAsBytes(pb); 7. Private ey dan public ey yang ada dalam bentu array byte dapat di-load embali e dalam class PrivateKey dan class PublicKey PrivateKey p 2 = dsv.loadPrivateKeyFromBytes(priv); PublicKey pb2 = dsv.loadPublicKeyFromBytes(pub); ======= Catatan --- | Algoritma-algoritma pembentu digital signature dan algoritma en ripsi public ey yang diguna an ditulis hard-coded di dalam program arena algoritma en ripsi yang diminta hanya satu, yaitu RSA.

DigitalSignatureVerifier.java import java.math.BigInteger; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.Provider; import java.security.PublicKey; import java.security.Security; import java.security.Signature; import java.security.SignatureException; import java.security.spec.EncodedKeySpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import sun.misc.BASE64Encoder; /** * Class ini ditulis mengguna an Java Cryptography Architecture yang telah menja di * pa et standar dalam JRE & JDK seja versi 1.5. Fungsi utama class ini adalah * untu menghasil an digital signature dan memverifi asi digital signature. Jug a

----------------

ode sumber program -----------------------

6. Public byte

ey dan private ey dapat juga direpresentasi an dalam bentu array

4. )

Contoh perintah untu mengambil digital signature pada suatu message (data

/** * Method ini diguna an untu mengambil private ey dalam bentu array byte. * Bisa jadi untu ebutuhan penyimpanan dibutuh an. * @param p * @return */ public byte[] getPrivateKeyAsBytes(PrivateKey p ) { return p .getEncoded(); } /** * Method ini diguna an untu me-load embali private ey yang mung in telah * disimpan dalam bentu array byte yang tersimpan dalam file. Private ey * yang dihasil an berformat #PKCS-8. * @param privateKeyBytes * @return * @throws java.security.NoSuchAlgorithmException * @throws java.security.spec.InvalidKeySpecException */ public PrivateKey loadPrivateKeyFromBytes(byte[] privateKeyBytes) \ throws NoSuchAlgorithmException, InvalidKeySpecException { KeyFactory f = KeyFactory.getInstance("RSA"); EncodedKeySpec p Spec = new PKCS8EncodedKeySpec(privateKeyBytes); return f.generatePrivate(p Spec); } /** * Method ini diguna an untu mengambil private ey dalam bentu BASE 64. * Bisa jadi untu ebutuhan penyimpanan dibutuh an. Umumnya, private ey * disimpan dalam bentu ini. * @param p * @return */ public String getPrivateKeyAsBase64(PrivateKey p ) { byte[] privateKey = p .getEncoded(); BigInteger bi = new BigInteger(privateKey); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(p .getEncoded()); } /** * Method ini diguna an untu mengambil public ey dalam bentu array byte. * Bisa jadi untu ebutuhan penyimpanan dibutuh an. * @param pb * @return */ public byte[] getPublicKeyAsBytes(PublicKey pb) { return pb.getEncoded(); }

/** * Method ini mung in dibutuh an

eti a ingin me-load

unci yang diambil dar

* ditambah an beberapa fungsi lain pendu ungnya. Algoritma yang diguna an untu * digital signature adalah RSA dengan fungsi hash MD5. * @author amri shodiq */ public class DigitalSignatureVerifier {

* file. Public ey ini emudian a an di-encode dalam format X509. * @param publicKeyBytes * @return * @throws java.security.NoSuchAlgorithmException * @throws java.security.spec.InvalidKeySpecException */ public PublicKey loadPublicKeyFromBytes(byte[] publicKeyBytes) \ throws NoSuchAlgorithmException, InvalidKeySpecException { KeyFactory f = KeyFactory.getInstance("RSA"); EncodedKeySpec pbSpec = new X509EncodedKeySpec(publicKeyBytes); return f.generatePublic(pbSpec); } /** * Method ini diguna an untu mengambil public ey dalam bentu BASE 64. * Bisa jadi untu ebutuhan penyimpanan dibutuh an. Umumnya, public ey * disimpan dalam bentu ini. * @param pb * @return */ public String getPublicKeyAsBase64(PublicKey pb) { byte[] publicKey = pb.getEncoded(); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(pb.getEncoded()); } /** * Method untu membang it an pasangan ey RSA. Hasil fungsi berupa obje * class KeyPair; sepasang private ey dan public ey. Untu mengambil * private ey dan public ey-nya bisa mengguna an method getPrivate dan * method getPublic mili class KeyPair. * @return * @throws java.security.NoSuchAlgorithmException */ public KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator g = KeyPairGenerator.getInstance("RSA"); g.initialize(1024); KeyPair result = g.genKeyPair(); return result; } /** * Method untu mendapat an digital signature dengan tipe array byte. Input * message adalah data yang a an diambil digital signature-nya. Method ini * mengguna an fungsi hash MD5 dan algoritma en ripsi RSA. * @param message * @param p * @return * @throws java.security.NoSuchAlgorithmException * @throws java.security.InvalidKeyException * @throws java.security.SignatureException */ public byte[] getDigitalSignature(String message, PrivateKey p ) throws \ NoSuchAlgorithmException, InvalidKeyException, SignatureException { Signature sign = Signature.getInstance("MD5withRSA"); sign.initSign(p ); byte[] byteMessage = message.getBytes();

sign.update(byteMessage, 0, byteMessage.length); return sign.sign(); } /** * Method untu mem-verifi asi atau memeri sa eabasahan digital signature * dari suatu string. Algoritma yang diguna an: hash mengguna an MD5 dan * en ripsi mengguna an RSA. Hasil embalian dari method ini berupa nilai * boolean. Ji a digital signature valid ma a hasilnya true. * @param message * @param pb * @param signature * @return * @throws java.security.NoSuchAlgorithmException * @throws java.security.InvalidKeyException * @throws java.security.SignatureException */ public boolean verifySignature(String message, PublicKey pb, byte[]signature ) \ throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { Signature sign = Signature.getInstance("MD5withRSA"); sign.initVerify(pb); byte[] byteMessage = message.getBytes(); sign.update(byteMessage, 0, byteMessage.length); return sign.verify(signature); } /** * Method ini diguna an untu mendapat an daftar service riptografi yang * disedia an oleh Java. * @return */ public String[] getServiceTypes() { Set result = new HashSet(); // All all providers Provider[] providers = Security.getProviders(); for (int i=0; i<providers.length; i++) { // Get services provided by each provider Set eys = providers[i]. eySet(); for (Iterator it= eys.iterator(); it.hasNext(); ) { String ey = (String)it.next(); ey = ey.split(" ")[0]; if ( ey.startsWith("Alg.Alias.")) { // Strip the alias ey = ey.substring(10); } int ix = ey.indexOf('.'); result.add( ey.substring(0, ix)); } } return (String[])result.toArray(new String[result.size()]); } /** * Method ini diguna an untu

mendapat an implementasi riptografi di Java.

* Inputnya bisa berupa KeyPairGenerator, Signature, MessageDigest, dll. * @param serviceType * @return */ public String[] getCryptoImpls(String serviceType) { Set result = new HashSet(); // All all providers Provider[] providers = Security.getProviders(); for (int i=0; i<providers.length; i++) { // Get services provided by each provider Set eys = providers[i]. eySet(); for (Iterator it= eys.iterator(); it.hasNext(); ) { String ey = (String)it.next(); ey = ey.split(" ")[0]; if ( ey.startsWith(serviceType+".")) { result.add( ey.substring(serviceType.length()+1)); } else if ( ey.startsWith("Alg.Alias."+serviceType+".")) { // This is an alias result.add( ey.substring(serviceType.length()+11)); } } } return (String[])result.toArray(new String[result.size()]); } } Main.java import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author admin */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { try { // Contoh penggunaan class DigitalSignatureVerifier DigitalSignatureVerifier dsv = new DigitalSignatureVerifier(); // Perintah ini diguna an ji a Anda perlu meng-generate pasangan // unci baru. KeyPair p = dsv.generateRSAKeyPair();

// Contoh asus, ita ingin mengambil digital signature pesan beri u

// Dua perintah ini diguna an untu // public ey dari KeyPair PrivateKey p = p.getPrivate(); PublicKey pb = p.getPublic();

mengambil private ey dan

t: String message = "A DIGITALLY SIGNED MESSAGE."; // Digital signature yang dihasil an dalam bentu array byte byte[] signature = dsv.getDigitalSignature(message, p ); // Perintah beri ut diguna an untu memeri sa eabsahan digital // signature boolean verified = dsv.verifySignature(message, pb, signature); ey

// dalam bentu array byte, guna an perintah beri ut: byte[] priv = dsv.getPrivateKeyAsBytes(p ); byte[] pub = dsv.getPublicKeyAsBytes(pb); // Ji a ingin me-load embali array byte e dalam class PrivateKey // atau PublicKey emudian mengguna annya embali untu verifi asi. PrivateKey p 2 = dsv.loadPrivateKeyFromBytes(priv); PublicKey pb2 = dsv.loadPublicKeyFromBytes(pub); e

boolean verified2 = dsv.verifySignature(message, pb2, signature); System.out.println("Hasil: "+verified); System.out.println("Hasil2: "+verified2); } catch (Exception ex) { ex.printStac Trace(); } } --------------------- ode sumber program ---------------------------*- $e19dot003dottxt - echo|zine - issue#19 - 080808 -*

// Obje

PublicKey yang diguna an adalah yang di-load dari array byt

// Ji a ita ingin mengirim atau menyimpan public ey atau private

Anda mungkin juga menyukai