2011-08-13 74 views
5

我希望能夠簽署一個文件。我的意思是收件人可以檢查文件確實來自我並可以查看其內容。有沒有簡單的方法來在C++中做到這一點?在C++中實現公鑰加密的簡單方法?

我剛剛看過維基百科上的PGP文章,但他們在「哈希,數據壓縮,對稱密鑰密碼術,最後是公鑰密碼術」中間丟失了我。理想情況下,我想要一個具有功能signString(string, privateykey)的函數庫,並且接收者將具有函數readSignedString(string, publickey)。任何建議?

編輯:

我不知道我用正確的方法,所以這裏是我想要做的事:

我要實現一些簡單的盜版保護我桌面應用。所以當用戶購買許可證時,我會向他們發送一個包含其姓名和電子郵件的簽名文件。然後用戶安裝文件並且應用程序讀取它:它會檢查簽名有效性並顯示名稱/電子郵件(在「關於」框中)。爲了確保破解者無法生成這些文件,我需要確保解密文件的密鑰與加密它的密鑰不同。有沒有簡單的方法來實現這一點?

+0

你想加密文件嗎?(如你的代碼示例所述)或簽名文件(如你的文本和主題所說)?目前還不清楚你在詢問什麼 – knittl

+0

我想簽署一個文件(或一個字符串) - 我已經更新了這些例子來證明這一點。我希望它更清楚。 –

+1

我知道,這不是我要問的。 –

回答

0

有關信息,在嘗試了大部分建議之後,我最終使用了openpgp命令行工具。一旦UPXed,它非常輕便,它是跨平臺的,它以我們需要的方式輕鬆完成。

6

OpenSSL幾乎是你所需要的。它沒有兩個這樣的功能,但它幾乎一樣簡單。首先,每個數字簽名都需要一個哈希算法。原因是你不加密文件,你只加密文件散列(否則驗證時間太長)。

與OpenSSL的,您可以使用這樣的事情:

#include <openssl/evp.h> 

EVP_MD_CTX ctx; 
unsigned char signature[SIGNATURE_LEN]; 
int signature_len; 

EVP_SignInit(&ctx, EVP_sha1()); 
EVP_SignUpdate(&ctx, data, size); 
EVP_SignFinal(&ctx, signature, &signature_len, pkey); 

和幾乎相同的驗證簽名,只使用EVP_ValidateInitEVP_ValidateUpdateEVP_ValidateFinal。最後一個函數返回0/1來說明驗證是否成功。

你仍然需要拿到鑰匙到應用程序中,有相當多的功能,要做到這一點,取決於你來自哪裏,(文件/內存/證書等)上閱讀

2

您還可以使用Keyczar用於加密和解密您的文件。

但實際上你不能像這樣對你的程序進行防破解,這會讓它更難,但破解者可以反彙編你的程序,找到檢查那些簽名文件的有效性的函數,並將其更改爲接受任何類型的文件。

+0

看起來像一個非常有前途的項目,但不幸的是它不適用於Windows。 –

+0

我知道我無法對我的程序進行防破解,我的目標是使保護令人厭煩,唯一的辦法就是從互聯網上下載破解版本(因爲有些人不喜歡下載東西從狡猾的破解網站)。如果有人發佈他們的許可證文件,他們的名字將被附加到它,所以我可以在未來版本中將許可證列入黑名單。 –