通过在线RSA,生成对一对公钥、私钥,公钥加密字符串,公钥加密字符串,私钥解密,在线通过测试(加密前文本与解密后文本一致,结果为good luck),然后将用Android Studio测试(java语言),将私钥复制保存为文本,复制到assets文件下,将加密后文本直接复制到代码直接引用,AS成功读取私钥文件,替换BEGIN RSA PRIVATE KEY、END RSA PRIVATE KEY、换行符、空格等,摄取出一个base64字符串私钥匙去解密,但解密结果是乱码。


私钥如下
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgGCJxHD6GUuJ70PG8s16Ttj0QXdK/ciZVmMtcNTWOvDT7v8nDkP5
z7tpvWldV71mnBYaWhSRYPCw2KAHxSScAKm+fl1JJhDunAJ4k6pZNn2C05WNjFRd
TMEl0Sq1OpVipIaYbr1chADtaVPArKmQ0htm/XiynZ+qzUK1hHt4zMs3AgMBAAEC
gYBAre0cmKQ79SWGbpQc0VZki3oVN/xC22GCv146a3JACm61KvCm4IeqlFTgdDal
4kqvkGZMI38kpAfvaGVQeukB+48wZ1HtFk+FYu6fQS9viT9QchJD+74nxOTvqvEe
Uq+lVoWD2hMSC/Y+1GUYNQqe/DbP7UCWSLEkAHLQIV2PUQJBALska/aom199QBPC
plONCHH8bUWJNLXkHILVJ85bVyVRBx1qwRKmRZykkiCYtMfeYe4U9s4vz3d3Quwh
dmx0PrkCQQCEDwe2lOrwGkcU48DFfAYbRAtxU7P8omf5BGRWZ+ELV/yzkds7xOHs
VE9KYrImflCiRmQTedr9nRbND5jm7eFvAkB/VhQEPMuj2MSt7WdhOHiDnt/3TZnJ
HhLsTv+L4QjWAmFV+dqvxuVc5Xnspht0V/PInQkmWM/RGRw3MbmzqBE5AkAZF9YK
Xo+p4gRhtsk5fVCXu71E4nfP6HhDPA9oz8JWanitEmkLGWUoh/itFMXvRI9D1oZL
oRr4l/HuMymFr+vnAkEAlpANRZxADu5LaNghdMfttwD5O2fuR4GTvKNq0R6YXFOZ
/E6NU8IomOBJPXa41VogmlyXQrtZKAUuoevmKKVaRw==
-----END RSA PRIVATE KEY-----
加密后文本如下
GQnAFXSX3Y3dkQIFoMcG4ijAw2PmqagERDO11CupEtOiQkmDDa5XXq7Q6/8Zjwgm7mxcqfbJg6ejwHITuSJuYsQK6SUUtEIEZ+3AWm5CAUbKdnWA9U2cGLRYfjH07TtXhuGOzzoZc2x+zicewh1aGEHIxo6NODb4uQDJHfP7sak=
AS(java代码如下)
package person.yinzhenwei.rsademo;
import androidx.appcompat.app.AppCompatActivity;
import javax.crypto.Cipher;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.nio.file.Files;
import java.nio.file.Paths;
//--
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import person.yinzhenwei.rsademo.util.RSAKeyPairGenerator;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//----
//asss();
test();
}
// 读取文件内容
private String readFile() //从“资产”文件中读取秘钥
{
AssetManager assetManager = getAssets();
BufferedReader reader = null;
try {
InputStream inputStream = assetManager.open("privateKey.xml");
reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
String text = sb.toString();
// 使用text变量,例如显示在TextView中
Log.v("lzb","未删除头尾的空格换"+text);
text=text.replace("-----BEGIN RSA PRIVATE KEY-----", "")
.replace("-----END RSA PRIVATE KEY-----", "").replaceAll("\\s+", "");
// Log.v("lzb","去掉头尾的"+text);
return text;
} catch (IOException e) {
e.printStackTrace();
Log.v("lzb","文件读取失败"+e.getMessage());
return "";
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 从私钥字符串生成PrivateKey对象
private static PrivateKey generatePrivateKey(String key) throws NoSuchAlgorithmException, InvalidKeySpecException {
byte[] keyBytes = Base64.getDecoder().decode(key);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
private void test()
{
String encryptedText = "GQnAFXSX3Y3dkQIFoMcG4ijAw2PmqagERDO11CupEtOiQkmDDa5XXq7Q6/8Zjwgm7mxcqfbJg6ejwHITuSJuYsQK6SUUtEIEZ+3AWm5CAUbKdnWA9U2cGLRYfjH07TtXhuGOzzoZc2x+zicewh1aGEHIxo6NODb4uQDJHfP7sak="; // 替换为你的加密文本
try {
// 读取私钥文件
String privateKeyString = readFile();
// 从私钥字符串构造PrivateKey对象
PrivateKey privateKey = generatePrivateKey(privateKeyString);
// 使用私钥构造Cipher对象进行解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
// 执行解密操作
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes, StandardCharsets.UTF_8);
// 输出解密后的文本
Log.v("lzb",decryptedText);
System.out.println("Decrypted Text: " + decryptedText);
} catch (Exception e) {
Log.v("lzb","解密失败"+e.getMessage());
e.printStackTrace();
}
}
}