com.siashan.toolkit.crypt.asymmetric.RSA Maven / Gradle / Ivy
package com.siashan.toolkit.crypt.asymmetric;
import com.siashan.toolkit.crypt.BouncyCastleProvider;
import com.siashan.toolkit.crypt.CryptException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAKey;
/**
*
* RSA公钥/私钥/签名加密解密
*
*
* 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman)
*
*
* 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,
* 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全
*
*
* @author siashan
* @since 1.0.7
*
*/
public class RSA extends AsymmetricCrypto {
/** 默认的RSA算法 */
private static final AsymmetricAlgorithm ALGORITHM_RSA = AsymmetricAlgorithm.RSA;
// ------------------------------------------------------------------ Constructor start
/**
* 构造,生成新的私钥公钥对
*/
public RSA() {
super(ALGORITHM_RSA);
}
/**
* 构造,生成新的私钥公钥对
*
* @param rsaAlgorithm 自定义RSA算法,例如RSA/ECB/PKCS1Padding
*/
public RSA(String rsaAlgorithm) {
super(rsaAlgorithm);
}
// ------------------------------------------------------------------ Constructor end
public static RSA build(){
return new RSA();
}
public static RSA build(String algorithm){
return new RSA(algorithm);
}
@Override
public byte[] encrypt(byte[] data, Key key) {
// 在非使用BC库情况下,blockSize使用默认的算法
if (this.encryptBlockSize < 0 && null == BouncyCastleProvider.INSTANCE.getProvider()) {
// 加密数据长度 <= 模长-11
this.encryptBlockSize = ((RSAKey) key).getModulus().bitLength() / 8 - 11;
}
return super.encrypt(data, key);
}
@Override
public byte[] decrypt(byte[] bytes, Key key) {
// 在非使用BC库情况下,blockSize使用默认的算法
if (this.decryptBlockSize < 0 && null == BouncyCastleProvider.INSTANCE.getProvider()) {
// 加密数据长度 <= 模长-11
this.decryptBlockSize = ((RSAKey) key).getModulus().bitLength() / 8;
}
return super.decrypt(bytes, key);
}
@Override
protected void initCipher() {
try {
super.initCipher();
} catch (CryptException e) {
final Throwable cause = e.getCause();
if(cause instanceof NoSuchAlgorithmException) {
// 在Linux下,未引入BC库可能会导致RSA/ECB/PKCS1Padding算法无法找到,此时使用默认算法
this.algorithm = AsymmetricAlgorithm.RSA.getValue();
super.initCipher();
}
throw e;
}
}
}