Я использую Codec.Crypto.RSA для шифрования случайной строки, которая передается внешним процессам через сокет в представлении base64. Внешний процесс (рубиновая программа с использованием openssl для дешифрования) иногда не может расшифровать сообщение.Codec.Crypto.RSA: (decrypt. Encrypt)/= id, когда используется дополнение PKCS # 1 v1.5?
Чтобы отладить это, я установил простой скрипт в 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
(недобросовестный OAEP ) и RSA.decrypt' RSA.UsePKCS1_v1_5
с RSA.decrypt
, отказ больше не срабатывает.
Кто-нибудь видит, что здесь не так?
[1] Я планирую использовать OAEP позже, но генерируемый шифротекста не могут быть расшифрованы с echo ciphertext | openssl rsautl -oaep -inkey keypair.pem -decrypt
по какой-то причине, но это другая проблема.
Update: Чтобы сделать 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
Это было очень полезно. Спасибо! – rekado
Я не нашел эту ошибку, указанную в трекере ошибок для monadcryptorandom, и я не видел там никакой информации о предстоящем выпуске. Знаете ли вы, что следующий выпуск скоро появится у автора пакета? – rekado
Нет, я отправил автора сообщения об ошибке. Поскольку это довольно существенная вещь, я экстраполирую то, что Томас исправляет ее как можно скорее и отталкивает исправление без задержки. Думаю, я собираюсь добавить его к ошибке-трекеру. –