当前位置: 首页 > 知识库问答 >
问题:

Bouncy Castle“编码密钥规格未识别”

汪耀
2023-03-14
public PublicKey getPublicKey(String _file)
    throws
        NoSuchAlgorithmException,
        NoSuchProviderException,
        InvalidKeySpecException,
        IOException
{
    X509EncodedKeySpec _spec = new X509EncodedKeySpec(_getFileContents(_file));
    KeyFactory _keyFactory = KeyFactory.getInstance(this._keyFactoryAlgo, this._provider);

    this._publicKey = _keyFactory.generatePublic(_spec);

    return this._publicKey;
}

GetFileContents:

private byte[] _getFileContents(String _fileName) throws IOException
{

    File _file = new File(_fileName);
    FileInputStream _fileStream = new FileInputStream(_file);

    byte[] _contents = new byte[(int) _file.length()];

    _fileStream.read(_contents);

    if(_fileStream != null)
    {
        _fileStream.close();
        _fileStream = null;
    }

    return _contents;
}

以下是完整的错误消息:

java.security.spec.InvalidKeySpecException: encoded key spec not recognised
at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePublic(Unknown Source)
at java.security.KeyFactory.generatePublic(KeyFactory.java:328)
at xxx.CryptKey.getPublicKey(CryptKey.java:167)
at xxx.CryptSession.encryptWithPublicKey(CryptSession.java:316)
at xxx.Crypt.encrypt(Crypt.java:57)
at snippet.Snippet.main(Snippet.java:201)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)

共有1个答案

李鸿
2023-03-14

您确实读取文件不正确。您忽略了InputStream.read()的返回值。您应该循环调用此方法,因为单个调用不能保证读取整个字节数组

您可以手动读取:

int offset = 0;
int read =  _fileStream.read(_contents, 0, contents.length);
while (read > 0) {
    offset += read;
    read = _fileStream.read(_contents, offset , contents.length - offset );

}

或者您可以将底层输入流包装到DataInPutStream中,只使用DataInPutStream.Readally()方法。

 类似资料:
  • 问题内容: 我想知道是否存在Java中使用的JKS密钥存储格式的正式规范?我想编写一个往返PKCS#12的转换器,但不是用Java编写的,因此不幸的是,不能选择使用keytool或Java代码。 在一个十六进制编辑器中查看一个告诉我,它可能不是ASN.1。在我开始研究OpenJDK之前,尝试对格式进行逆向工程,是否有人知道是否存在规范?到目前为止我找不到任何东西,将不胜感激! 问题答案: 我认为您

  • 我有一个使用BouncyCastle作为安全提供者的应用程序,但是我想切换到另一个直接使用OpenSSL(consecrypt)的应用程序。我遇到的问题是,我正在使用BouncyCastle提供的密钥生成器中的ECDH“密钥”,但在我的其他库中没有类似的密钥生成器。 为了比较这两者,我将使用两种方法解码这些点,输入如下- 为提高可读性而添加换行符 使用BouncyCastle方法- 返回的是。返回

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

  • 我目前正在用java编写一个加密消息传递服务,我使用的是bouncycastle PGP库。我编写了一个生成密钥对的测试程序,并对消息进行加密/解密。这已经工作了一段时间,但它最近在解密阶段停止了,给了我一个InvalidKeyException。 我做了一些研究,下载了JCE.jar文件,并将它们导入到我的项目中(通过Eclipse Project->Properties->add extern

  • 我是EC加密的新手,对它有一些困难。我正在使用Java8和BouncyCatle提供程序。我现在的问题是:当我使用以下代码生成EC密钥对时: 并尝试获取公钥的字节数组以将其发送给另一个人,编码密钥长158字节,格式为X.509。但我期望X9.62格式和65到66字节之间的密钥大小。为什么公钥这么大?我如何用预期的密钥大小对其进行编码?(我期望密钥大小,因为我期望密钥长度为521位。)