2015-07-16 1 views
0

Je ne trouve pas de bonne documentation (complète) sur la façon d'échanger un message signé public/clé privée en Java.Comment envoyer et recevoir un message signé public/privé DSA en Java

Je n'ai pas encore trouvé un document concis sur les étapes minimales nécessaires pour générer une clé publique et une clé privée en utilisant DSA, signez un octet [] et vérifiez-le.

Le documentation d'Oracle est trop fragmenté et nécessite d'être exécuté sur plusieurs JVM.

Répondre

1

J'ai signé avec succès un tableau d'octets avec une clé privée et vérifié avec une clé publique.

Exemple.

byte[] data = "hello.".getBytes(); 

    /* Test generating and verifying a DSA signature */ 
    try { 
     /* generate a key pair */ 
     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA"); 
     keyGen.initialize(1024, new SecureRandom()); 
     KeyPair pair = keyGen.generateKeyPair(); 

     /* create a Signature object to use 
     * for signing and verifying */ 
     Signature dsa = Signature.getInstance("SHA/DSA"); 

     /* initialize the Signature object for signing */ 
     PrivateKey priv = pair.getPrivate(); 
     dsa.initSign(priv); 

     /* Update and sign the data */ 
     dsa.update(data); 

     /* Now that all the data to be signed 
     * has been read in, sign it */ 
     byte[] sig = dsa.sign(); 

     /* Verify the signature */ 

     /* Initialize the Signature object for verification */ 
     PublicKey pub = pair.getPublic(); 
     dsa.initVerify(pub); 

     /* Update and verify the data */ 
     dsa.update(data); 

     boolean verifies = dsa.verify(sig); 
     Assert.assertTrue(verifies); 
    } catch (Exception e) { 
     System.err.println("Caught exception " + e.toString()); 
    } 

Dans cette version, je sérialiser la clé publique dans un tableau d'octets, puis créer un PublicKey à partir de ce tableau d'octets.

byte[] data = "hello.".getBytes(); 

    /* Test generating and verifying a DSA signature */ 
    try { 
     /* generate a key pair */ 
     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA"); 
     keyGen.initialize(1024, new SecureRandom()); 
     KeyPair pair = keyGen.generateKeyPair(); 

     /* create a Signature object to use 
     * for signing and verifying */ 
     Signature dsa = Signature.getInstance("SHA/DSA"); 

     /* initialize the Signature object for signing */ 
     PrivateKey priv = pair.getPrivate(); 
     dsa.initSign(priv); 

     /* Update and sign the data */ 
     dsa.update(data); 

     /* Now that all the data to be signed 
     * has been read in, sign it */ 
     byte[] sig = dsa.sign(); 

     /* Verify the signature */ 

     /* Initialize the Signature object for verification */ 
     PublicKey pub = pair.getPublic(); 
     /* Encode the public key into a byte array */ 
     byte[] encoded = pub.getEncoded(); 
     /* Get the public key from the encoded byte array */ 
     PublicKey fromEncoded = KeyFactory.getInstance("DSA", "SUN").generatePublic(new X509EncodedKeySpec(encoded)); 
     dsa.initVerify(fromEncoded); 

     /* Update and verify the data */ 
     dsa.update(data); 

     boolean verifies = dsa.verify(sig); 
     Assert.assertTrue(verifies); 
    } catch (Exception e) { 
     System.err.println("Caught exception " + e.toString()); 
    }