簡體   English   中英

在 c# 中使用盡可能小的數字簽名對消息進行簽名

[英]Sign a message with as small as possible digital signature in c#

我工作的公司想要創建某種注冊流程,最后,用戶必須輸入密鑰才能激活他的產品。

我已經搜索並發現很少有解釋如何生成密鑰的資源。 其中之一( How to generate and validate a software license key? )建議獲取一些數據(如注冊數據,結合硬件信息),並將其與 hash 的私鑰加密相連接,並在所有這些上,計算base32編碼。

所以當密鑰輸入到程序中時,程序會解碼base32,計算出數據的大小,並用公鑰驗證密鑰中的簽名是有效的(這樣我們就可以確定密鑰來自外部公司)。

我發現了 Bouncy castle,但我沒有在其中看到任何 schnorr 實現(事實上,我在 c# 中沒有找到很多 if 的實現)。 我制作小簽名的所有努力都失敗了(我設法創建的最小簽名是 56 字節)。

因此,假設數據 + 簽名是 64 字節。 我的基數 32 字符串將是 64 * 8 / 5,即 103 個字符。加上額外的 - 用於定界,並使其更具可讀性,我們得到一些不可讀且無法通過電話口述的內容(如果需要)。

那么我錯過了什么? 如果我需要創建一個 32 個字符的密鑰,那么我需要 20 個字節的數據 + hash。

我怎么做?

任何使用 .net 加密或 Bouncy Castle(缺少任何 c# 文檔和示例)的示例都會有所幫助。

我了解到 ed25519 是基於 schnorr 的,至少從我讀過的內容來看是這樣。 找到 ed25519 的實現並不難。 我找到了使用 libsodium(一個 c++ 庫)的 libsodium.net,它包裝了 c++ 庫。

還有一個叫做 NaCl.Net (salt.net) 的東西,它是 libsodium.net 的完全托管版本。 缺少 NaCl.Net 的文檔,並且事情沒有按我的預期工作(API 與 libsodium.Net 中的不同)。

無論如何,通過 libsodium.Net,我設法加密了一條小消息並獲得了一條小的加密消息。

例如,對於 4 字節的消息,我得到 20 字節的加密消息。 對於 8 字節的消息,我收到 24 字節的消息。

額外的 16 個字節一點也不差(密鑰大小是 32 個字節,這意味着 256Bits,在這個算法中應該是好的)

算法細節

  • 密鑰交換:Curve25519
  • 加密:XSalsa20 stream 密碼
  • 身份驗證:Poly1305 MAC

對消息簽名會創建更大的簽名消息,但我不需要它。

我將為數據計算 hash,並從中生成一個密鑰(使用加密)。

收到密鑰后,將對其進行解密,然后將給定的 hash 與在機器上計算的 hash 進行比較。

暫無
暫無

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

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