簡體   English   中英

從snk文件獲取.NET PublicKeyToken?

[英]Obtain .NET PublicKeyToken from snk file?

如何從 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提取 Public Key Token 並寫入PublicToken.txt

sn -t Token.snk > PublicToken.txt

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM