【发布时间】:2012-04-30 14:24:44
【问题描述】:
我正在使用 Codec.Crypto.RSA 加密一个随机字符串,该字符串以 base64 表示形式通过套接字传递给外部进程。外部进程(使用 openssl 解密的 ruby 程序)有时无法解密消息。
为了调试它,我在 haskell 中设置了一个简单的脚本,用于加密和解密固定消息,所有这些都没有 base64 编码/解码。让我感到困惑的是,这个非常简单的程序在几次迭代后导致失败。解密后的密文不等于原始消息,尽管消息包含在解密中(在一些不可打印的字符之后)。
代码如下:
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 的测试套件通过了,我的程序肯定有问题。
将RSA.encrypt' RSA.UsePKCS1_v1_5替换为RSA.encrypt(默认为OAEP1)和RSA.decrypt' RSA.UsePKCS1_v1_5替换为RSA.decrypt后,故障不再触发。
有人看到这里出了什么问题吗?
[1]我打算以后用OAEP,但是生成的密文由于某种原因不能用echo ciphertext | openssl rsautl -oaep -inkey keypair.pem -decrypt解密,这是另一个问题。
更新: 要使 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
【问题讨论】:
标签: haskell encryption rsa padding