2012-11-23 31 views
3

我正在嘗試使用Crypto.Cipher.RSA,並且我正在努力進行加密和簽名。我看過hackage pageHaskell RSA示例

我應該如何實施往返示例,同時使用encrypt/decryptsign/verify進程?

回答

9

您的問題讓我擔心。也許我對文森特的工作太熟悉了,但我覺得如果你瞭解操作,那麼使用圖書館將是直接的,或者你至少會有非常具體的問題。下面,我介紹一下您請求的兩個示例,並嘗試停止並解釋每個可能是「曲線球」的項目。

{-# LANGUAGE OverloadedStrings #-} 
module Main where 

import Crypto.Cipher.RSA 
import Crypto.Random.AESCtr 
import Crypto.Random 
import qualified Data.ByteString.Char8 as B 
import Crypto.Hash.SHA256 (hash) 

我們上繪製的包:cryptocipher(你可以在你的問題已經提到),cprng-AES(一個安全的隨機數生成器),加密API(以加密程序的接口,但我們我們只限於RNG接口),bytestring和cryptohash(簽名/驗證操作通常可由散列函數進行參數化)。

現在讓我們加密和解密一個字符串,然後驗證這是身份。

main = do 
    g <- newGenIO :: IO AESRNG 

crypto-api接口用於隨機數生成。由於這是一個重載函數,我們明確指定了所需類型的隨機數生成器,即AESRNG

let Right ((pub,priv),g1) = generate g (512 {- number of bits large -}) (3 {- a prime -}) 
     msg = "This is my message" 
     Right (ct,g2) = encrypt g1 pub msg 

生成密鑰需要的位大小(我們使用了相當低的值,這個演示中,512位),並通過兩個任意素會爲代做的,我只是拿起3.

print $ decrypt priv ct 
    print $ decrypt priv ct == Right msg 

如預期結果:

Right "This is my message" 
True 

簽名是沒有太大的不同,只是得到一個RNG,生成密鑰,當你簽署務必註明散列函數,你要綁定任何元數據。我選擇了SHA256(請參閱上面的導入)並且沒有選擇元數據(B.empty)。

let Right sig = sign hash B.empty priv msg 
print (verify hash B.empty pub msg sig) 

結果是Right True

我希望大多數用戶可以爲這些操作中的某些操作製作自己的功能。

mySign q msg = sign hash B.empty q msg 
myVerify p msg sig = verify hash B.empty p msg sig 

有些事情,我覺得文森特和我能做些什麼來幫助人們在未來(請建議添加到這個列表):

  • 不是每個人都遵循從CryptoRandomGen到crypto-的黑線鱈鏈接API和那些可能可能使用指向cprng-aesdrbg包的指針。

  • 以示例形式記錄所有功能(窮文檔的示例:generationInteger值?我讀了來源。驗證的兩個ByteString值的順序?我猜對了,請閱讀源代碼確認。)

  • 在Vincent的模塊中提供這樣的教程。