Java 公钥未知编码

Java 公钥未知编码,java,cryptography,rsa,public-key,Java,Cryptography,Rsa,Public Key,我有这个公钥: MIGJAoGBAKv4OKlpY2oq9QZPMzAjbQfiqDqTnisSvdLP+mTswZJdbtk1J+4+qAySJuZjSQljzcUu0ANg+QG0VsvoU72zu5pErZKWubfe9HB/tq69bhP60qgP6/W2VebWlqUNGtsMedxuVaFBL3SoqU7e5RELIsuArCJJIgz86BQDX0x63VpXAgMBAAE= 我正试图用它来解码: Zm/qR/FrkzawabBZYk7WfQJNMVZoZrwWTvfQwIhPM

我有这个公钥:

MIGJAoGBAKv4OKlpY2oq9QZPMzAjbQfiqDqTnisSvdLP+mTswZJdbtk1J+4+qAySJuZjSQljzcUu0ANg+QG0VsvoU72zu5pErZKWubfe9HB/tq69bhP60qgP6/W2VebWlqUNGtsMedxuVaFBL3SoqU7e5RELIsuArCJJIgz86BQDX0x63VpXAgMBAAE=
我正试图用它来解码:

Zm/qR/FrkzawabBZYk7WfQJNMVZoZrwWTvfQwIhPMzAuqEO+y+sb/x9+TZwTbqmu45/GV4yhKv0bbDL8F6rif7RJap7iQUFQBDEIAraY42IGZ8pB6A0Q0RSnJWW+tLTLJg5cTrgZQ8sLoO+U03T6DE1wy73FU5h6XhXxZERo0tQ=
其中我知道未加密的值是:

2ABB43E83F7EC33D0D33F64BA5782E42
我一直在尝试几种不同的方法,包括BouncyCastle(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
我尝试过其他几种方法,但都会导致上述相同的错误


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

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


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

对你来说足够快吗,HuXu7?惊人的速度,非常感谢!非常感谢。这里的值实际上是PKCS#1-type1(又名RSASSA-PKCS1v1_5),签名未加密,除非使用高度可疑的散列值(所有ASCII十六进制数字)并且没有算法标识符,可能是由相信“签名是用私钥加密”这一常见谎言的人。JCE有一个黑客攻击,RSA可以用
RSAPrivateKey
对算法进行
加密
,用
RSAPrivateKey
对算法进行
解密
,它实际上是进行签名和恢复的。@dave_Thompson085我想这是因为MD5和SHA1都采用了SSL签名格式。在这种情况下,仅使用PKCS#1 unpadding进行签名验证,导致哈希串接在一起;MD5+SHA1为36。它可能类似于MD5+RIPEMDold,但所有八位字节都是十六进制数字的概率是2^-128。我敢打赌,它是一个128位的散列,比如MD5,被不知道自己在做什么的人转换成十六进制(32个字符),而SEQ AlgId OCTSTR由于同样的原因被省略了。执行
.parsePublicKey
和(重新)编码结果只会返回相同的PKCS#1密钥。如果改为使用
kInfo.getEncoded()
则会对整个SPKI进行编码,并且KeyFactory-X509可以对其进行解析。因为您的值实际上有点像PKCS#1签名未加密,所以JCE在密码RSA/ECB/PKCS1PANDING(DECRYPT,RSAPublic)中有一个hack,它给出了所需(但无效)值。