700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > pkcs1解密 springboot_Spring Boot RSA 非对称加密

pkcs1解密 springboot_Spring Boot RSA 非对称加密

时间:2018-05-13 02:04:12

相关推荐

pkcs1解密 springboot_Spring Boot RSA 非对称加密

/**

* @Fields CHARSET :

*/

public static final String CHARSET = "UTF-8";

/**

* @Description:RSA ALGORITHM

* @Fields RSA_ALGORITHM :

*/

public static final String RSA_ALGORITHM = "RSA";

/**

* @Title: getPublicKey

* @Description: 获取RSA公钥

* @Author Administrator

* @DateTime 11月19日 下午7:48:10

* @param publicKey

* @return

* @throws NoSuchAlgorithmException

* @throws InvalidKeySpecException

*/

public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {

//通过X509编码的Key指令获得公钥对象

KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));

RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);

return key;

}

/**

* @Title: getPrivateKey

* @Description: 获取RSA私钥

* @DateTime 11月19日 下午7:47:03

* @param privateKey 密钥字符串(经过base64编码)

* @return

* @throws NoSuchAlgorithmException

* @throws InvalidKeySpecException

*/

public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {

//通过PKCS#8编码的Key指令获得私钥对象

KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));

RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);

return key;

}

/**

* @Title: publicEncrypt

* @Description: 公钥加密

* @DateTime 11月19日 下午7:49:09

* @param data

* @param publicKey

* @return

*/

public static String publicEncrypt(String data, RSAPublicKey publicKey){

try{

Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));

}catch(Exception e){

throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);

}

}

/**

* @Title: privateDecrypt

* @Description: 私钥解密

* @DateTime 11月19日 下午7:49:36

* @param data

* @param privateKey

* @return

*/

public static String privateDecrypt(String data, RSAPrivateKey privateKey){

try{

Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, privateKey);

return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);

}catch(Exception e){

throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);

}

}

/**

* @Title: rsaSplitCodec

* @Description: RSA分割code

* @DateTime 11月19日 下午7:50:11

* @param cipher

* @param opmode

* @param datas

* @param keySize

* @return

*/

private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize){

int maxBlock = 0;

if(opmode == Cipher.DECRYPT_MODE){

maxBlock = keySize / 8;

}else{

maxBlock = keySize / 8 - 11;

}

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] buff;

int i = 0;

try{

while(datas.length > offSet){

if(datas.length-offSet > maxBlock){

buff = cipher.doFinal(datas, offSet, maxBlock);

}else{

buff = cipher.doFinal(datas, offSet, datas.length-offSet);

}

out.write(buff, 0, buff.length);

i++;

offSet = i * maxBlock;

}

}catch(Exception e){

throw new RuntimeException("加解密阀值为["+maxBlock+"]的数据时发生异常", e);

}

byte[] resultDatas = out.toByteArray();

IOUtils.closeQuietly(out);

return resultDatas;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。