Codec.Crypto.RSA を使用して、base64 表現のソケットを介して外部プロセスに渡されるランダムな文字列を暗号化しています。外部プロセス (復号化に openssl を使用する ruby プログラム) は、メッセージの復号化に失敗することがあります。
これをデバッグするために、固定メッセージを base64 エンコード/デコードなしで暗号化および復号化する単純なスクリプトを Haskell でセットアップしました。私を困惑させているのは、この非常に単純なプログラムが、数回の反復の後に失敗するということです。復号化された暗号文は元のメッセージと同じではありませんが、メッセージは復号化に含まれています (いくつかの印刷できない文字の後)。
コードは次のとおりです。
import Crypto.Random
import qualified Codec.Crypto.RSA as RSA
import qualified Data.ByteString.Lazy.Char8 as L
m :: L.ByteString
m = L.pack "11111222223333344444555556666600"
main = do
gen <- newGenIO :: IO SystemRandom
let (pub, priv, _) = RSA.generateKeyPair gen 1024
doStuff pub priv
doStuff pub priv = do
gen <- newGenIO :: IO SystemRandom
let (e,_) = RSA.encrypt' RSA.UsePKCS1_v1_5 gen pub m
let d = RSA.decrypt' RSA.UsePKCS1_v1_5 priv e
if (m == d)
then do
putStrLn "SUCCESS"
doStuff pub priv
else do
putStrLn "FAILED"
putStrLn $ "expected: " ++ show m
putStrLn $ "got: " ++ show d
Codec.Crypto.RSA のテスト スイートに合格したので、プログラムに問題があることは間違いありません。
(デフォルトで OAEP 1 ) およびに置き換えた後RSA.encrypt' RSA.UsePKCS1_v1_5
、障害はトリガーされなくなりました。RSA.encrypt
RSA.decrypt' RSA.UsePKCS1_v1_5
RSA.decrypt
誰かがここで何が悪いのか分かりますか?
[1]echo ciphertext | openssl rsautl -oaep -inkey keypair.pem -decrypt
後で OAEP を使用する予定ですが、生成された暗号文は何らかの理由で復号化できませんが、それは別の問題です。
更新: OAEP を OpenSSL で動作させるには、SHA-1 をハッシュ関数として使用する必要があります。
cryptOptions :: RSA.EncryptionOptions
cryptOptions = RSA.UseOAEP sha1' (RSA.generate_MGF1 sha1') BS.empty
where sha1' = bytestringDigest . sha1
-- then, to encrypt
enc = RSA.encrypt' cryptOptions gen pubkey