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);
我正在尝试使用 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);