我正在嘗試使用Crypto.Cipher.RSA
,並且我正在努力進行加密和簽名。我看過hackage page。Haskell RSA示例
我應該如何實施往返示例,同時使用encrypt
/decrypt
和sign
/verify
進程?
我正在嘗試使用Crypto.Cipher.RSA
,並且我正在努力進行加密和簽名。我看過hackage page。Haskell RSA示例
我應該如何實施往返示例,同時使用encrypt
/decrypt
和sign
/verify
進程?
您的問題讓我擔心。也許我對文森特的工作太熟悉了,但我覺得如果你瞭解操作,那麼使用圖書館將是直接的,或者你至少會有非常具體的問題。下面,我介紹一下您請求的兩個示例,並嘗試停止並解釋每個可能是「曲線球」的項目。
{-# 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-aes
和drbg
包的指針。
以示例形式記錄所有功能(窮文檔的示例:generation
的Integer
值?我讀了來源。驗證的兩個ByteString
值的順序?我猜對了,請閱讀源代碼確認。)
在Vincent的模塊中提供這樣的教程。
您可以查看該包隨附的基準和測試(browseable source)。