Haskell RSA示例

时间:2012-11-23 04:41:53

标签: haskell rsa

我正在尝试使用Crypto.Cipher.RSA,而我正在努力加密和签名。我看过hackage page

我应该如何使用encrypt / decryptsign / verify流程实施往返示例?

2 个答案:

答案 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-aesdrbg包的指针。

  • 使用示例记录所有函数(文档较差的示例:Integer的{​​{1}}值?我读取了源代码。两个generation值的顺序用于验证?我猜测惯例并阅读来源确认。)

  • 在Vincent的模块中提供这样的教程。

答案 1 :(得分:3)

您可以查看该软件包附带的基准测试和测试(browseable source)。