【问题标题】:Android: InvalidKeySpecException: encoded key spec not recognisedAndroid:InvalidKeySpecException:无法识别编码的密钥规范
【发布时间】:2018-02-23 00:21:32
【问题描述】:

当我尝试从字符串生成 RSA 公钥时。我得到下面提到的异常。我正在尝试在 Android 中验证生成的密钥(字符串,使用 Swift)。如何将字符串转换为私钥/公钥?

static PublicKey getRSAPublicKeyFromString (String publicKeyPEM){
    try {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA", "SC");
        byte[] publicKeyBytes = Base64.decode(publicKeyPEM.getBytes("UTF-8"), Base64.DEFAULT);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes);
        return keyFactory.generatePublic(x509KeySpec);
    }catch (Exception e){
        e.printStackTrace ();
    }

    return null;
}

例外

java.security.spec.InvalidKeySpecException: encoded key spec not recognised
at org.spongycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(BaseKeyFactorySpi.java:52)
at org.spongycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePublic(KeyFactorySpi.java:130)
at java.security.KeyFactory.generatePublic(KeyFactory.java:172)

ios 中的公钥:

MIGJAoGBAOibWF15OhLJQAWpQN++UFqyG+2uLEG8PPvCajwwh6FWi6jLiZ9VN+l3JpiJTQwF/yxlSJCZCoYnljKeRBnNxpzBnuTJsyuZ4hI8ehLzDvh9nYzX/TlcZYVshJzyIVRZAbuFOCLNIltjB+Qmw8YGlxzeDSFaB6eEC1OP49hDakURAgMBAAE=

【问题讨论】:

    标签: android rsa spongycastle


    【解决方案1】:

    不幸的是,您拥有的是 base64 编码的PKCS#1 RSAPublicKey,这是 Java 不会产生或消耗的东西。 Java 产生并使用了一个更通用、更复杂的X.509 SubjectPublicKeyInfo。

    使用Bouncycastle 库,下面是一些生成 RSAPublicKey 的示例代码:

    import org.bouncycastle.asn1.ASN1InputStream;
    import org.bouncycastle.asn1.ASN1Primitive;
    
    import java.security.KeyFactory;
    import java.security.PublicKey;
    import java.security.spec.RSAPublicKeySpec;
    import java.util.Base64;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            String pubkey64 = "MIGJAoGBAOibWF15OhLJQAWpQN++UFqyG+2uLEG8PPvCajwwh6FWi6jLiZ9VN+l3JpiJTQwF/yxlSJCZCoYnljKeRBnNxpzBnuTJsyuZ4hI8ehLzDvh9nYzX/TlcZYVshJzyIVRZAbuFOCLNIltjB+Qmw8YGlxzeDSFaB6eEC1OP49hDakURAgMBAAE=";
            PublicKey rsaPub = readRSAPublicKey(pubkey64);
            System.out.println(rsaPub);
        }
    
        private static PublicKey readRSAPublicKey(String pubkey64) throws Exception {
            byte [] derRsaPubBytes = Base64.getDecoder().decode(pubkey64);
            ASN1Primitive asn1Prime = new ASN1InputStream(derRsaPubBytes).readObject();
            org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPub = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(asn1Prime);
            KeyFactory kf = KeyFactory.getInstance("RSA");
            return kf.generatePublic(new RSAPublicKeySpec(rsaPub.getModulus(), rsaPub.getPublicExponent()));
        }
    }
    

    【讨论】:

    • 我对这个问题不太熟悉。你能给我一个办法来修理我的空气吗?
    • 非常感谢,您能告诉我如何使用 pkcs#1 生成公钥/私钥吗?
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2017-03-03
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多