wstcl 2025-02-07 13:56 采纳率: 38.1%
浏览 9
已结题

相同的RSA私钥、加密字符中在线工具解密成功,android studio解密后是乱码

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

img

img

私钥如下

-----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();
        }
    }

}

  • 写回答

5条回答 默认 最新

  • churuxu 2025-02-07 15:19
    关注

    试试 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 2月22日
  • 已采纳回答 2月14日
  • 创建了问题 2月7日