我正在为iOS MDM工作。 其中,mobileconfig中的有效负载在发送到设备之前要加密。 Apple文档给出了以下代码为例,它在Ruby中运行良好。 但是,我无法在Java中实现相同的功能。
OpenSSL::PKCS7.encrypt(p7sign.certificates,
payload, OpenSSL::Cipher::Cipher::new("des-ede3-cbc"),
OpenSSL::PKCS7::BINARY)
我使用的Java代码如下:
PublicKey publicKey = x509cert.getPublicKey();
//publinKey is key extracted from iOS device response stream
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
clearText = payloadContents.getBytes();
//payloadContents are contents to be encrypyted
cipherText = cipher.doFinal(clearText);
执行此操作后出现错误
java.security.InvalidKeyException:没有安装的提供程序支持此密钥:sun.security.rsa.RSAPublicKeyImpl 在javax.crypto.Cipher.a(DashoA13 * ..) 在javax.crypto.Cipher.init(DashoA13 * ..) 在javax.crypto.Cipher.init(DashoA13 * ..)
答案 0 :(得分:1)
PKCS7.encrypt
生成CMS RFC中指定的EnvelopedData。这不仅仅是加密内容,它是涉及加密的ASN.1数据结构的规范。
为了生成或解密类似于Java的东西,我建议使用Bouncy Castle作为工作,可以找到相关课程的Javadoc here - 特别关注CMSEnvelopedData和朋友。
您在Ruby调用中传递的证书用于创建RecipientInfo结构,使用CMSEnvelopedDataGenerator类可以实现类似的功能。