公司最近需要使用非对称加密算法进行数据加密,本来打算采用RSA的,但是CTO强制使用ECC加密算法;没办法,硬着头皮整吧!
网上的千篇一律,写法都差不多,但是有一个问题,公钥和私钥永远不会发生变法,这就比较尴尬了,而且数学学的又不是特比好,真的是很尴尬。
不过后面还是搞出来了,这里直接上代码吧!
ECC定义的常量,方便调用
package com.ktnw.utils.ecc;
public enum ECCEnum {
ALGORITHM("EC"),
PROVIDER("BC"),
PUBLIC_KEY("PUBLIC_KEY"),
PRIVATE_KEY("PRIVATE_KEY");
private String value;
ECCEnum(String value) {
this.value = value;
}
public String value() {
return this.value;
}
}
ECC加密、解密封装
package com.ktnw.utils.ecc;
import com.ktnw.utils.encrypt.BASE64Decoder;
import javax.crypto.Cipher;
import javax.crypto.NullCipher;
import java.io.Serializable;
import java.security.KeyFactory;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* ecc 加密/解密
*/
public class ECCUtil implements Serializable {
/**
* 加密
* @param data
* @param publicKey
* @return
* @throws Exception
*/
public static byte[] encrypt(byte[] data, String publicKey)
throws Exception {
byte[] keyBytes = BASE64Decoder.decodeBuffer(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(ECCEnum.ALGORITHM.value());
ECPublicKey pubKey = (ECPublicKey) keyFactory
.generatePublic(x509KeySpec);
Cipher cipher = new NullCipher();
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return cipher.doFinal(data);
}
/**
* 解密
* @param data
* @param privateKey
* @return
* @throws Exception
*/
public static byte[] decrypt(byte[] data, String privateKey) throws Exception {
byte[] keyBytes = BASE64Decoder.decodeBuffer(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(ECCEnum.ALGORITHM.value());
ECPrivateKey priKey = (ECPrivateKey) keyFactory
.generatePrivate(pkcs8KeySpec);
Cipher cipher = new NullCipher();
cipher.init(Cipher.DECRYPT_MODE, priKey);
return cipher.doFinal(data);
}
}
ECC 公钥、私钥生成器
package com.ktnw.utils.ecc;
import com.ktnw.utils.encrypt.BASE64Encoder;
import org.bouncycastle.jce.interfaces.ECPrivateKey;
import org.bouncycastle.jce.interfaces.ECPublicKey;
import java.io.Serializable;
import java.security.*;
import java.util.HashMap;
import java.util.Map;
public class GenerateKey implements Serializable {
static {
Security.addProvider(new