import java.io.*;
import java.security.*;
import sun.misc.*;


public class FirmaDigital{

public static void main(String[] args) {
//Algoritmo usado para crear la firma
String algo = "DSA";
//Generar par de claves
KeyPair kp = generateKeyPair(algo);
// Generar firma digital a partir del mensaje original que se recibe por argumento
byte[] sig = crearFirma(args[0], algo, kp);
//Verificar firma
verificarFirma(args[0], algo, sig, kp.getPublic());
}

static KeyPair generateKeyPair(String algo){
try{
KeyPairGenerator kpg = KeyPairGenerator.getInstance(algo);
System.out.println("Key pair is generated");
KeyPair kp = kpg.genKeyPair();
return kp;
}catch(Exception e){
System.out.println(e);
}
return null;
}

static byte[] crearFirma(String s, String algo, KeyPair kp){
try{
Signature mySign = Signature.getInstance(algo);
PrivateKey prik = kp.getPrivate();
PublicKey pubk = kp.getPublic();
mySign.initSign(prik);
System.out.println("\nFirma generada correctamente");
mySign.update(s.getBytes());
byte[] b = mySign.sign();
System.out.println("\nMessage original: "+s);
System.out.println("\nClave privada: "+
convertBase64(prik.getEncoded()));
System.out.println("\nClave publica : "+
convertBase64(pubk.getEncoded()));
System.out.println("\nFirma : "+convertBase64(b));
return b;
}catch(Exception e){
System.out.println(e);
}
return null;
}



static void verificarFirma(String s, String algo, byte[] sig, PublicKey pubk){
try{
Signature mySign = Signature.getInstance(algo);
System.out.println("\nLa firma se esta validando...");
mySign.initVerify(pubk);

mySign.update(s.getBytes());
if(mySign.verify(sig))
System.out.println("\nFirma validada");
else
System.out.println("\nNo se ha podido validar la firma");
}catch(Exception e){
System.out.println(e);
}
}
static String convertBase64(byte[] data){
BASE64Encoder encoder = new BASE64Encoder();
String encoded = encoder.encodeBuffer(data);
return encoded;
}
}
