從 snk檔案匯出金鑰

2021-09-08 11:52:38 字數 2668 閱讀 3918

先宣告該文的實用性不強, 要產生一對金鑰可以有更簡單的方法。該文簡單解釋了.snk檔案的格式,並給出了從中提取金鑰的c#**。

.snk檔案(strong name key)也可以叫簽名檔案,它一般用來給dotnet程式集進行強命名。它的好處是非常容易產生,也非常容易管理。我們可以在visual studio的專案設定中新建乙個簽名檔案,也可以用sn.exe -k key.snk命令列來產生乙個。

.snk可以只包含乙個公鑰,也可以同時包含公鑰和私鑰。其中私鑰可以用來對程式集進行簽名,而公鑰則可以用來驗證乙個簽名。由於該金鑰實際上就是乙個1024位的rsa金鑰,我們也可以用.snk檔案來進行rsa應用。比如進行非對稱加密,進行xml數字簽名和驗證等等。

目前就我知道的,snk格式沒有正式公開。不過包含公鑰和私鑰的.snk實際上就是乙個privatekeyblob結構。該結構的定義見:

該結構由乙個blobheader頭結構,乙個rsapubkey結構,以及一些rsa鑰匙資料組成。其中blobheader.btype為privatekeyblob(0x7),指明該檔案包含了私鑰;而blobheader.aikeyalg固定為calg_rsa_sign,指明該鑰匙用來簽名;rsapubkey.bitlen指定了rsa金鑰的長度,該長度將影響那一些鑰匙資料的長度,這裡我們把它固定為1024位。

下列c#**示例如何將帶私鑰的簽名檔案讀入到的結構中,並匯出乙個rsa鑰匙:

[structlayout( layoutkind.sequential, pack=1)]

struct blobheader

[structlayout( layoutkind.sequential, pack=1)]

struct rsapubkey 

[structlayout( layoutkind.sequential, pack=1)]

struct privatekeyblob 

;
array arrays = ;
foreach(array a in arrays)

return key;
}
public static rsaparameters loadfromsnk(string filename)

gchandle gc = gchandle.alloc(raw, gchandletype.pinned);

privatekeyblob b = (privatekeyblob)marshal.ptrtostructure(gc.addrofpinnedobject(), typeof(privatekeyblob));

gc.free();
return b.getrsakey();
}
}

只包含公鑰的.snk檔案可以通過sn.exe -p key.snk public.snk來產生。這種只包含公鑰的.snk檔案格式則是publickeyblob的基礎上,加上一些額外包裝。publickeyblob結構的定義見:

額外包裝為4個位元組的簽名演算法;4個位元組的雜湊演算法;以及4個位元組的鑰匙長度。這額外的12位元組,加上publickeyblob的148位元組,總好是(只包含公鑰的).snk的總長度,160位元組。

下列為**表示:

[structlayout(layoutkind.sequential, pack = 1)]

struct publickeyblob

;
array arrays = ;
foreach (array a in arrays)

return key;
}
}

匯出公鑰還有其他的辦法。乙個辦法是將.snk匯入到當前系統的鑰匙容器中,既sn.exe -i key.snk mykeycontainer。然後再用rsacrytoserviceprovider.exportparameters來匯出公鑰:

cspparameters cp = new cspparameters(1);

cp.keycontainername = "mykeycontainer";
cp.keynumber = (int)keynumber.signature;

rsacryptoserviceprovider rsa = new rsacryptoserviceprovider(cp);

rsaparameters publickey = rsa.exportparameters(false);

不過這種方法對私鑰無效。雖然sn.exe可以將鑰匙匯入到容器的keynumber.signature上,但該鑰匙被標誌為不可匯出。也就是說呼叫rsa.exportparameters(true)將丟擲異常。

金鑰檔案snk

1.what 是什麼?由乙個程式集的標識組成並通過公鑰和數字簽名 針對該程式集生成 加強的名稱,其中的標識包括程式集的簡單文 本名稱 版本號和區域性資訊 如果提供的話 2.why 為什麼需要?因為不同的公司可能會開發出有相同名字的程式集來,如果這些程式集都被複製到同一 個相同的目錄下,最後乙個安裝的...

Linux下GPG生成金鑰 匯出金鑰及金鑰格式轉換

1 gpg安裝 使用以下命令安裝gpg sudo yum install gnupg2 安裝monkeysphere 將金鑰轉為rsa格式時使用,不需要的可以不裝 安裝依賴包 yum install perl crypt openssl bignum yum install perl digest ...

從DataTable匯出Excel檔案

匯出記錄 protected void button1 click object sender,eventargs e catch exception 儲存datatable資料到filepath檔案中 資料來源 檔案 public void exportexcelstream datatable ...