Java实现ECC⾮对称加密算法加解密和签名验签
Java 实现 ECC ⾮对称加密算法加解密和签名验签
前⾔
⽂章字数⽐较多,可直接查看代码:,⽂中描述有误的地⽅欢迎各位⼤神指导。
⼀、ECC 椭圆曲线算法简介
ECC是椭圆曲线算法,其加密算法叫ECIES,签名算法叫ECDSA。JDK 并不⽀持 ECC 算法,可以引⼊ BouncyCastle 库使⽤。ECC算法相当耗费资源,如果单纯使⽤CPU进⾏加密/解密,效率低下。
引⼊ BouncyCastle 库
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.64</version>
</dependency>
⼆、ECC 加解密代码实例
1.⽣成 ECC 密钥
由于 BouncyCastle 库对 keysize 有指定要求的,可以看 BouncyCastle 库中的类:KeyPairGeneratorSpi,从中可以看出⽀持的keysize 就这么⼏个:192、239、256、224、384、521。
注意: 需要使⽤静态初始化块初始化 Provider,常量 EC_ALGORITHM = ”EC“ EC_PROVIDER = “BC”
代码如下:
/**
* ⽣成密钥对
*
* @param keysize 密钥长度
* @return
*/
public static KeyPair generateECCKeyPair(int keysize){
try{
// 获取指定算法的密钥对⽣成器
KeyPairGenerator generator = Instance(EC_ALGORITHM, EC_PROVIDER);
// 初始化密钥对⽣成器(指定密钥长度, 使⽤默认的安全随机数源)
generator.initialize(keysize);
// 随机⽣成⼀对密钥(包含公钥和私钥)
ateKeyPair();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
2.ECC 加解密
ECIES_ALGORITHM = “ECIES”
EC_PROVIDER = “BC”
代码如下:
*/
public static byte[]eccEncrypt(PublicKey publicKey,byte[] plain){
try{
Cipher cipher = Instance(ECIES_ALGORITHM, EC_PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(plain);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* ECC 解密
*
* @param privateKey  私钥
* @param encrypted   密⽂
* @return 原⽂
*/
public static byte[]eccDecrypt(PrivateKey privateKey,byte[] encrypted){
try{
Cipher cipher = Instance(ECIES_ALGORITHM, EC_PROVIDER);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(encrypted);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
3.测试代码
public static void main(String[] args){
// 测试⽂本
byte[] plain ="123".getBytes();
// ⽣成密钥对
KeyPair keyPair =generateECCKeyPair(256);
PublicKey publicKey = Public();
PrivateKey privateKey = Private();
// 加解密
byte[] encrypt =eccEncrypt(publicKey, plain);
byte[] decrypt =eccDecrypt(privateKey, encrypt);
}
三、ECC 签名验签代码实例
签名验签使⽤的密钥同上,签名算法使⽤:SHA256withECDSA 即 SIGNATURE = “SHA256withECDSA”。
1. ECC 签名验签
*/
public static byte[]eccSign(PrivateKey privateKey,byte[] plain){
try{
Signature signature = Instance(SIGNATURE);
signature.initSign(privateKey);
signature.update(plain);
return signature.sign();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 公钥验签
*
* @param publicKey 公钥
* @param plain    原⽂
* @param sign      签名
* @return
*/
public static boolean eccVerify(PublicKey publicKey,byte[] plain,byte[] sign){ try{
Signature signature = Instance(SIGNATURE);
signature.initVerify(publicKey);
signature.update(plain);
return signature.verify(sign);
}catch(Exception e){
e.printStackTrace();
}
return false;
}
2. 测试代码
public static void main(String[] args){
// 测试⽂本
byte[] plain ="123".getBytes();
// ⽣成密钥对
KeyPair keyPair =generateECCKeyPair(256);
PublicKey publicKey = Public();
java源代码加密
PrivateKey privateKey = Private();
// 签名验签
byte[] sign =eccSign(privateKey, plain);
boolean verify =eccVerify(publicKey, plain, sign);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。