2

我想从 pfx 文件中计算公钥令牌,并确保它与签名程序集的公钥令牌匹配,但我一直遇到以下问题,并希望获得有关如何修复它的帮助。

在签名的程序集中,我使用以下代码获取公钥和公钥令牌:

Console.WriteLine("Public Key: {0}{1}", System.BitConverter.ToString(System.Reflection.Assembly.GetExecutingAssembly().GetName().GetPublicKey()), Environment.NewLine);
Console.WriteLine("Public Key Token: {0}{1}", System.BitConverter.ToString(System.Reflection.Assembly.GetExecutingAssembly().GetName().GetPublicKeyToken()), Environment.NewLine);

结果如下:

Public Key: 00-24-00-00-04-80-00-00-94-00-00-00-06-02-00-00-00-24-00-00-52-53-41-31-00-04-00-00-01-00-01-00-31-71-7C-0A-A5-A0-76-6D-EF-44-BD-F6-6F-7B-BA-C2-8F-8B-8D-09-98-8D-A6-B5-5A-C6-24-96-34-13-A0-40-5D-78-89-1C-A4-4F-B4-09-11-5C-5F-97-2C-E3-AD-A7-B1-19-41-38-25-B1-21-9F-6C-6B-DA-D5-1D-62-75-A6-25-D1-04-10-CC-A0-32-9B-A1-C9-BA-3A-DA-A5-06-F9-7F-00-02-E9-3F-46-EE-C5-DC-1E-C6-95-13-49-25-F3-E5-0D-67-35-93-0D-4C-84-89-D7-36-96-00-66-74-52-09-F4-A2-4D-2C-72-85-20-44-88-9C-B1-EE-C0-21-CE

Public Key Token: 0C-C2-5B-D7-34-42-06-3D

如果我使用上面提到的公钥的值,我可以自己在 Powershell 中重新计算公钥令牌:

$assemblyPublicKeyString = “00-24-00-00-04-80-00-00-94-00-00-00-06-02-00-00-00-24-00-00-52-53-41-31-00-04-00-00-01-00-01-00-31-71-7C-0A-A5-A0-76-6D-EF-44-BD-F6-6F-7B-BA-C2-8F-8B-8D-09-98-8D-A6-B5-5A-C6-24-96-34-13-A0-40-5D-78-89-1C-A4-4F-B4-09-11-5C-5F-97-2C-E3-AD-A7-B1-19-41-38-25-B1-21-9F-6C-6B-DA-D5-1D-62-75-A6-25-D1-04-10-CC-A0-32-9B-A1-C9-BA-3A-DA-A5-06-F9-7F-00-02-E9-3F-46-EE-C5-DC-1E-C6-95-13-49-25-F3-E5-0D-67-35-93-0D-4C-84-89-D7-36-96-00-66-74-52-09-F4-A2-4D-2C-72-85-20-44-88-9C-B1-EE-C0-21-CE”.replace(‘-’,’’)
$assemblyPublicKey = New-Object byte[] ($assemblyPublicKeyString.length/2)
$assemblyPublicKey = [byte[]] -split ($assemblyPublicKeyString -replace '..', '0x$& ')
$csp = [System.Security.Cryptography.SHA1CryptoServiceProvider]::New()
$myHash = $csp.ComputeHash($assemblyPublicKey)
$myPKT = New-Object byte[] 8
for ($i = 0; $i -le ($myPKT.length - 1); $i++) { $myPKT[$i] = $myHash[$myHash.length - $i - 1]; }
[System.BitConverter]::ToString($myPKT)

输出是:

0C-C2-5B-D7-34-42-06-3D


现在,如果我使用我用来签署上述程序集的 pfx 文件,我似乎无法获得相同的公钥值。这是我设法来的最接近的:

$mypwd2 = ConvertTo-SecureString -String "atempkeytotest22" -Force -AsPlainText
$mypfx = Get-PfxData -FilePath .\atempkeytotest2.pfx -Password $mypwd2
$cspBlob = $mypfx.EndEntityCertificates[0].PublicKey.Key.ExportCspBlob($false)
$snk = [System.Reflection.StrongNameKeyPair]::New($cspBlob)
[System.BitConverter]::ToString($snk.PublicKey)

这将产生以下公钥:

00-A4-00-00-04-80-00-00-94-00-00-00-06-02-00-00-00-A4-00-00-52-53-41-31-00-04-00-00-01-00-01-00-31-71-7C-0A-A5-A0-76-6D-EF-44-BD-F6-6F-7B-BA-C2-8F-8B-8D-09-98-8D-A6-B5-5A-C6-24-96-34-13-A0-40-5D-78-89-1C-A4-4F-B4-09-11-5C-5F-97-2C-E3-AD-A7-B1-19-41-38-25-B1-21-9F-6C-6B-DA-D5-1D-62-75-A6-25-D1-04-10-CC-A0-32-9B-A1-C9-BA-3A-DA-A5-06-F9-7F-00-02-E9-3F-46-EE-C5-DC-1E-C6-95-13-49-25-F3-E5-0D-67-35-93-0D-4C-84-89-D7-36-96-00-66-74-52-09-F4-A2-4D-2C-72-85-20-44-88-9C-B1-EE-C0-21-CE

正如你所看到的,它在两个字节上有所不同,看起来像是一个标题。(开头的A4。)

00- A4 -00-00-04-80-00-00-94-00-00-00-06-02-00-00-00- A4 -00-00-...

我用几个不同的键试过这个。因为公钥令牌是一个哈希,所以它阻止我计算和比较两个公钥令牌。

我该如何纠正这个问题,你知道这些值的含义吗?

4

0 回答 0