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



我正在尝试使用Org.BouncyCastle.X509来转储证书吊销列表(CRL(的内容。在这个用例中,我需要以证书MMC管理单元中显示的"十六进制"字符串表示形式获得证书序列号列表(示例值为16a03c2c000000000594(。

我有一个X509CRLEntry对象的集合要迭代,但SerialNumber属性的类型为Org.BuncyCastle.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 <,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个八位字节("16a0"(。寻求建议!

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

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

最新更新