RSA 加解密
依赖
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>
代码
import org.apache.commons.codec.binary.Base64; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.io.UnsupportedEncodingException; import java.security.*; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; /** * Hello RSA! * */ public class RSAUtils { private static Map<Integer,String> keyMap=new HashMap<>(); public static void main( String[] args ) throws Exception { //生成公钥和私钥 // getKeyPair(); //加密字符串 String password="3"; String pub = "MIGfMA0GCSqGSIbzz2MwNFGC7XQmiQJQhtwzJnDGr8fCPQIDAQAB"; String pri = "655"; System.out.println("随机生成的公钥为:" + pub); System.out.println("随机生成的私钥为:"+ pri); String passwordEn=encrypt(password,pub); System.out.println(password+"\t加密后的字符串为:"+passwordEn); String passwordDe=decrypt(passwordEn,pri); System.out.println("还原后的字符串为:"+passwordDe); } /** * 随机生成密钥对 * @throws NoSuchAlgorithmException */ public static void getKeyPair() throws Exception { //KeyPairGenerator类用于生成公钥和密钥对,基于RSA算法生成对象 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); //初始化密钥对生成器,密钥大小为96-1024位 keyPairGen.initialize(1024,new SecureRandom()); //生成一个密钥对,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate();//得到私钥 PublicKey publicKey = keyPair.getPublic();//得到公钥 //得到公钥字符串 String publicKeyString=new String(Base64.encodeBase64(publicKey.getEncoded())); //得到私钥字符串 String privateKeyString=new String(Base64.encodeBase64(privateKey.getEncoded())); //将公钥和私钥保存到Map keyMap.put(0,publicKeyString);//0表示公钥 keyMap.put(1,privateKeyString);//1表示私钥 } /** * RSA公钥加密 * * @param str * 加密字符串 * @param publicKey * 公钥 * @return 密文 * @throws Exception * 加密过程中的异常信息 */ public static String encrypt(String str,String publicKey) throws Exception { //base64编码的公钥 byte[] decoded = Base64.decodeBase64(publicKey); RSAPublicKey pubKey= (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); //RAS加密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE,pubKey); String outStr=Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8"))); return outStr; } /** * RSA私钥解密 * * @param str * 加密字符串 * @param privateKey * 私钥 * @return 铭文 * @throws Exception * 解密过程中的异常信息 */ public static String decrypt(String str,String privateKey) throws Exception { //Base64解码加密后的字符串 byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); //Base64编码的私钥 byte[] decoded = Base64.decodeBase64(privateKey); PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSA解密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE,priKey); String outStr=new String(cipher.doFinal(inputByte)); return outStr; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-10-25 c语言猜数字
2020-10-25 判断一个数是否是回文数
2018-10-25 自动部署war包脚本