我正在尝试使用Crypto.Cipher.RSA
,而我正在努力加密和签名。我看过hackage page。
我应该如何使用encrypt
/ decrypt
和sign
/ verify
流程实施往返示例?
答案 0 :(得分: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(用于安全的随机数生成器),crypto-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
有些事情我认为Vincent和我可以做些什么来帮助将来的人(请建议添加到此列表中):
并非每个人都遵循从CryptoRandomGen
到crypto-api的haddock链接,那些可能会使用指向cprng-aes
和drbg
包的指针。
使用示例记录所有函数(文档较差的示例:Integer
的{{1}}值?我读取了源代码。两个generation
值的顺序用于验证?我猜测惯例并阅读来源确认。)
在Vincent的模块中提供这样的教程。
答案 1 :(得分:3)
您可以查看该软件包附带的基准测试和测试(browseable source)。