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

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: " + Arrays.toString(e));

		System.out.println("Encrypted, length = " + e.length);

		byte[] de = decrypter.doFinal(e);
		String result = new String(de, "UTF-8");

		// System.out.println("Decrypted :" + result);
		if (result.equals(text)) {
			System.out.println("OK!");
		}
	}
}


你可能感兴趣的:(程序)