2013-08-06 120 views
1

我想计算X509证书的CERT_KEY_IDENTIFIER_PROP_ID,将其无提示地添加到Windows Mobile设备的注册表中(分段期间)。作为this site,计算公式如下:计算X509证书的密钥标识

SEQ[SEQ[rsa], key]

我猜keycert.GetPublicKey(),但什么的意思与rsa这里(而不是算法我猜的)?

现在在网上搜索了三个小时,如果有人能指引我进入正确的方向,我将非常高兴。

回答

3

读书,我需要写入注册表键的属性,我终于用下面的方法的CryptoAPI:

[DllImport("crypt32.dll", SetLastError = true)] 
private static extern IntPtr CertCreateCertificateContext(int dwCertEncodingType, byte[] pbCertEncoded, int cbCertEncoded); 

[DllImport("crypt32.dll", SetLastError = true)] 
private static extern bool CertFreeCertificateContext(IntPtr pCertContext); 

[DllImport("crypt32.dll", SetLastError = true)] 
private static extern bool CertGetCertificateContextProperty(IntPtr pCertContext, int dwPropId, IntPtr pvData, ref int pcbData); 

private byte[] GetKeyIdentifier(X509Certificate certificate) 
{ 
    var data = certificate.GetRawCertData(); 

    var context = CertCreateCertificateContext(1, data, data.Length); 

    try 
    { 
    return ReadProperty(context, 0x14); 
    } 
    finally 
    { 
    CertFreeCertificateContext(context); 
    } 
} 

private byte[] ReadProperty(IntPtr context, int property) 
{ 
    var length = 0; 

    // determine the ammount of memory to allocate for the data 
    if (CertGetCertificateContextProperty(context, property, IntPtr.Zero, ref length)) 
    { 
    var pointer = Marshal.AllocCoTaskMem(length); 

    try 
    { 
     // query the property which is written to the allocated memory 
     if (CertGetCertificateContextProperty(context, property, pointer, ref length) == false) 
     { 
     throw new InvalidOperationException(string.Format("Failed to query property {0}.", property)); 
     } 

     // extract the data from the unmanaged memory 
     var buffer = new byte[length]; 
     Marshal.Copy(pointer, buffer, 0, length); 

     return buffer; 
    } 
    finally 
    { 
     Marshal.FreeCoTaskMem(pointer); 
    } 
    } 
    else 
    { 
    throw new InvalidOperationException(string.Format("Failed to query property {0}.", property)); 
    } 
}