2017-02-24 39 views
0

的我工作的公司想創造某種註冊過程,在此,最終,用戶將不得不以激活他的產品進入一個關鍵的。註冊與小C#中可能的數字簽名的消息

我已經搜索並找到解釋如何生成密鑰的幾個源代碼。其中一個(How to generate and validate a software license key?)建議採取一些數據(如註冊數據,結合硬件信息),並用數據上的散列的私鑰加密進行連接,並在所有這些數據上計算base32編碼。

所以當在程序中輸入密鑰時會解碼base32,計算出數據的結果,並用公鑰驗證密鑰中的簽名是否有效(所以我們可以確定密鑰是從哪裏來的out公司)。

我已經發現了關於Bouncy城​​堡,但我沒有看到它的任何schnorr實現(事實上,我沒有發現如果在C#中執行的很多)。我在做小簽名時所做的所有努力都失敗了(我設法創建的最小簽名是56字節)。

所以假設數據+簽名是,比如說,64字節。我的32位字符串將是64 * 8/5,這是103 chars.com帶有額外的 - 用於定界,並且使它更易讀,我們得到的東西不可讀並且不能由電話支配(如果需要的話)。

那麼我錯過了什麼? 如果我需要製作32個字符的密鑰,那麼我需要20個字節的數據+散列。

我該怎麼做?

使用.NET加密,或充氣城堡(其缺乏任何C#文檔和示例的)將是有益的任何實例。

回答

0

我瞭解到,ed25519基於SCHNORR,從我看過至少。 尋找ed25519的實現並不難。我找到了使用libsodium(一個C++ lib)的libsodium.net,它封裝了C++庫。

也有一些所謂的NaCl.Net(salt.net),它是libsodium.net的完全託管版本。 NaCl.Net的文檔丟失了,事情並沒有像我期望的那樣工作(API與libsodium.Net中的API不同)。

總之,與libsodium.Net我設法加密小消息,並得到一個小的加密信息。

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

額外的16個字節是不是在所有的壞(密鑰大小爲32個字節,這意味着256位,在這個algorythm應該不錯)

算法的詳細

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

簽名消息會創建一個更大的簽名消息,但我不需要它。 我將計算數據的散列,並從中生成密鑰(使用加密)。

當收到密鑰時,它將被解密,然後將給定的散列與機器上計算的散列進行比較。

+0

以下項目還可以幫助生成密鑰:https://github.com/garethrbrown/.net-licence-key-generator/tree/master/AppSoftware.LicenceEngine.KeyVerification 我已經看到它,並且需要看看它是否也可以幫助,但現在,我已經有了一個很好的解決方案 – Saragani

相關問題