2012-07-05 14 views
11

Puoi aiutarmi a trovare un semplice tutorial su come firmare una stringa utilizzando l'algoritmo ECDSA in java. Ma senza usare librerie di terze parti come il bouncycastle. Solo JDK 7. Ho trovato difficile cercare un semplice esempio, sono nuovo della crittografia.Esercitazione sull'algoritmo ECDSA per firmare una stringa


import java.io.*; 
import java.security.*; 

public class GenSig { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     /* 
     * Generate a DSA signature 
     */ 

     try { 

      /* 
      * Generate a key pair 
      */ 

      KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN"); 
      SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 

      keyGen.initialize(1024, random); 

      KeyPair pair = keyGen.generateKeyPair(); 
      PrivateKey priv = pair.getPrivate(); 
      PublicKey pub = pair.getPublic(); 

      /* 
      * Create a Signature object and initialize it with the private key 
      */ 

      Signature dsa = Signature.getInstance("SHA1withDSA", "SUN"); 

      dsa.initSign(priv); 

      String str = "This is string to sign"; 
      byte[] strByte = str.getBytes(); 
      dsa.update(strByte); 

      /* 
      * Now that all the data to be signed has been read in, generate a 
      * signature for it 
      */ 

      byte[] realSig = dsa.sign(); 
      System.out.println("Signature: " + new String(realSig)); 


     } catch (Exception e) { 
      System.err.println("Caught exception " + e.toString()); 
     } 
    } 
} 

Come modificare per ECDSA?

+0

cercare qualsiasi esempio che utilizza DSA, ma utilizzare questi algoritmi invece: [Provider CE] (http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html #SunEC) –

+0

ad esempio se utilizzo questo tutorial, cosa dovrei cambiare qui? http://www.java2s.com/Code/Java/Security/Testthesignature.htm o utilizzando questo http://docs.oracle.com/javase/tutorial/security/apisign/step1.html dovrei inserire invece di dsa ECDSA? – user1379574

+2

Accettare alcune risposte facendo clic sul segno V accanto a quello corretto. Oppure dicci (e in questo caso a GregS) perché la domanda non ha avuto una risposta soddisfacente. –

risposta

15

Ecco un piccolo esempio basato sul tuo esempio.

import java.math.BigInteger; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.SecureRandom; 
import java.security.Signature; 

public class ECDSAExample { 

    public static void main(String[] args) throws Exception { 
     /* 
     * Generate an ECDSA signature 
     */ 

     /* 
     * Generate a key pair 
     */ 

     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC"); 
     SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 

     keyGen.initialize(256, random); 

     KeyPair pair = keyGen.generateKeyPair(); 
     PrivateKey priv = pair.getPrivate(); 
     PublicKey pub = pair.getPublic(); 

     /* 
     * Create a Signature object and initialize it with the private key 
     */ 

     Signature dsa = Signature.getInstance("SHA1withECDSA"); 

     dsa.initSign(priv); 

     String str = "This is string to sign"; 
     byte[] strByte = str.getBytes("UTF-8"); 
     dsa.update(strByte); 

     /* 
     * Now that all the data to be signed has been read in, generate a 
     * signature for it 
     */ 

     byte[] realSig = dsa.sign(); 
     System.out.println("Signature: " + new BigInteger(1, realSig).toString(16)); 

    } 
} 
+1

Che curva sarebbe? P-256? –

+1

Avevo paura che qualcuno lo chiedesse. Non lo so, P-256 sarebbe la mia ipotesi però. –

+0

Si, sembra –