我正在尝试使用Crypto.Cipher.RSA
,并且正在努力进行加密和签名。我看过hackage页面。
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(用于安全随机数生成器)、crypto-api(加密例程的接口,但我们将仅限于RNG 接口)、字节串和加密哈希(签名/验证操作通常可以通过哈希函数参数化)。
现在让我们加密和解密一个字符串,然后验证这是身份。
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 位),任何超过 2 的素数都可以生成,我只选择了 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
包的指针。
用示例记录所有函数(糟糕的文档示例: 的Integer
值generation
?我阅读了源代码。验证的两个ByteString
值的顺序?我猜测约定并阅读源代码以确认。)
在文森特的模块中提供这样的教程。
您可以查看该软件包附带的基准和测试(可浏览的源代码)。