从Base64编码的ASN1结构对PKCS8密钥的解码是否容错?

时间:2018-12-21 13:30:22

标签: android bouncycastle asn.1 spongycastle

我正在使用Spongy Castle库将用户的私钥(PKCS8)编码为ASN1实体,然后将Base64编码的字符串编码为QR码。

我的一位同事发现,可以在不破坏私钥的情况下更改Base64字符串中的某些字符。 ASN1格式或PKCS8 / DER格式是否实现了某些容错功能?

//final String encoded = "MIGcAgEBB........lGEOPD2o+H59Qyl"; // original
final String encoded = "MIGcAgEBB........lGEOPD2oXXXXXXX"; // changed!

// decode Base64
final byte[] buffer = Base64.decode(encoded);

// decode ASN1
final ASN1Primitive primitive = ASN1Primitive.fromByteArray(buffer);
final ASN1Sequence asn1Sequence = ASN1Sequence.getInstance(primitive);
// read from ASN1
final BigInteger version = ASN1Integer.getInstance(asn1Sequence.getObjectAt(0)).getValue();
final byte[] keyBytes = DEROctetString.getInstance(asn1Sequence.getObjectAt(1)).getOctets();

// get private key from bytes
final PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes);
final PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

1 个答案:

答案 0 :(得分:0)

PKCS#8是一个相当通用的私钥容器。它可能包装的某些基础私钥结构可能包含冗余数据。特别是PKCS#1 RSAPrivateKey具有几个冗余字段,可以在必要时重新计算。最后3个字段完全多余。现在,当使用方软件接收到具有错误或修改的数据的PKCS#8结构时,该怎么办取决于该软件。

PKCS#8确实具有加密的私钥信息选项,可用于提供具有正确选择的保护算法的防篡改密码。如果您的私钥信息曾经存在于有意或无意修改是合理威胁的环境中,那么您必须采取措施缓解这种威胁。