公钥未知编码

时间:2015-11-09 21:32:49

标签: java cryptography rsa public-key

我有这个公钥:

MIGJAoGBAKv4OKlpY2oq9QZPMzAjbQfiqDqTnisSvdLP+mTswZJdbtk1J+4+qAySJuZjSQljzcUu0ANg+QG0VsvoU72zu5pErZKWubfe9HB/tq69bhP60qgP6/W2VebWlqUNGtsMedxuVaFBL3SoqU7e5RELIsuArCJJIgz86BQDX0x63VpXAgMBAAE=

我正在尝试使用它来解码:

Zm/qR/FrkzawabBZYk7WfQJNMVZoZrwWTvfQwIhPMzAuqEO+y+sb/x9+TZwTbqmu45/GV4yhKv0bbDL8F6rif7RJap7iQUFQBDEIAraY42IGZ8pB6A0Q0RSnJWW+tLTLJg5cTrgZQ8sLoO+U03T6DE1wy73FU5h6XhXxZERo0tQ=

我知道未加密的值是这样的:

2ABB43E83F7EC33D0D33F64BA5782E42

我一直在尝试几种不同的东西,包括Bouncy Castle(Java实现),但我无法使公钥工作,主要是以无效的编码错误结束。

这是我目前的实施:

byte[] keyBytes = Base64.decodeBase64(PUB_KEY);
try {
        AlgorithmIdentifier rsaIdent = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption);
        SubjectPublicKeyInfo kInfo = new SubjectPublicKeyInfo(rsaIdent, keyBytes);
        ASN1Primitive primKey = kInfo.parsePublicKey();
        byte[] encoded = primKey.getEncoded();
        byte[] sessionBytes = Base64.decodeBase64("Zm/qR/FrkzawabBZYk7WfQJNMVZoZrwWTvfQwIhPMzAuqEO+y+sb/x9+TZwTbqmu45/GV4yhKv0bbDL8F6rif7RJap7iQUFQBDEIAraY42IGZ8pB6A0Q0RSnJWW+tLTLJg5cTrgZQ8sLoO+U03T6DE1wy73FU5h6XhXxZERo0tQ=");
        Security.addProvider(new BouncyCastleProvider());
        X509EncodedKeySpec spec = new X509EncodedKeySpec(encoded);
        KeyFactory factory = KeyFactory.getInstance(spec.getFormat());
        Cipher cipher = Cipher.getInstance("RSA", "BC");
        cipher.init(Cipher.DECRYPT_MODE, factory.generatePublic(spec));
        // ----- THIS IS WHERE IT BREAKS -----
        byte[] decrypted = cipher.doFinal(sessionBytes);
        String tada = new String(decrypted, StandardCharsets.UTF_8);
} catch (Exception e) { ... }

当我从工厂生成公钥时,我得到了

 java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.ASN1Integer

我已经尝试过其他一些事情,但都会导致上述相同的错误。

我的公钥有问题吗?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

首先,您的密钥是PKCS#1编码。它不是Java所需的SubjectPublicKeyInfo结构。您可以看到如何对其进行解码here

其次,你不能用公钥解密,你需要一个私钥。