2012-04-19 12 views
7

मैं बेस 64 प्रतिनिधित्व में सॉकेट पर बाहरी प्रक्रियाओं को पारित करने वाली यादृच्छिक स्ट्रिंग को एन्क्रिप्ट करने के लिए Codec.Crypto.RSA का उपयोग कर रहा हूं। बाहरी प्रक्रिया (डिक्रिप्शन के लिए openssl का उपयोग कर एक रूबी प्रोग्राम) कभी-कभी संदेश को डिक्रिप्ट करने में विफल रहता है।Codec.Crypto.RSA: (डिक्रिप्ट। एन्क्रिप्ट)/= आईडी जब पीकेसीएस # 1 v1.5 पैडिंग का उपयोग किया जाता है?

इसे डीबग करने के लिए मैंने हैकेल में एक साधारण स्क्रिप्ट सेट की है जो एक निश्चित संदेश को एन्क्रिप्ट और डिक्रिप्ट करता है, सभी बेस 64 एन्कोडिंग/डिकोडिंग के बिना। मुझे क्या परेशान है कि यह बहुत ही सरल कार्यक्रम कुछ पुनरावृत्तियों के बाद विफलता में पड़ता है। डिक्रिप्ट किए गए सिफरटेक्स्ट मूल संदेश के बराबर नहीं है, हालांकि संदेश डिक्रिप्शन में शामिल है (कुछ अप्रकाशित पात्रों के बाद)।

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.encrypt' RSA.UsePKCS1_v1_5 बदलने के बाद RSA.decrypt साथ और RSA.decrypt' RSA.UsePKCS1_v1_5 (OAEP को दोषी), विफलता नहीं रह गया है शुरू हो रहा है।

क्या कोई यह देखता है कि यहां क्या गलत है?


[1] मैं बाद में OAEP उपयोग करने की योजना है, लेकिन उत्पन्न सिफर किसी कारण से echo ciphertext | openssl rsautl -oaep -inkey keypair.pem -decrypt साथ decrypted नहीं किया जा सकता है, लेकिन है कि एक और समस्या है।

अद्यतन: OpenSSL एक के साथ OAEP काम हैश समारोह के रूप में 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 

उत्तर

11

अपने कोड के साथ गलत कुछ भी नहीं है, यह एक प्रयोग किया जाता पुस्तकालय में एक बग है।

समस्या यह है कि

generate_random_bytestring :: CryptoRandomGen g => g -> Int64 -> (ByteString, g) 
generate_random_bytestring g 0 = (BS.empty, g) 
generate_random_bytestring g x = (BS.cons' first rest, g'') 
where 
    (rest, g') = generate_random_bytestring g (x - 1) 
    (first, g'') = throwLeft $ crandomR (1,255) g' 

जो कोई 0-बाइट के साथ दिया लंबाई के एक यादृच्छिक ByteString उत्पन्न करने के लिए माना जाता है, ऐसा नहीं करता है।

इसके लिए परीक्षण करने के लिए Codec.Crypto.RSA के स्रोत को हैक करना, मुझे लगातार 0-बाइट त्रुटि मिलती है।

इसका मतलब है कि डीकोडेड संदेश वास्तव में उससे अधिक लंबा माना जाता है और आपको इसके सामने कुछ बकवास मिलता है। low 1. है उत्पन्न अप्रतिबंधित बाइट 255 है, तो

 Right (bs, g') -> 
       let res = fromIntegral $ fromIntegral low + (bs2i bs .&. mask) 
       in if res > high then go g' else Right (res, g') 

यहाँ, mask0xFF (255) है:

ठोस बग कि crandomR कभी कभी एक crandomR_Num में बग के कारण 0-बाइट का उत्पादन होता है , तो

res = fromIntegral 256 

जो 0 और इस तरह नहीं > high है।

बग होना चाहिएmonadcryptorandom की अगली फिल्म (0.4.1) जो कारण पहले से ही है जल्द ही hackage पर में तय किया गया है।

जहां तक ​​मैं देख सकता हूं, ओएईपी विधियों को प्रभावित नहीं किया जाता है, क्योंकि वे आवश्यक लंबाई में भाग भरने के लिए एक अलग पैडिंग योजना का उपयोग करते हैं।

+0

यह बहुत उपयोगी था। धन्यवाद! – rekado

+0

मुझे यह बग monadcryptorandom के लिए बग ट्रैकर में सूचीबद्ध नहीं मिला है, न ही मैंने आगामी रिलीज पर वहां कोई जानकारी देखी है। क्या आप जानते हैं कि अगली रिलीज पैकेज के लेखक से जल्द ही देय है? – rekado

+2

नहीं, मैंने बग के बारे में लेखक/रखरखाव को मेल किया है। चूंकि यह काफी महत्वपूर्ण बात है, इसलिए मैं विस्तार कर रहा हूं कि थॉमस इसे ASAP को ठीक करता है और बिना देरी के ठीक हो जाता है। मैं इसे बग-ट्रैकर में भी जोड़ने जा रहा हूं, मुझे लगता है। –

संबंधित मुद्दे