package com.example.cipher.rsa;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
import org.junit.jupiter.api.Test;
public class RSATest {
public static final String PUBLIC_KEY = "publicKey";
public static final String PRIVATE_KEY = "privateKey";
public static final String RSA = "RSA";
/**
* 私钥加密,公钥解密
*/
@Test
public void rsaTest2() {
try {
// 明文
String plaintext = "12345";
System.out.println("plaintext = " + plaintext);
// 获取秘钥对
Map<String, byte[]> keyMap = generateKeyPair();
byte[] privateKeyBytes = keyMap.get(PRIVATE_KEY);
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
// 私钥
PrivateKey privateKey = KeyFactory.getInstance(RSA).generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance(RSA);
// 使用私钥加密
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
String encryptStr = Base64.getEncoder().encodeToString(encryptBytes);
System.out.println("encryptStr = " + encryptStr);
byte[] publicKeyBytes = keyMap.get(PUBLIC_KEY);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyBytes);
// 公钥
PublicKey publicKey = KeyFactory.getInstance(RSA).generatePublic(x509EncodedKeySpec);
// 使用公钥解密
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decryptBytes = cipher.doFinal(encryptBytes);
String decryptStr = new String(decryptBytes);
System.out.println("decryptStr = " + decryptStr);
// 断言:明文和解密后的字符串相等
assert plaintext.equalsIgnoreCase(decryptStr);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 公钥加密,私钥解密
*/
@Test
public void rsaTest1() {
try {
String plaintext = "12345";
System.out.println("plaintext = " + plaintext);
Map<String, byte[]> keyMap = generateKeyPair();
byte[] publicKeyBytes = keyMap.get(PUBLIC_KEY);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = KeyFactory.getInstance(RSA).generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance(RSA);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
String encryptStr = Base64.getEncoder().encodeToString(encryptBytes);
System.out.println("encryptStr = " + encryptStr);
byte[] privateKeyBytes = keyMap.get(PRIVATE_KEY);
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = KeyFactory.getInstance(RSA).generatePrivate(pkcs8EncodedKeySpec);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptBytes = cipher.doFinal(encryptBytes);
String decryptStr = new String(decryptBytes);
System.out.println("decryptStr = " + decryptStr);
assert plaintext.equalsIgnoreCase(decryptStr);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void generateKeyPairTest() {
Map<String, byte[]> keyMap = generateKeyPair();
String publicKeyStr = Base64.getEncoder().encodeToString(keyMap.get(PUBLIC_KEY));
String privateKeyStr = Base64.getEncoder().encodeToString(keyMap.get(PRIVATE_KEY));
System.out.println("publicKeyStr = " + publicKeyStr);
System.out.println();
System.out.println();
System.out.println("privateKeyStr = " + privateKeyStr);
}
/**
* 生成秘钥对
*
* @return Map<String, byte[]> 秘钥对
*/
private Map<String, byte[]> generateKeyPair() {
Map<String, byte[]> keyPairMap = new HashMap<>();
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA);
keyPairGenerator.initialize(4096, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
keyPairMap.put(PRIVATE_KEY, privateKey.getEncoded());
keyPairMap.put(PUBLIC_KEY, publicKey.getEncoded());
return keyPairMap;
} catch (Exception e) {
e.printStackTrace();
}
return keyPairMap;
}
}
在Java中,使用RSA实现加解密
最新推荐文章于 2024-08-27 12:12:26 发布