我在这里看到了关于签署和加密最终mdm配置文件的问题: iOS MDM profile signing, which certificate to use?
我正在使用Bouncy Castle库进行加密。目前,我在使用scep identitiy证书加密最终配置文件时遇到困难。
我面临以下问题。
从scep响应证书检索到的公钥不是16byte(128位),因此加密失败,消息Key应该是128位。
如果我可以使用以下代码将公钥更改为16byte,则设备会抛出无效的配置文件dailog。
public static string getKeyMessageDigest(string key)
{
byte[] ByteData = Encoding.UTF8.GetBytes(key);
//MD5 creating MD5 object.
MD5 oMd5 = MD5.Create();
byte[] HashData = oMd5.ComputeHash(ByteData);
//convert byte array to hex format
StringBuilder oSb = new StringBuilder();
for (int x = 0; x < HashData.Length; x++)
{
//hexadecimal string value
oSb.Append(HashData[x].ToString("x2"));
}
return Convert.ToString(oSb);
}
有人可以通过一些博客或示例代码来帮助我加密个人资料吗?感谢您的帮助。
答案 0 :(得分:1)
我有类似的问题。 PFB我现在用来加密的工作代码。我正在从设备响应中检索签名证书,从中检索公钥并使用它来加密。
byte[] request = StreamToByte(ResponseFromDevice);
var signer = new SignedCms();
signer.Decode(request);
X509Certificate2 certificate = signer.Certificates[0];
string xmlData = "payload string to encrypt";
Byte[] cleartextsbyte = UTF8Encoding.UTF8.GetBytes(xmlData);
ContentInfo contentinfo = new ContentInfo(cleartextsbyte);
EnvelopedCms envelopedCms = new EnvelopedCms(contentinfo);
CmsRecipient recipient = new CmsRecipient(certificate);
envelopedCms.Encrypt(recipient);
string data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"><plist version=\"1.0\"><dict><key>EncryptedPayloadContent</key><data>[ENCRYPTEDDATA]</data><key>PayloadDescription</key><string>For profile enrollment</string><key>PayloadDisplayName</key><string>ProfileName</string><key>PayloadIdentifier</key><string>YourIdentifier</string><key>PayloadOrganization</key><string>YourOrg</string><key>PayloadRemovalDisallowed</key><false/><key>PayloadType</key><string>Configuration</string><key>PayloadUUID</key><string>YourUDID/string><key>PayloadVersion</key><integer>1</integer></dict></plist>";
data = data.Replace("[ENCRYPTEDDATA]", Convert.ToBase64String(envelopedCms.Encode()));
HttpContext.Current.Response.Write(data);
WebOperationContext.Current.OutgoingResponse.ContentType = "application/x-apple-aspen-config";
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;
答案 1 :(得分:0)
我在回答你上一个问题的评论时说道:
“我建议您查看OS X Server MDM实现。
一般来说加密配置文件,我记得你应该使用PKCS7包装。所以,你应该看看这个:http://www.cs.berkeley.edu/~jonah/bc/org/bouncycastle/jce/PKCS7SignedData.html
顺便说一句。如果你想获得一般性的理解,我建议你仔细阅读一下加密技术。非常高级别的问题概述:您正在尝试直接使用RSA密钥来加密数据。但是,它应该用于加密对称密钥,而对称密钥又用于加密数据。“
你也可以看看这里: PKCS#7 Encryption
您的代码无效,因为它是 - 不是PKCS7 - 您正在尝试使用毫无意义的MD5(公共证书密钥)
我真的非常建议再次阅读MDM文档以及有关cryptopraphy的内容。错误很容易(非工作或不安全的实现)。
答案 2 :(得分:0)
在bouncycastle中,您必须使用CMSAlgorithm.DES_EDE3_CBC对其进行加密。然后像上一步中那样对数据进行签名。在签名之前,请确保Base64对加密的有效负载进行编码。