使用椭圆曲线进行加密解密

来源: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自己事先做了分片。

[java]  view plain  copy
  1. import java.security.KeyPair;  
  2. import java.security.KeyPairGenerator;  
  3. import java.security.SecureRandom;  
  4. import java.security.Security;  
  5.   
  6. import javax.crypto.Cipher;  
  7.   
  8. import org.bouncycastle.jce.interfaces.ECPrivateKey;  
  9. import org.bouncycastle.jce.interfaces.ECPublicKey;  
  10.   
  11. public class ECTest {  
  12.   
  13.     static {  
  14.         Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());  
  15.     }  
  16.   
  17.     public static void main(String[] argu) throws Exception {  
  18.         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC",  
  19.                 "BC");  
  20.         keyPairGenerator.initialize(256new SecureRandom());  
  21.   
  22.         KeyPair kp = keyPairGenerator.generateKeyPair();  
  23.   
  24.         ECPublicKey publicKey = (ECPublicKey) kp.getPublic();  
  25.         ECPrivateKey privateKey = (ECPrivateKey) kp.getPrivate();  
  26.   
  27.         System.out.println(kp.getPrivate());  
  28.         System.out.println(kp.getPublic());  
  29.   
  30.         Cipher encrypter = Cipher.getInstance("ECIES""BC");  
  31.         Cipher decrypter = Cipher.getInstance("ECIES""BC");  
  32.         encrypter.init(Cipher.ENCRYPT_MODE, publicKey);  
  33.         decrypter.init(Cipher.DECRYPT_MODE, privateKey);  
  34.   
  35.         String text = "";  
  36.         for (int i = 0; i < 1024; i++) {  
  37.             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!@#";  
  38.         }  
  39.         byte[] e = encrypter.doFinal(text.getBytes("UTF-8"));  
  40.   
  41.         // System.out.println("Encrypted: " + Arrays.toString(e));  
  42.   
  43.         System.out.println("Encrypted, length = " + e.length);  
  44.   
  45.         byte[] de = decrypter.doFinal(e);  
  46.         String result = new String(de, "UTF-8");  
  47.   
  48.         // System.out.println("Decrypted :" + result);  
  49.         if (result.equals(text)) {  
  50.             System.out.println("OK!");  
  51.         }  
  52.     }  
  53. }  

你可能感兴趣的:(security)