を使用しようとしていますCrypto.Cipher.RSA
が、暗号化と署名に苦労しています。ハッキングページを見てきました。
encrypt
/プロセスdecrypt
とsign
/プロセスの両方を使用して、往復の例をどのように実装すればよいverify
ですか?
あなたの質問は私を心配します。おそらく私は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-aes
とdrbg
パッケージへのポインタを使用する可能性があります。
すべての関数を例を使用して文書化します(不十分な文書化の例:?のInteger
値generation
。ソースを読み取ります。検証のための2つのByteString
値の順序?慣例を推測し、ソースを読み取って確認します。)
Vincentのモジュールでこのようなチュートリアルを提供してください。
そのパッケージに付属しているベンチマークとテストを見ることができます (参照可能なソース)。