3

我正在为 iOS MDM 工作 Web 应用程序。在这种情况下,mobileconfig 中的有效负载将在发送到设备之前进行加密。Apple 文档 givex 以下代码为例,它在 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:没有安装的提供程序支持此密钥:javax.crypto.Cipher.a(DashoA13*..) 的 sun.security.rsa.RSAPublicKeyImpl javax.crypto.Cipher.init(DashoA13*..) .crypto.Cipher.init(DashoA13*..)

4

1 回答 1

1

PKCS7.encrypt生成CMS RFC中指定的 EnvelopedData 。这不仅仅是简单地加密内容,它是涉及加密的 ASN.1 数据结构的规范。

要在 Java 中生成或解密类似的东西,我建议使用 Bouncy Castle 来完成这项工作,相关类的 Javadocs 可以在这里找到- 特别注意CMSEnvelopedData和朋友。

您在 Ruby 调用中传递的证书用于创建 RecipientInfo 结构,使用CMSEnvelopedDataGenerator类可以进行类似的操作。

于 2012-05-31T15:39:30.557 回答