Java RSA公钥在转换为RSAPublicKeySpec后发生更改

Java RSA公钥在转换为RSAPublicKeySpec后发生更改,java,encoding,cryptography,rsa,public-key,Java,Encoding,Cryptography,Rsa,Public Key,我有一个RSA公钥材料作为字节数组(密钥格式是PKCS1)。我使用RSAPublicKeySpec从中创建一个PublicKey对象,如下所示 public Key retrievePubKey(byte[] derStuff){ // der stuff is my key material KeySpec ks = null; Key wrapKey = null; try { DerInputStream dis = new DerInputStre

我有一个RSA公钥材料作为字节数组(密钥格式是PKCS1)。我使用
RSAPublicKeySpec
从中创建一个
PublicKey
对象,如下所示

public Key retrievePubKey(byte[] derStuff){ // der stuff is my key material
    KeySpec ks = null;
    Key wrapKey = null;
    try {
        DerInputStream dis = new DerInputStream(derStuff);
        DerValue val = dis.getDerValue();
        BigInteger first = val.getData().getBigInteger();
        BigInteger second = val.getData().getBigInteger();
        ks = new RSAPublicKeySpec(first, second);
        KeyFactory kf = KeyFactory.getInstance("RSA", "IBMJCE");
        wrapKey = kf.generatePublic(ks);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return wrapKey;
}
然后我将
转换为
公钥

PublicKey pubKey = (PublicKey) mainObj.retrievePubKey(keyMaterial);
现在,当我在
pubKey
中打印关键材料时,我得到了另一个键材料

原始关键材料
3082010A02820100AB7F161C0042496CCD6C6D4DADB91997343535776003ACF54B7AF1E440AFB80B64A8755F8002CFBA6B184540A2D66086D74648346D75B8D712B205387C0F6583B4D7DC7EC114F3B176B7957C422E7D03FC6267FA2A6B9B9BEE60A1D7C2D833E5E5E5A5B0B1434E795A41100AA6464648346D75B8D718D712B205088B7ECB176B7CFB1757B7B7B7B7CFB1757B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7E7BB8B7F4E8AC8C810CDB66E3D21126EBA8DA7D0CA34142CB76F91F013DA809E9C1B7AE64C54130FBC21D80E9C2CB06C5C8D7CCE8946A9AC99B1C2815C362A29A82D73A1F99374FE30E5495162A6EDA29C6FC411335D5D5DC7426B0F60502100001

转换的关键材料

当我执行
byteArrayToHexString(pubKey.getEncoded())时

30820122300D06092A864886F70D01010105000382010F003082010A02820100AB7F161C0042496CCD6C6D4DADB91997343537776003ACF54B7AF1E440AFB80B64A8755F8002FEBA6B184540A2D66086D74648346D75B8D712B20587C06583B7DC7EC114F3B176B7957C422E7D03FC6267677FA6B9B9E60A1D7C2833E5B798B7B7B9F40B7B9F40A10701757B7B9B9B9F41798B7B7B7B7B9B9B9B9F414178010149B175B7B7B9B7B9B7B9B7B7B7B7B9B7B9B9B9B9C9D14A7F081FCEC80B64E8A0ECC8295353C795328ABF70E1B42E7B8B7F4E8AC8C810CDB66E3D21126EBA8DA7D0CA34142CB76F91F013DA809E9C1B7AE64C54130FBC21D80E9C2CB06C58D7CCE8946A9AC99B1C2815C362A29A82D73A199374FE30E5495162AEDA29C6FC411335D5D5DC7426B0020100001

然后我尝试使用新的
PublicKey
PublicKey验证签名,但失败了

validityIndicator为false

Signature signerVerify = Signature.getInstance("SHA256withRSA", "IBMJCE"); // tried with "RSA" - Failing
        signerVerify.initVerify(pubKey);
        signerVerify.update(dataToBeSigned);
        boolean validityIndicator = signerVerify.verify(signature);
设计的
数据
关键材料
取自
我尝试过stackoverflow上解释的其他几种方法(),但没有一种有效。

您还没有明确说明如何获得第二个key blob,但无论如何,很明显它们是相同的公钥,只是封装在略有不同的ASN.1 blob中。如果仔细观察,您会发现它们本质上是相同的,但是第二个有额外的信息:
122300D06092A864886F70D01010105000382010F0030820
@ArtjomB。是的,但是由于这些额外的信息,我的签名验证失败了。我怎样才能摆脱那些额外的信息?