BouncyCastle - 将 X509CrlEntry.SerialNumber 转换为“CAPI 样式”十六进制字符串

Mik*_*uno 1 c# bouncycastle

我正在尝试使用 Org.BouncyCastle.X509 转储证书吊销列表(CRL)的内容。在此用例中,我需要获取“十六进制”字符串表示形式的证书序列号列表,正如它们出现在证书 MMC 管理单元中一样(示例值为16a03c2c000000000594)。

\n\n

我能够达到这样的程度:我有一个 X509CRLEntry 对象的集合可供迭代,但SerialNumber属性的类型为Org.BouncyCastle.Math.BigInteger这种类型有一个ToString()的实现,但是,返回的值对我来说不可用:

\n\n
public CRLProc(string CRLFile)\n        {\n            X509CrlParser Parser = new X509CrlParser();\n            X509Crl CRL = Parser.ReadCrl(File.ReadAllBytes(CRLFile));\n            NextUpdate = CRL.NextUpdate.Value;\n            var RevokedCerts = CRL.GetRevokedCertificates();\n\n            foreach(X509CrlEntry entry in RevokedCerts)\n            {\n                //Target value (first SN in CRL): 16a03c2c000000000594\n\n                string serialNumber = entry.SerialNumber.ToString();\n                //serialNumber = "106847877515466973906324" (Nope)\n\n                string serialFromBytes = Encoding.Default.GetString(entry.SerialNumber.ToByteArray());\n                //serialFromBytes = "\\u0016\xc2\xa0<,\\0\\0\\0\\0\\u0005\xe2\x80\x9d" (That\'s a hard NO)\n\n                string serialFromBigInt = entry.SerialNumber.LongValue.ToString("X");\n                //serialFromBigInt = "3C2C000000000594" (OK, now we\'re getting somewhere!!)\n            }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Pet*_*man 6

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

string serialFromBigInt = entry.SerialNumber.ToString(16);
Run Code Online (Sandbox Code Playgroud)