Spring Boot RSA 非对称加密

Spring Boot RSA 非对称加密

现在做项目需要用到RSA非对称加密,具体原理可以参考 RSA非对称加密 。这里就看我在Spring Boot中如何使用吧。
1.maven 依赖

        <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.60</version></dependency>
  1. 生成公钥和私钥
 /*** @Title: createKeys* @Description: 产生RSA公钥和私钥* @param keySize* @return */   public static Map<String, String> createKeys(int keySize){//为RSA算法创建一个KeyPairGenerator对象KeyPairGenerator kpg;try{kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);}catch(NoSuchAlgorithmException e){throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");}//初始化KeyPairGenerator对象,密钥长度kpg.initialize(keySize);//生成密匙对KeyPair keyPair = kpg.generateKeyPair();//得到公钥Key publicKey = keyPair.getPublic();String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded());//得到私钥Key privateKey = keyPair.getPrivate();String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded());Map<String, String> keyPairMap = new HashMap<String, String>();keyPairMap.put("publicKey", publicKeyStr);keyPairMap.put("privateKey", privateKeyStr);RSAPublicKey rsp= (RSAPublicKey)keyPair.getPublic();BigInteger bit= rsp.getModulus();byte[] b=bit.toByteArray();byte[] deBase64Value=Base64.encodeBase64(b);String retValue= new String(deBase64Value);keyPairMap.put("model",retValue);return keyPairMap;}

3.产生的公钥和私钥
MODULUS_KEY_STRING 是 react native rsa 库需要的一种格式的公钥。

    public static final String PUBLIC_KEY_STRING = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJwrINe6ILTYDjX7DscmV30pJhaJHxnGs0SiNRdIcI5rF9JHfANHshy4oaSWa/BXmxfS3xkSDYr2A8IQwTNlhk0CAwEAAQ==";/*** @Description:RSA 私钥* @Fields PRIVATE_KEY_STRING : */public static final String PRIVATE_KEY_STRING = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAnCsg17ogtNgONfsOxyZXfSkmFokfGcazRKI1F0hwjmsX0kd8A0eyHLihpJZr8FebF9LfGRINivYDwhDBM2WGTQIDAQABAkBzfWmSX/FkDAumW/33xSEaTF4AeHNpiop0jUiZ6VZj2yNLd2GrekZsdhP6P3F4oLvMsKFg0/IZAJvOD21gK2cBAiEAyO2uYQHrCbeku+NSLcpdVaVT7vyYJYhzqbekkOQJVS0CIQDG+NMjgUBWAGDFKbeKeUDec0PHUMWoF4nhMcHAGaXpoQIgDF+20XqQwvRwTLHfKbrArLmVxa4AoK8akGUi2VlxybECICMpyjaWGwaX3oI5kyQ3tY0albndvnCsaEOSBYmrfrTBAiAxW1IkfFPRmGrtYTTlkC4wjp4gIL4qY+ODw1jLd0SUrw==";/*** APP 需要的公钥* @Fields MODULUS_KEY_STRING : */public static final String MODULUS_KEY_STRING ="AJwrINe6ILTYDjX7DscmV30pJhaJHxnGs0SiNRdIcI5rF9JHfANHshy4oaSWa/BXmxfS3xkSDYr2A8IQwTNlhk0=";

4.RSAUtil 工具类

    /*** @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 2018年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 2018年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 2018年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 2018年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 2018年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;}

5.测试类

@Testpublic void test () throws Exception {Map<String, String> keyPairMap = createKeys(512);System.out.println("-----公钥----\n"+keyPairMap.get("publicKey"));System.out.println("-----私钥----\n"+keyPairMap.get("privateKey"));//System.out.println("-----私钥----\n"+keyPairMap.get("modles"));String data= "abc122";//1.用公钥加密String encode=getPublicKey(data,getPublicKey(keyPairMap.get("publicKey")));System.out.println("-----加密结果----\n"+encode);//1.用私钥解密String decodeResult=privateDecrypt(encode,getPrivateKey(keyPairMap.get("privateKey")));System.out.println("-----解密结果----\n"+decodeResult);}

6.运行结果
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部