// Updates: 2004.03.23, 2003.06.13 import java.io.*; import java.security.*; /** * Signe un texte puis vérifie la signature. Les constantes CHEAT_TEXT et * CHEAT_SIGNATURE permettent de modifier respectivement le texte et la * signature (après l'opération de signature) afin de s'assurer que toute * tentative de fraude soit détectée. * Note: Le message peut-être de longueur quelconque; il n'y a pas besoin de * faire un hash avant d'appliquer le processus de signature. */ public class TestDSA { final static int KEY_SIZE = 1024; // [512..1024] final static boolean CHEAT_TEXT = false; final static boolean CHEAT_SIGNATURE = false; final static String message = "Transfer $2000 to account S314542.0"; public static void main(String args[]) { try { byte[] text = message.getBytes(); System.out.println("\nGenerating a pair of DSA keys..."); KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA"); keyPairGen.initialize(KEY_SIZE, new SecureRandom()); KeyPair kp = keyPairGen.generateKeyPair(); System.out.println("Signing the text..."); Signature signature = Signature.getInstance("DSA"); signature.initSign(kp.getPrivate()); signature.update(text); byte[] sig = signature.sign(); if (CHEAT_TEXT) text[0]++; if (CHEAT_SIGNATURE) sig[4]++; // changing sig[0] produces an exception System.out.println("\nVerifying the signature..."); signature.initVerify(kp.getPublic()); signature.update(text); boolean ok = signature.verify(sig); System.out.println("Signature is " + (ok ? "OK" : "NOT OK") + " !\n"); } catch (Exception e) { System.out.println(e); } } }