你好陌生人,请不要试图越过权限文章,谢谢!

基于java的RSA-非对称加密算法的基本实现

RSA基本的介绍

  RSA(Rivest-Shamir-Adleman)算法是目前最常用的公钥加密算法。

1
2
3
4
5
  (1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

  (2)甲方获取乙方的公钥,然后用它对信息加密。

  (3)乙方得到加密后的信息,用私钥解密。

java的基本实现

需要的依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>

java代码基本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.jianfreespace;

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;


public class RSAUtils
{
private static Map<Integer,String> keyMap=new HashMap<>(){{
put(0,"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChd4T6x/6H+Kos2Amgcr3+LbNGuP8AYu0QwpOrpJpusTzVrRvtXoBR8+SXO9uKlymNQ7X+BTh79LlGxeYX0LvPjBtcIcw3SFNVBsLb1EhXTN1inaODEDnubkbnE9HiAPBRU0Zdr8RPM7a5CVxIohdX4V6tPdhcXOOHkLJDUyX5BwIDAQAB");
put(1,"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKF3hPrH/of4qizYCaByvf4ts0a4/wBi7RDCk6ukmm6xPNWtG+1egFHz5Jc724qXKY1Dtf4FOHv0uUbF5hfQu8+MG1whzDdIU1UGwtvUSFdM3WKdo4MQOe5uRucT0eIA8FFTRl2vxE8ztrkJXEiiF1fhXq092Fxc44eQskNTJfkHAgMBAAECgYBDFoPcJwisujcK1uB5F/O1Dov0kJzzLidN1WrB4GyCHYYnSfvWjnNGmc2awLYhSVlsZnvRhZ3IcxAgRc2qi4HcuxG/VhOkB8ajxENjGHFnixyu0vE8fwawgQBTm9amzgodffI8rhEYsuzY1Wqt9kNAgcVakuyE20LpV9cO5yLqQQJBAL7R8rYY7cVeBVhJfyqb6+smVPuApCVrMo7LAYu3gr6gLHRr69IKROo3s2kdq3H5bWrRBncc38Zvuz89Kz1Wm1ECQQDYns9tcJe3xNxbBDUyg/mLdILCa4ewSDkfDGPsJnTM7/jfFNvy2Cexx93C9YiNbHd5c0SV5Ci/hRJ7r0gf3wjXAkEAltfilN6p/05uzTb0ZttxKKdZoKM1nzrZcZW6+BauLUDzQ2kYtyZVCg3ULrE8mVGClGD+SmSx5OzoSXpyVv/CsQJBAJHJmBq0mzdP42nSFCdyUOF9QX+ttP18Lg1qXlmRrCw9GUayGDGBLn3k4KgUbZmYtXPkkvU6P/5dhgn99tGUXrMCQF1wXxJdMXZK2zYWrkdVU3aDzRx7HaZD5AWsEN1vSGXu50ph49KEBH12AuO1GLWu0inELzc2h6sfxVj7k3daGUA=");
}};



public RSAUtils(){

}

/**
* 随机生成密钥对
* @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表示私钥
System.out.println(keyMap);
}
/**
* RSA公钥加密
*
* @param str
* 加密字符串
*
* 公钥
* @return 密文
* @throws Exception
* 加密过程中的异常信息
*/
public static String encrypt(String str) throws Exception {
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(keyMap.get(0));
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
* 加密字符串
*
* 私钥
* @return 铭文
* @throws Exception
* 解密过程中的异常信息
*/
public static String decrypt(String str) throws Exception {
//Base64解码加密后的字符串
byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
//Base64编码的私钥
byte[] decoded = Base64.decodeBase64(keyMap.get(1));
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;

}
}


  调用RSA加密算法模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
try {
//生成公钥和私钥
RSAUtils.getKeyPair();
//加密字符串
String password="Jianfreespace";
String outstr = RSAUtils.encrypt(password);
String deoutstr = RSAUtils.decrypt(outstr);
System.out.println(outstr);
System.out.println(deoutstr);
InetAddress addr = InetAddress.getLocalHost();
System.out.println("Local HostAddress: "+addr.getHostAddress());
String hostname = addr.getHostName();
System.out.println("Local host name: "+hostname);
}catch (Exception e){
System.out.println(e);
}

}