基于JAVA的RSA非对称加密算法简单实现

2022-08-24 10:43:00 浏览数 (1)

什么是RSA

  RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

RSA实现

  在我们JAVA中,我们可以使用RSA生成公钥和私钥,公钥可以直接放在H5,APP等前端程序中,即使被拿到,想要用公钥破解出私钥也是极难的。可以先决定密钥长度后生成一套一对一关系的公私钥。公钥提供给前端,私钥放在服务端。 通过RSA公钥加密明文,加密后的密文发到服务端,服务端用RSA私钥解密得出明文。

下面是基于RSA的工具类,结合网上了的例子整理而来:

代码语言:javascript复制
public class RsaUtils { 
 /** 
     * 密钥长度,长度越长速度越慢 
     */ 
 private final static int KEY_SIZE = 1024; 
 /** 
     * 封装随机产生的公钥和私钥 
     */ 
 private static Map<Integer,String> keyMap = new HashMap(); 
 /** 
     * 随机生成密钥对 
     */ 
 public static Map<Integer,String> genKeyPair() throws NoSuchAlgorithmException{ 
 //基于RSA算法的公钥和私钥生成类 
 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); 
 //初始化密钥生成对 
        keyPairGen.initialize(KEY_SIZE, new SecureRandom()); 
 //生成一个密钥对保存在keypair当中 
 KeyPair keyPair = keyPairGen.genKeyPair(); 
 //获取私钥 
 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); 
 //获取公钥 
 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); 
 /*得到公钥和私钥字符串*/ 
 String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded()); 
 String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded()); 
 //将公钥和私钥保存到Map 
 /* 0:公钥; 1:私钥*/ 
        keyMap.put(0,publicKeyString); 
        keyMap.put(1,privateKeyString); 
 return  keyMap; 
 } 
 /** 
     * RSA公钥加密 
     * 
     * @param str 加密字符串 
     * @param publicKey 公钥 
     * @return 密文 
     * @throws Exception 加密过程中的异常信息 
     * NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException,InvalidKeyException, 
     * UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException 
     */ 
 public static String encrypt(String str, String publicKey) throws Exception { 
 byte[] strBytes = str.getBytes("UTF-8"); 
 //base64编码的公钥 
 byte[] decode = Base64.getDecoder().decode(publicKey); 
 RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode)); 
 //RSA算法加密 
 Cipher cipher = Cipher.getInstance("RSA"); 
        cipher.init(Cipher.ENCRYPT_MODE,pubKey); 
 String s = Base64.getEncoder().encodeToString(cipher.doFinal(strBytes)); 
 return s; 
 } 
 /** 
     * RSA私钥解密 
     * 
     * @param str        加密字符串 
     * @param privateKey 私钥 
     * @return 明文 
     * @throws Exception 解密过程中的异常信息 
     * BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, 
     * NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException 
     */ 
 public static String decrypt(String str, String privateKey) throws Exception{ 
 //64位解码加密后的字符串 
 byte[] inputByte = Base64.getDecoder().decode(str); 
 //base64加密后的私钥 
 byte[] decode = Base64.getDecoder().decode(privateKey); 
 RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decode)); 
 //RSA解密 
 Cipher cipher = Cipher.getInstance("RSA"); 
        cipher.init(Cipher.DECRYPT_MODE,priKey); 
 String s = new String(cipher.doFinal(inputByte)); 
 return s; 
 } 
} 

测试加密效果

  在main方法里执行以下代码,可以简单看一下效率,1024位的密文效率也还可以,推荐在项目中使用。

代码语言:javascript复制
public static void main(String[] args) throws Exception { 
 long startTime = System.currentTimeMillis(); 
 //生成公钥和私钥 
 Map<Integer,String> rsaKey = RsaUtils.genKeyPair(); 
 //加密字符串 
 System.out.println("公钥:" rsaKey.get(0)); 
 System.out.println("私钥:" rsaKey.get(1)); 
 System.out.println("生成密钥消耗时间:" (System.currentTimeMillis() - startTime) "ms"); 
 String message = "helloworld"; 
 System.out.println("原文:" message); 
    startTime = System.currentTimeMillis(); 
 //公钥加密 
 String encryptMessage = RsaUtils.encrypt(message, rsaKey.get(0)); 
 System.out.println("密文:" encryptMessage); 
 System.out.println("加密密文消耗时间:" (System.currentTimeMillis() - startTime) "ms"); 
 System.out.println("密文长度:" encryptMessage.length()); 
    startTime = System.currentTimeMillis(); 
 //私钥解密 
 String decryptMessage = RsaUtils.decrypt(encryptMessage, rsaKey.get(1)); 
 System.out.println("解密原文:" decryptMessage); 
 System.out.println("解密密文消耗时间:" (System.currentTimeMillis() - startTime) "ms"); 
} 

以上就是针对于RSA的简单使用,欢迎交流补充!

0 人点赞