来源:http://blog.csdn.net/lff0305/article/details/49492711
JDK中自带了椭圆曲线的签名,但是没有实现椭圆曲线的加密解密。不过bouncycastle库实现了,下面的代码需要bouncycastle库。
需要做的准备工作:
1. 去JDK的下载页面,下载
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8
这个东西。这个是为了解除默认JDK中的加密强度的限制。不使用这个可能会报错。
2. 下载bouncycastle的jar文件,加入classpath中。
最后是代码了。比较简单。见下文。在此比较下EC和RSA的优缺点:
RSA的优点:JDK自己支持。不需要第三方库。同时支持RSA的开发库也很多(最典型的就是OpenSSL)
EC的缺点:需要第三方库,需要更新(1)的文件,支持的广度比不上RSA。
EC的优点:1,在达到相同加密程度下,EC需要的秘钥长度比RSA要短得多
2,bouncycastle实现的EC加密算法,对密文长度的限制比较松。在下面的测试程序中构造了一个长字符串加密,没有报错。RSA的加密则是有限制的,必须分片。不过我不知道是不是bouncycastle自己事先做了分片。
import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.Security; import javax.crypto.Cipher; import org.bouncycastle.jce.interfaces.ECPrivateKey; import org.bouncycastle.jce.interfaces.ECPublicKey; public class ECTest { static { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); } public static void main(String[] argu) throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC" , "BC" ); keyPairGenerator.initialize(256 , new SecureRandom()); KeyPair kp = keyPairGenerator.generateKeyPair(); ECPublicKey publicKey = (ECPublicKey) kp.getPublic(); ECPrivateKey privateKey = (ECPrivateKey) kp.getPrivate(); System.out.println(kp.getPrivate()); System.out.println(kp.getPublic()); Cipher encrypter = Cipher.getInstance("ECIES" , "BC" ); Cipher decrypter = Cipher.getInstance("ECIES" , "BC" ); encrypter.init(Cipher.ENCRYPT_MODE, publicKey); decrypter.init(Cipher.DECRYPT_MODE, privateKey); String text = "" ; for ( int i = 0 ; i < 1024 ; i++) { text += "This is a test!@#$This is a test!@#$This is a test!@#This is a test!@#$This is a test!@#$This is a test!@#This is a test!@#$This is a test!@#$This is a test!@#" ; } byte [] e = encrypter.doFinal(text.getBytes( "UTF-8" )); System.out.println("Encrypted, length = " + e.length); byte [] de = decrypter.doFinal(e); String result = new String(de, "UTF-8" ); if (result.equals(text)) { System.out.println("OK!" ); } } }