BouncyCastle - 将 X509CrlEntry.SerialNumber 转换为 "CAPI-style" 十六进制字符串

BouncyCastle - Convert X509CrlEntry.SerialNumber to "CAPI-style" hex string

我正在尝试使用 Org.BouncyCastle.X509 转储证书撤销列表 (CRL) 的内容。在此用例中,我需要在 "hexidecimal" 字符串表示形式中获取证书序列号列表,因为它们出现在 Certificates MMC 管理单元中(示例值为 16a03c2c000000000594).

我能够到达我有一个 X509CRLEntry 对象集合来迭代的地步,但是 SerialNumber 属性 的类型是 Org.BouncyCastle.Math.BigInteger.此类型具有 ToString() 的实现,但是返回的值对我不可用:

public CRLProc(string CRLFile)
        {
            X509CrlParser Parser = new X509CrlParser();
            X509Crl CRL = Parser.ReadCrl(File.ReadAllBytes(CRLFile));
            NextUpdate = CRL.NextUpdate.Value;
            var RevokedCerts = CRL.GetRevokedCertificates();

            foreach(X509CrlEntry entry in RevokedCerts)
            {
                //Target value (first SN in CRL): 16a03c2c000000000594

                string serialNumber = entry.SerialNumber.ToString();
                //serialNumber = "106847877515466973906324" (Nope)

                string serialFromBytes = Encoding.Default.GetString(entry.SerialNumber.ToByteArray());
                //serialFromBytes = "\u0016 <,[=12=][=12=][=12=][=12=]\u0005”" (That's a hard NO)

                string serialFromBigInt = entry.SerialNumber.LongValue.ToString("X");
                //serialFromBigInt = "3C2C000000000594" (OK, now we're getting somewhere!!)
            }

所以,它看起来像 LongValue.ToString FTW,但最后一个难题是如何导出序列号的前 2 个八位字节(“16 a0”)。正在寻求这方面的建议!

如果您只想将序列号作为十六进制字符串,BigInteger 有一个采用基数的 ToString 重载,例如:

string serialFromBigInt = entry.SerialNumber.ToString(16);