3

我正在尝试使用Crypto.Cipher.RSA,并且正在努力进行加密和签名。我看过hackage页面

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

4

2 回答 2

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 接口)、字节串和加密哈希(签名/验证操作通常可以通过哈希函数参数化)。

现在让我们加密和解密一个字符串,然后验证这是身份。

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

  • 用示例记录所有函数(糟糕的文档示例: 的Integergeneration?我阅读了源代码。验证的两个ByteString值的顺序?我猜测约定并阅读源代码以确认。)

  • 在文森特的模块中提供这样的教程。

于 2012-11-24T06:34:10.217 回答
3

您可以查看该软件包附带的基准和测试(可浏览的源代码)。

于 2012-11-23T10:33:31.010 回答