为什么使用IDEA运行后控制台显示的密文会是乱码
时间: 2024-03-18 08:38:45 浏览: 129
在使用 Java 进行字符串编码时,Java 默认使用 Unicode 编码。当我们将加密后的字节数组转换为字符串输出时,如果直接使用 `new String(ciphertext)` 进行转换,那么输出的字符串可能会包含一些无法显示的字符,从而导致乱码的情况。
解决这个问题的方法是,将字节数组转换为 Base64 编码的字符串输出,这样就可以保证输出的字符串只包含可打印的 ASCII 字符,不会出现乱码。
具体来说,我们可以使用 Java 内置的 Base64 类库来进行编码和解码。修改加密和解密方法如下:
```java
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Base64;
public class RSA {
private final static BigInteger one = new BigInteger("1");
private final static SecureRandom random = new SecureRandom();
private BigInteger privateKey;
private BigInteger publicKey;
private BigInteger modulus;
// 生成公私钥对
public RSA(int bitLength) {
BigInteger p = BigInteger.probablePrime(bitLength / 2, random);
BigInteger q = BigInteger.probablePrime(bitLength / 2, random);
BigInteger phi = (p.subtract(one)).multiply(q.subtract(one));
modulus = p.multiply(q);
publicKey = new BigInteger("65537"); // 一般选择65537作为公钥
privateKey = publicKey.modInverse(phi);
}
// 加密
public String encrypt(String plaintext) {
byte[] message = plaintext.getBytes();
BigInteger ciphertext = new BigInteger(message).modPow(publicKey, modulus);
return Base64.getEncoder().encodeToString(ciphertext.toByteArray());
}
// 解密
public String decrypt(String ciphertext) {
byte[] message = Base64.getDecoder().decode(ciphertext);
BigInteger plaintext = new BigInteger(message).modPow(privateKey, modulus);
return new String(plaintext.toByteArray());
}
public static void main(String[] args) {
RSA rsa = new RSA(1024);
String message = "Hello, world!";
String ciphertext = rsa.encrypt(message);
String decrypted = rsa.decrypt(ciphertext);
System.out.println("Plaintext: " + message);
System.out.println("Ciphertext: " + ciphertext);
System.out.println("Decrypted: " + decrypted);
}
}
```
在修改后的代码中,加密方法将字节数组转换为 Base64 编码的字符串输出,解密方法则根据 Base64 编码的字符串恢复字节数组,然后再转换为明文字符串输出。这样就可以避免控制台输出乱码的问题。
阅读全文