【问题标题】:Read encrypted PKCS8 SpongyCastle Java读取加密的 PKCS8 SpongyCastle Java
【发布时间】:2014-03-19 21:05:36
【问题描述】:

我正在关注以下代码:https://stackoverflow.com/a/18161536/1753951,但在以下行中出现异常:

FileInputStream fis = new FileInputStream(priv);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int)priv.length()];
dis.readFully(keyBytes);
dis.close();
javax.crypto.EncryptedPrivateKeyInfo encryptPKInfo = new EncryptedPrivateKeyInfo(keyBytes);
//Exception: 
org.apache.harmony.security.asn1.ASN1Exception: Wrong content length

我正在尝试读取 .key/.pem PKCS8 文件,该文件是:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK Info: AES-256-CBC,8AFF348907C84F2F6370A216DC0D55D9

1VIjJD3dZ5/wYnIm0mtp8d22RC24yGcY9LXgeHUDbyPJQa8PjupubFqKrpOodvQx
dPfE1F3XeY8oVG42ZfR4287X4V16n++BQCeDiuvyrwacLMAuQz6PFLT4b/Py89Cm
761UZpaWnH0PHfJqB9CHqC+pGAGfRF5vj7UtdNchCwBmo+7gvU5iGyYXNRJ/hPnU
V+8QDzro4kFIMOlDzHaJ3KN1Ftbb9LDjDNE/NShbRrAFAWJMZSY/ZjF8mfqggkoZ
            %%%%%  SKIPPED MOST OF IT %%%%%%%%%%
BMIl0y5XVgPwkApA30EdgV4YAZEJ+wQLnYIZfCklqzvCfyjxHFViVW6d41WNm8bx
wl28v4QJKlnf7KNcmmGwSmjKo7BEASSZ+XVYRu0R6FaE+Job5YzPrtUI+p/kf7et
Y+jUDbZ4BPvB8j2ZscNRs+pJkEXxPt5JKW/oQMQZPlbTtSV5K1IqiuVcRi9TbCzk
nWDSfI/wxt6cK3X9XvyOpOZDCDPchkIhDhCzfitd7fzkM1VBekwsliJwjgc1bwbc
nI4AhQcNb8li7oX1M2osyeR3zF25BDb2A04Zm1lMrWkFrypb24DKkSJxYEH33Gpu
-----END RSA PRIVATE KEY-----

【问题讨论】:

    标签: java rsa pem spongycastle pkcs#8


    【解决方案1】:

    在寻找解决方案很长时间后,我偶然发现了一个可以帮助我并在 android 上工作的库。 尚不常见

    http://juliusdavies.ca/commons-ssl/

    FileInputStream in = new FileInputStream( "/path/to/pkcs8_private_key.der" );
    
    PKCS8Key pkcs8 = new PKCS8Key( in, "changeit".toCharArray() );
    
    byte[] decrypted = pkcs8.getDecryptedBytes();
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec( decrypted );
    
    // A Java PrivateKey object is born.
    PrivateKey pk = null;
    if ( pkcs8.isDSA() )
    {
       pk = KeyFactory.getInstance( "DSA" ).generatePrivate( spec );
    }
    else if ( pkcs8.isRSA() )
    {
       pk = KeyFactory.getInstance( "RSA" ).generatePrivate( spec );
    }
    // For lazier types (like me):
    pk = pkcs8.getPrivateKey();
    

    【讨论】:

      【解决方案2】:

      javax.crypto.EncryptedPrivateKeyInfo 需要一个 DER 编码的输入,而您的文件内容显然是 PEM 编码的。

      PEM 和 DER 的关系是这样的:

      • DER 是作为字节序列的实际 ASN.1 编码数据。
      • PEM 是基于文本的,其中包含所有这些 -----BEGIN SOMETHING----------END SOMETHING----- 标头和 Base64 编码的数据。 PEM 基本上就是 header+Base64(DER)+footer。

      您需要将您的密钥转换为 DER 格式,例如使用the OpenSSL pkey command

      openssl pkey -in key.pem -outform DER -out key.der
      

      【讨论】:

      • 这是在 Android 和 Spongycastle 中完成的,我需要避免使用 openssl 作为必要条件。我这样做是第一次尝试,但我不介意改变。
      • 在桌面上转换一次密钥,然后在 Android 上使用 der 文件。
      • 我不能,它应该适用于市场上的任何密钥。
      猜你喜欢
      • 2014-05-20
      • 2013-04-29
      • 1970-01-01
      • 2018-12-24
      • 2021-09-07
      • 1970-01-01
      • 2018-09-30
      • 2013-06-01
      • 2017-11-02
      相关资源
      最近更新 更多