我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)
我们使用的软件包是:cryptocipher(你可以在你的问题中提到过),cprng-aes(用于安全的随机数生成器),crypto-api(用于加密例程的接口,但是我们将自己仅限于RNG接口),字节串和cryptohash(符号/验证操作通常可通过散列函数进行参数化).
现在让我们加密和解密一个字符串,然后验证这是身份.
main = do
g <- newGenIO :: IO AESRNG
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
生成密钥需要比特大小(我们在这个演示中使用了相当低的值,512位),任何两个以上的素数都可以用于生成,我只选择了3.
print $ decrypt priv ct
print $ decrypt priv ct == Right msg
Run Code Online (Sandbox Code Playgroud)
结果如预期:
Right "This is my message"
True
Run Code Online (Sandbox Code Playgroud)
签名没有太大区别,只需获取RNG,生成密钥,并在签名时确保指定哈希函数和您想要绑定的任何元数据.我选择了SHA256(参见上面的导入)而没有元数据(B.empty).
let Right sig = sign hash B.empty priv msg
print (verify hash B.empty pub msg sig)
Run Code Online (Sandbox Code Playgroud)
结果是Right True.
我希望大多数用户可以为其中一些操作创建自己的功能.
mySign q msg = sign hash B.empty q msg
myVerify p msg sig = verify hash B.empty p msg sig
Run Code Online (Sandbox Code Playgroud)
我认为Vincent和我可以做的一些事情可以帮助将来的人们(请在此列表中添加建议):
不是每个人都遵循haddock链接CryptoRandomGen到crypto-api,那些可能会使用指向cprng-aes和drbg包的指针.
文献结合实例的所有功能(文档差的示例:Integer对于值generation?我读取源两者的顺序ByteString吗?验证值I猜到惯例并读取源确认.)
在Vincent的模块中提供这样的教程.
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |