JDK7新实现了椭圆曲线加密算法(EC)。以前没有EC,只能借助第三方库,比如bouncy-castle。现在有了就简单一些。遗憾的是目前只实现了数据校验(Signature),而没有实现加密解密(RSA两者都实现了)。
下面是一个例子。首先是一段验证的程序(网上转的)
// Test EC exists
Provider sunEC = new SunEC();
Security.addProvider(sunEC);
for(Service service : sunEC.getServices()) {
System.out.println(service.getType() + ": "
+ service.getAlgorithm());
}
输出结果是
KeyFactory: EC
AlgorithmParameters: EC
Signature: NONEwithECDSA
Signature: SHA1withECDSA
Signature: SHA256withECDSA
Signature: SHA384withECDSA
Signature: SHA512withECDSA
KeyPairGenerator: EC
KeyAgreement: ECDH
可见已经实现了EC的签名算法。
下面是个例子,用EC来生成一对密钥,用私钥对数据生成签名,然后用公钥来验证数据是否完整:
//Create a key pair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
keyGen.initialize(256);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();
System.out.println(privateKey + "\n" + publicKey);
String input = "abc";
//这里选用上面输出的一个签名算法
Signature signer = Signature.getInstance("SHA256withECDSA");
//用生成的私钥初始化签名
signer.initSign(privateKey);
signer.update(input.getBytes());
byte[] sign = signer.sign();
//得到签名,现在签名可以发给第三方了
System.out.println("\nSource is " + input);
System.out.println(" Sign = " + Arrays.toString(sign));
//现在验证。第三方程序内部保存publicKey。现在拿到了签名和数据。
Signature verifier = Signature.getInstance("SHA256withECDSA");
verifier.initVerify(publicKey);
//第三方的数据abc,用签名来验证是否和数据一致
String c = "abc";
verifier.update(c.getBytes());
boolean b = verifier.verify(sign);
System.out.println(" Sign result : " + b); //输出结果