在 Android 中将字符串转换为 RSA 私钥

Convert String to RSA Private key in Android

在 Android 我使用下面的代码将字符串转换为 RSA 私钥。当我将此站点用于字符串私钥时,此代码有效

https://www.devglan.com/online-tools/rsa-encryption-decryption

但是当我使用这个网站时,我的代码不起作用。

https://8gwifi.org/RSAFunctionality?keysize=1024

我在 Android 工作室中的代码是:

public static PrivateKey stringToPrivateKey(String privateKeyString)
    {
        try {
            if (privateKeyString.contains("-----BEGIN PRIVATE KEY-----") || privateKeyString.contains("-----END PRIVATE KEY-----"))
                privateKeyString = privateKeyString.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "");


            if (privateKeyString.contains("-----BEGIN RSA PRIVATE KEY-----") || privateKeyString.contains("-----END RSA PRIVATE KEY-----"))
                privateKeyString = privateKeyString.replace("-----BEGIN RSA PRIVATE KEY-----", "").replace("-----END RSA PRIVATE KEY-----", "");

            privateKeyString.trim();
            privateKeyString = privateKeyString.replaceAll("\s+","");
            privateKeyString = privateKeyString.replaceAll("\r+","");
            privateKeyString = privateKeyString.replaceAll("^ | $|\n ", "");


            byte[] keyBytes = Base64.decode(privateKeyString, Base64.DEFAULT);
            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            return keyFactory.generatePrivate( spec);

        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
    }

第二个link错误在这一行

keyFactory.generatePrivate( spec);

这段代码解决了我的问题:

void dear(String publicKeyB64)  throws NoSuchAlgorithmException, InvalidKeySpecException{

        if (publicKeyB64.contains("-----BEGIN PUBLIC KEY-----") || publicKeyB64.contains("-----END PUBLIC KEY-----"))
            publicKeyB64 = publicKeyB64.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
        if (publicKeyB64.contains("-----BEGIN RSA PUBLIC KEY-----") || publicKeyB64.contains("-----END RSA PUBLIC KEY-----"))
            publicKeyB64 = publicKeyB64.replace("-----BEGIN RSA PUBLIC KEY-----", "").replace("-----END RSA PUBLIC KEY-----", "");

        // ok, you may need to use the Base64 decoder of bouncy or Android instead
        try{
            byte[] decoded = Base64.decode(publicKeyB64, Base64.DEFAULT);
            org.bouncycastle.asn1.pkcs.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(decoded);
            BigInteger modulus = pkcs1PublicKey.getModulus();
            BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
            RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
            KeyFactory kf = KeyFactory.getInstance("RSA");
            PublicKey generatedPublic = kf.generatePublic(keySpec);
            uk =generatedPublic;
           //uk is public variable in class and means public key
        }
        catch (Exception e){
            Log.i("your log","errro in dear function");
        }

    }

这是我的图书馆:

compile "org.bouncycastle:bcprov-jdk15on:1.58"

compile "org.bouncycastle:bcpkix-jdk15on:1.58"