您能帮我找到一个简单的教程,如何使用Java中的ECDSA算法对字符串进行签名。但不使用bouncycastle之类的任何第三方库。只是JDK7。我发现很难搜索一个简单的例子,我是密码学的新手。
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()); } } }
如何为ECDSA修改它?
这是基于您的示例的小示例。
注意: 这是此答案的原始代码,请参阅下一个代码片段以获取更新的版本。
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)); } }
更新:这是删除过时算法的稍微改进的示例。它还使用RFC 8422中指定的SECG标记“ secp256r1”明确请求NIST P-256曲线。
import javax.xml.bind.DatatypeConverter; import java.security.*; import java.security.spec.ECGenParameterSpec; public class ECDSAExample { /** * @param args the command line arguments */ public static void main(String[] args) throws Exception { /* * Generate an ECDSA signature */ /* * Generate a key pair */ KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC"); keyGen.initialize(new ECGenParameterSpec("secp256r1"), new SecureRandom()); KeyPair pair = keyGen.generateKeyPair(); PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic(); /* * Create a Signature object and initialize it with the private key */ Signature ecdsa = Signature.getInstance("SHA256withECDSA"); ecdsa.initSign(priv); String str = "This is string to sign"; byte[] strByte = str.getBytes("UTF-8"); ecdsa.update(strByte); /* * Now that all the data to be signed has been read in, generate a * signature for it */ byte[] realSig = ecdsa.sign(); System.out.println("Signature: " + new BigInteger(1, realSig).toString(16)); } }