3

を使用しようとしていますCrypto.Cipher.RSAが、暗号化と署名に苦労しています。ハッキングページを見てきました。

encrypt/プロセスdecryptsign/プロセスの両方を使用して、往復の例をどのように実装すればよいverifyですか?

4

2 に答える 2

9

あなたの質問は私を心配します。おそらく私はVincentの仕事に精通しすぎているかもしれませんが、操作を理解していれば、ライブラリの使用は簡単であるか、少なくとも非常に具体的な質問があると思います。以下では、あなたがリクエストした2つの例を見ていき、「カーブボール」である可能性のある各アイテムについて停止して説明しようとします。

{-# 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インターフェイス)、バイト文字列、および暗号ハッシュ(署名/検証操作は通常ハッシュ関数によってパラメーター化可能です)。

次に、文字列を暗号化および復号化してから、これがIDであることを確認します。

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

ヴィンセントと私が将来人々を助けるためにできると思ういくつかのこと(このリストへの追加を提案してください):

  • 誰もがcrypto-apiへのハドックリンクをたどるわけではなくCryptoRandomGen、そうする人はおそらくcprng-aesdrbgパッケージへのポインタを使用する可能性があります。

  • すべての関数を例を使用して文書化します(不十分な文書化の例:?のIntegergeneration。ソースを読み取ります。検証のための2つのByteString値の順序?慣例を推測し、ソースを読み取って確認します。)

  • Vincentのモジュールでこのようなチュートリアルを提供してください。

于 2012-11-24T06:34:10.217 に答える
3

そのパッケージに付属しているベンチマークとテストを見ることができます (参照可能なソース)。

于 2012-11-23T10:33:31.010 に答える