我使用Bouncy Castle来生成和使用PKCS#7/CMSEnvelopedData
和SignedData
值。在签名或解密时,如何让BC使用Android密钥库系统中的私钥?注意,我无法检索私钥,因为这是密钥库系统的全部功能。
例如,当我解密KeyTransRecipientInfo
收件人的EnvelopedData
值时,我必须将私钥传递给org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient
。当我必须对SignedData
值进行签名时,我必须将私钥传递给org.bouncycastle.operator.jcajce.JcaContentSignerBuilder.build()
。当私钥从未离开安卓密钥库时,我该怎么做?
我很想说这是不可能的,因为我还没有发现任何迹象表明这是可能的。这就是我在这里检查的原因。
如果相关,则EnvelopedData
值将具有KeyTransRecipientInfo
或KeyAgreeRecipientInfo
收件人。
我想如果不能做到这一点,第二个最好的方法是创建一个主(对称(密钥来保持非对称密钥的加密
我刚刚看了一下您提供的代码。我认为问题在于您没有加载密钥条目,而是试图直接操作PrivateKey对象。
标准方法是:
- 加载密钥库
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
- 从密钥库获取私钥条目:
ProtectionParameter params = null; //some protection parameters... KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry("alias", params);