前言RSA公钥密码体制是一种使用不同加密密钥的加密密钥和解密密钥,“从已知加密密钥推导出解密密钥在计算上不可行”的密码系统。原理根据数论,求两个大素数比较简单,但要分解它们的乘积却极其困难。因此,乘积可以公开为加密密钥,即公钥,两个大质数可以合成私钥。公钥是可以公开的,任何人都可以使用,私钥是自己拥有的,可以解密。计算速度由于要计算大数,所以RSA最快的情况无论是软件实现还是硬件实现都要比DES慢好几倍。速度一直是RSA的短板。一般只用于少量数据的加密。RSA的速度比同等安全级别对应的对称加密算法慢1000倍左右。其他链接RSA加密-VueRSA分段加密-JavaRSA分段解密-Vue具体实现实现类RSAPublicKey;导入java.security.spec.PKCS8EncodedKeySpec;导入java.security.spec.X509EncodedKeySpec;导入java.util.Base64;/***@DescriptionRSA加密算法*@authorcoisini*@date2021年7月5日*@Version1.0*/publicclassRSAUtil{privatestaticfinalStringALGO="RSA";privatestaticfinalStringCHARSET="UTF-8";/***公钥由generateKeyPair()生成*/privatestaticfinalStringPUBLIC_KEY="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaaI4MBywkCjIppZnraqN3pbrcZTq/t0+aMBo8K3pK9BDD6XkM6N2Yfcva7BSFbUWuAcI7piXak0UKn9CElDuhNzUSgQn4IXKxIt3Iva5cV83qYumj+0yRjjLT8Muu1Y1rgBZjY9oBwhVoV+Twg25+UJ+6Q6HM4xTwQQJDoyy4jwIDAQAB";/***私钥由generateKeyPair()生成*/privatestaticfinalStringPRIVATE_KEY="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJpojgwHLCQKMimlmetqo3elutxlOr+3T5owGjwrekr0EMPpeQzo3Zh9y9rsFIVtRa4BwjumJdqTRQqf0ISUO6E3NRKBCfghcrEi3ci9rlxXzepi6aP7TJGOMtPwy67VjWuAFmNj2gHCFWhX5PCDbn5Qn7pDoczjFPBBAkOjLLiPAgMBAAECgYBnBBKhG7frY5IMDxwd4Euna767hB4qAlbte+JE+ozgrOzyiDXm0wXk0yjKqm8WhczTRwEbYsImjdKmP/GSQoN1AU7yEzM8j0Jgq46m9ZVrHhu2NpuZpr+XueWnA6FNz6tybBgcCwA4t8dvfbOrvjqhrCu01O1xWIpjronyFBN4IQJBAPGuF58xjXyANnp5YU8NhUQ73tTIveRlOpMXDSYkf9lWG26XIGUIsTe0f5jssiNmYtxG+lUm9LLfZgOLcrVkDZ0CQQCjjrBNMXub49efVTCg+nCGT2QXW2BHg/qs5vu8Y34LUHoD/hoEJ+AOWOdnhpRoYOpBwJAm3Gu4a1VmZGGafp0bAkAdfY3aWhSWtZpwNXF/UPoLCnc1Zc1uGkAchLqRBfEn1w7/3qcQTRA66OaNBYzzLuIvWOXhECDZ1tK+6fw0UCItAkAOLibW6n1fDKf7JnWq30u2OVfiNofoa2bmarhUowOgk3+grP0wcwyX8dlOPnrLeeuVe86DsASe3p9u2zEjJesVAkEAhkLiv4TXrC1QlJl7ghksUfFmdT7M4Zxlzj10ConMgq68HkLdmn2nNLsjhUHGwJe3EqM6aozn4zw/Z7uPIT9Fsw==";/***生成密钥对*@throwsNoSuchAlgorithmException*/privatestaticvoidgenerateKeyPair()throwsNoSuchAlgorithmException{//KeyPairGenerator类用于生成公私钥对,基于RSA算法生成对象KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance(ALGO);//初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024,newSecureRandom());//生成密钥对保存在keyPair中KeyPairkeyPair=keyPairGen.generateKeyPair();//获取私钥RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();//获取公钥RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();StringpublicKeyString=newString(Base64.getEncoder().encode(publicKey.getEncoded()));//获取私钥字符串StringprivateKeyString=newString(Base64.getEncoder().encode((privateKey.getEncoded())));System.out.println(publicKeyString);System.out.println(privateKeyString);}/***RSA公钥加密*@paramdataencryptedstring*@returnciphertext*@throwsException加密时的异常信息*/privatestaticStringencryptByPublicKey(Stringdata)throwsException{//base64编码的公钥byte[]decoded=Base64.getDecoder().decode(PUBLIC_KEY);RSAP公钥pubKey=(RSAPublicKey)KeyFactory.getInstance(ALGO).generatePublic(newX509EncodedKeySpec(decoded));//RSA加密Ciphercipher=Cipher.getInstance(ALGO);//公钥加密cipher.init(Cipher.ENCRYPT_MODE,pubKey);返回Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes(CHARSET)));}/***RSA私钥解密*@paramdata加密字符串*@returnplaintext*@throwsExceptionDuringdecryptionExceptioninformation*/privatestaticStringdecryptByPrivateKey(Stringdata)throwsException{byte[]inputByte=Base64.getDecoder().decode(data.getBytes(字符集));//Base64编码私钥byte[]decoded=Base64.getDecoder().decode(PRIVATE_KEY);RSAPrivateKeypriKey=(RSAPrivateKey)KeyFactory.getInstance(ALGO).generatePrivate(newPKCS8EncodedKeySpec(解码));//RSA解密Ciphercipher=Cipher.getInstance(ALGO);//私钥解密cipher.init(Cipher.DECRYPT_MODE,priKey);返回新字符串(cipher.doFinal(inputByte));}/***私钥加密*之前终端公钥解密*@paramdataencryptedstring*@returnciphertext*@throwsException加密时的异常信息*/publicstaticStringencryptByPrivateKey(Stringdata)throwsException{//获取私钥PrivateKeyprivateKey=getPrivateKey(PRIVATE_KEY);密码cipher=Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,privateKey);byte[]cipherText=cipher.doFinal(data.getBytes());字符串cipherStr=Base64.getEncoder()。encodeToString(密码文本);返回密码;}/***公钥解密*@paramdatadecryptedstring*@returnplaintext*@throwsException解密时的异常信息*/publicstaticStringdecryptByPublicKey(Stringdata)throwsException{//获取公钥PublicKeypublicKey=getPublicKey(公钥);密码cipher=Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE,publicKey);byte[]cipherText=Base64.getDecoder().decode(数据);byte[]decryptText=cipher.doFinal(cipherText);返回新字符串(解密文本);}/***将base64编码的私钥字符串转换成PrivateKey实例*@paramprivateKey私钥*@returnPrivateKey实例*@throwsException异常信息*/privatestaticPrivateKeygetPrivateKey(StringprivateKey)throwsException{byte[]keyBytes=Base64.getDecoder().decode(privateKey);PKCS8EncodedKeySpeckeySpec=newPKCS8EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance(ALGO);返回keyFactory.generatePrivate(keySpec);}/***base64编码将公钥字符串转换为PublicKey实例*@parampublicKey公钥*@returnPublicKey实例*@throwsException异常信息*/privatestaticPublicKeygetPublicKey(StringpublicKey)throwsException{byte[]keyBytes=Base64.getDecoder().decode(公钥);X509EncodedKeySpeckeySpec=newX509EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance(ALGO);返回keyFactory.generatePublic(keySpec);}publicstaticvoidmain(String[]args){Stringdata="RSA加密!";尝试{//generateKeyPair();字符串encryDataByPublicKey=encryptByPublicKey(数据);System.out.println("encryDataByPublicKey:"+encryDataByPublicKey);字符串decryDataByPrivateKey=decryptByPrivateKey(encryDataByPublicKey);System.out.println("decryDataByPrivateKey:"+decryDataByPrivateKey);字符串encryDataByPrivateKey=encryptByPrivateKey(数据);System.out.println("encryDataByPrivateKey:"+encryDataByPrivateKey);字符串decryDataByPublicKey=decryptByPublicKey(encryDataByPrivateKey);System.out.println("decryDataByPublicKey:"+decryDataByPublicKey);}catch(Exceptione){e.printStackTrace();}}}结果如下所示:源码GitHub:https://github.com/Maggieq8324/coisini-rsaGitee:https://gitee.com/maggieq8324/coisini-rsa$$-End-$$
