Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取普通RSA公钥时出错(没有X509证书!)_Java_Rsa - Fatal编程技术网

Java 读取普通RSA公钥时出错(没有X509证书!)

Java 读取普通RSA公钥时出错(没有X509证书!),java,rsa,Java,Rsa,我有一个普通RSA公钥的十六进制表示。 现在我想检索密钥的长度 public void testIt(String[] args) { logger.entry(); Security.addProvider(new BouncyCastleProvider()); String pubAsHex="30820122300d06092a864886f70d01010105000382010f003082010a0282010100e816e9de7ed0c

我有一个普通RSA公钥的十六进制表示。 现在我想检索密钥的长度

public void testIt(String[] args) {
    logger.entry();
    Security.addProvider(new BouncyCastleProvider());

    String 

pubAsHex="30820122300d06092a864886f70d01010105000382010f003082010a0282010100e816e9de7ed0c26c1157e56d7751ba59ebf5a75e65b91ce338794ed9ca24aefa1a26a5d927ccc7f3c6d21b05f3acc6fa73be2db0ed124a38dcb130aaa191214304f4c8c06d0b0dfd3ebc3ea0f5753555d5830ff09bd0f041013c0abc25d482ec6ec03b633b6c314fdd6fe71ddc5f6566f58edc65a6da86e8fb5f1205b48c53aecd2d5daec0232cca5071cc81609332568fa1a982bab49ebe9f6fd28cba52c50281a84597764b44e8775622cac36c7e1d4f3dd5417ecc8b8e1b5bdbc4ac36a2ef8e3dfc757a114d3ed82eb8ffbbd08392f242342db90c02ec9d210eec2bb4e2f8a6fc94a27647e9ec14789a1c3e962e59a75bc59d9658689e28699e136fce75470203";
    byte[] myKeyBytes=hex2Binary(pubAsHex);
    try{
        //Takes your byte array of the key as constructor parameter
        X509EncodedKeySpec  pubKeySpec = new X509EncodedKeySpec(myKeyBytes);

        //Takes algorithm used to generate keys (DSA, RSA, DiffieHellman, etc.) as 1st parameter
        //Takes security provider (SUN, BouncyCastle, etc.) as second parameter
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        //Creates a new PublicKey object
        PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
        RSAPublicKey myRsaKey = (RSAPublicKey) pubKey;
        logger.info("Length: "+myRsaKey.getModulus().bitLength());
    } catch(Exception e) {
        e.printStackTrace();
    }
    logger.exit();
}

public static byte [] hex2Binary (String hex) throws IllegalArgumentException, NullPointerException, NumberFormatException
{
    int j = hex.length ();
    if (j % 2 != 0)
        throw new IllegalArgumentException ("Incorrect hex string length " + j);
    byte [] result = new byte [j >> 1];
    for (int i = result.length - 1; i >= 0; i--, j -= 2)
        result [i] = (byte) Integer.parseInt (hex.substring (j - 2, j), 16);
    return result;
}
我找不到密钥未被视为X509证书的示例。 示例代码引发InvalidKeySpecException

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: Detect premature EOF
        at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)
        at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
        at de.martinm.tools.Test.KKSTester.testIt(KKSTester.java:156)
        at de.martinm.tools.Test.KKSTester.process(KKSTester.java:343)
        at de.martinm.tools.Test.KKSTester.main(KKSTester.java:351)
Caused by: java.security.InvalidKeyException: IOException: Detect premature EOF
        at sun.security.x509.X509Key.decode(X509Key.java:398)
        at sun.security.x509.X509Key.decode(X509Key.java:403)
        at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:86)
        at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
        at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
        ... 4 more
java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:检测过早的EOF
位于sun.security.rsa.RSAKeyFactory.EngineeGeneratePublic(RSAKeyFactory.java:205)
位于java.security.KeyFactory.generatePublic(KeyFactory.java:334)
位于de.martinm.tools.Test.KKSTester.testIt(KKSTester.java:156)
位于de.martinm.tools.Test.KKSTester.process(KKSTester.java:343)
位于de.martinm.tools.Test.KKSTester.main(KKSTester.java:351)
原因:java.security.InvalidKeyException:IOException:检测过早的EOF
位于sun.security.x509.X509Key.decode(X509Key.java:398)
位于sun.security.x509.X509Key.decode(X509Key.java:403)
位于sun.security.rsa.rsaplickeyimpl.(rsaplickeyimpl.java:86)
位于sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
位于sun.security.rsa.RSAKeyFactory.EngineeGeneratePublic(RSAKeyFactory.java:201)
... 4更多

很抱歉使用了一个不真实的答案,但这些数据在评论中是不可读的

看起来您的密钥是加密的,并且无效。见结构:

  0 290: SEQUENCE {
  4  13:   SEQUENCE {
  6   9:     OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
 17   0:     NULL
       :     }
 19 271:   BIT STRING, encapsulates {
 24 266:     SEQUENCE {
 28 257:       INTEGER
       :         00 E8 16 E9 DE 7E D0 C2 6C 11 57 E5 6D 77 51 BA
       :         59 EB F5 A7 5E 65 B9 1C E3 38 79 4E D9 CA 24 AE
       :         FA 1A 26 A5 D9 27 CC C7 F3 C6 D2 1B 05 F3 AC C6
       :         FA 73 BE 2D B0 ED 12 4A 38 DC B1 30 AA A1 91 21
       :         43 04 F4 C8 C0 6D 0B 0D FD 3E BC 3E A0 F5 75 35
       :         55 D5 83 0F F0 9B D0 F0 41 01 3C 0A BC 25 D4 82
       :         EC 6E C0 3B 63 3B 6C 31 4F DD 6F E7 1D DC 5F 65
       :         66 F5 8E DC 65 A6 DA 86 E8 FB 5F 12 05 B4 8C 53
       :                 [ Another 129 bytes skipped ]
289   3:       INTEGER -1
       :         Error: Integer has a negative value.
       :       }
       :     }
OID编号“1 2 840 113549 1 1”给出“RSAES-PKCS1-v1_5加密方案””和“此OID在公钥加密标准(PKCS)1中定义。另请参见IETF RFC 8017.


也许您很幸运,在Bouncy Castle的PEM阅读器的帮助下,您能够在知道密码短语时读取密钥。

您确定密钥有效吗?是的,它是有效的公钥,但它是有效的X.590编码的RSA公钥吗?你从哪儿弄来的?我看它好像短了6个字符。我玩过它,并在它的末尾添加了“010001”,它运行时没有错误。我不确定密钥是否加密。只是。。太短:)密钥未加密。这是一个X.509/SPKI格式的公钥,正如@scratte已经指出的,它是不完整的。