从snk文件中获取.NET PublicKeyToken?

时间:2015-04-21 09:45:36

标签: .net

如何从snk文件中获取PublicKeyToken?使用命令行工具。我想过使用sn.exe,但是找不到合适的参数。

3 个答案:

答案 0 :(得分:21)

如果您想使用sn.exe工具:

sn -p yourkey.snk publickey.snk

现在只有公钥

的publickey.snk
sn -tp publickey.snk

现在您拥有公钥和公钥令牌。


给出一个byte[]知道snk文件,比如

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;
    }
}

答案 1 :(得分:17)

使用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&gt; PublicToken.txt

答案 2 :(得分:1)

除了@xanatos回答,PowerShell版本如果有人需要它:

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("-", "")
}