如何从snk文件中获取PublicKeyToken?使用命令行工具。我考虑使用sn.exe,但找不到合适的参数。
如果您想使用sn.exe
工具:
sn -p yourkey.snk publickey.snk
现在有一个publickey.snk,只包含公钥。
sn -tp publickey.snk
现在你拥有公钥和公钥标记。
给定一个包含 snk 文件的 byte[]
,例如:
byte[] snk = File.ReadAllBytes("YourSnkFile.snk");
使用
byte[] publicKey = GetPublicKey(snk);
byte[] publicKeyToken = GetPublicKeyToken(publicKey);
使用这些实用方法
public static byte[] GetPublicKey(byte[] snk)
{
var snkp = new StrongNameKeyPair(snk);
byte[] publicKey = snkp.PublicKey;
return publicKey;
}
public static byte[] GetPublicKeyToken(byte[] publicKey)
{
using (var csp = new SHA1CryptoServiceProvider())
{
byte[] hash = csp.ComputeHash(publicKey);
byte[] token = new byte[8];
for (int i = 0; i < 8; i++)
{
token[i] = hash[hash.Length - i - 1];
}
return token;
}
}
使用sn.exe从.snk文件中提取公钥令牌需要两个步骤。
使用sn.exe从YourFile.snk
中提取公钥并将其写入Token.snk
。
sn -p YourFile.snk Token.snk
使用sn.exe从Token.snk
中提取公钥令牌并将其写入PublicToken.txt
。
sn -t Token.snk > PublicToken.txt
function Get-SnkPublicKey([string]$FilePath)
{
$bytes = [System.IO.File]::ReadAllBytes($FilePath)
$pair = New-Object System.Reflection.StrongNameKeyPair -ArgumentList @(,$bytes)
$publicKey = $pair.PublicKey
#[System.Convert]::ToBase64String($publicKey)
$hexes = [System.BitConverter]::ToString($publicKey);
$hexes.Replace("-", "")
}
由于 StrongNameKeyPair 在 net5.0 或 netstandard2.1 中不可用,而且 sn.exe 需要管理员权限,因此您可以使用 RSACryptoServiceProvider 类:
$bytes = Get-Content "YOUR-PROJECT.snk" -AsByteStream
$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider
$rsa.ImportCspBlob($bytes)
$publicKey = $rsa.ExportRSAPublicKey()
$privateKey = $rsa.ExportRSAPrivateKey()
static void Main()
{
byte[] bytes = File.ReadAllBytes("YOUR-PROJECT.snk");
RSACryptoServiceProvider rsa = new();
rsa.ImportCspBlob(bytes);
byte[] publicKey = rsa.ExportRSAPublicKey();
byte[] privateKey = rsa.ExportRSAPrivateKey();
}