Java中RSAPublicKey在不同平台的差异性

最近在逆向某Android App的时候复制了里面一段Java写的RSA解密代码,把它放在Windows上执行,结果发现解密失败,刚开始以为是密文数据或者公钥数据弄错了,调试了下发现密文数据或者公钥数据都没问题,问题发生在通过公钥数据生成公钥,在Window上生成的公钥是Sun RSA public key,在Android上生成的公钥是OpenSSLRSAPublicKey,原因可能和Jdk版本有关系:Window上使用的是SunJdk,Android上使用的是OpenJdk。

Windows:

public class ExampleUnitTest {
    @Test
    public void testGetPublicKey() {
        try{
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(1024);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            System.out.println(publicKey);
        }catch (Exception e){
        }
    }
}
Sun RSA public key, 1024 bits
  modulus: 95213884349438225170527524041975750351683444678161946275254426695337973208253569775466173664279298747653058061430975492241277502919945076896996944444736550396126983267986003483379392361465058231916774917978538137429201243314904997369770567867017186086453893426267549310093584324574550363215845297101263978509
  public exponent: 65537

Android:

public class ExampleInstrumentedTest {

    @Test
    public void testGetPublicKey() {
        try{
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(1024);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            Log.d("Test", "testGetPublicKey: "+publicKey);
        }catch (Exception e){
        }
    }
}
testGetPublicKey: OpenSSLRSAPublicKey{modulus=cbeecbec35b18cde50f2f201e441f5d9b57dacb2ba780a2f93152295d7661e822a570035e55217234d3f6070794faf28d5c3975fd62e1cfbf714cd379c8ee2166544a555e3f89c0be9074f8acccced9a9e1a8071a6c30abeea3bc5c8565dd34fd34794da50cb74e68c5f93e9f0925b60f87c89aacb25a9e357fd819ef0cf5a11,publicExponent=10001}
Java中实现RSA算法的解密过程通常涉及以下几个步骤: 1. **加载公钥和私钥**: 首先,你需要从安全存储或者其他可靠来源加载公钥和私钥对。可以使用`java.security.KeyPair`类和`java.security.interfaces.RSAPublicKey`、`java.security.interfaces.RSAPrivateKey`接口。 ```java KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(publicKeyBytes)); RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); ``` 2. **将加密数据转换为字节数组**: 如果你收到的是Base64编码的密文,需要先解码成原始的字节数组。 ```java String encryptedText = ...; // Base64 encoded ciphertext byte[] cipherBytes = Base64.getDecoder().decode(encryptedText); ``` 3. **使用私钥解密**: 使用`Cipher`类的`doFinal`方法,传入私钥进行解密。这里假设`cipher`是一个已经初始化为解密模式的`Cipher`对象,例如使用`Cipher.getInstance("RSA")`创建并设置了正确的模式。 ```java Cipher decipher = Cipher.getInstance("RSA"); decipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedBytes = decipher.doFinal(cipherBytes); ``` 4. **解码输出**: 最后,如果加密数据被其他编码(如Base64),可能还需要进一步解码得到明文字符串。 ```java String decryptedText = new String(decryptedBytes, "UTF-8"); ``` 请注意,RSA解密可能会抛出异常,比如`InvalidKeyException`或`BadPaddingException`,所以在实际操作时需要处理可能出现的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值