2013-05-16 4 views
10

सीटीआर मोड में एईएस यादृच्छिक पहुंच के लिए बहुत अच्छा है, मान लें कि मेरे पास एईएस-सीटीआर मोड में CipherOutputStream के साथ बनाया गया डेटा स्रोत है। नीचे लाइब्रेरी-जो मेरा नहीं है- RandomAccessFile का उपयोग करता है जो फ़ाइल में एक विशिष्ट बाइट ऑफसेट की तलाश करने की अनुमति देता है।एईएस-सीटीआर-एन्क्रिप्टेड इनपुट में खोज

मेरे प्रारंभिक सोचा एक Cipher सही मापदंडों के साथ प्रारंभ के साथ एक CipherInputStream उपयोग करने के लिए होगा, लेकिन the API for that की मांग नहीं करता है और कहा गया है mark और reset का समर्थन नहीं करने के लिए।

क्या एपीआई का एक हिस्सा है जिसे मैंने याद किया है जो मेरे लिए ऐसा कर सकता है, क्या मुझे सीटीआर के चतुर्थ/ब्लॉक काउंटर की कॉन्फ़िगरेशन में देखना चाहिए और कस्टम इनपुट स्ट्रीम के साथ इसे फिर से बनाना चाहिए (जो शॉटगन के उद्देश्य से लगता है self मेरे लिए) या कुछ अन्य दृष्टिकोण मुझे याद आया है?

उत्तर

9

ठीक है, देखा मैं सिर्फ इस के लिए एक Tumbleweed बैज मिला है, 'Yay' ...

मैं देख वास्तव में कैसे चतुर्थ सीटीआर मोड में अद्यतन किया जाता है समाप्त हो गया। यह प्रत्येक एईएस ब्लॉक प्रक्रियाओं के लिए एक साधारण +1 करने के लिए बाहर निकलता है। मैंने निम्नलिखित पंक्तियों के साथ पढ़ना लागू किया।

को देखते हुए एक वर्ग है कि एक read की तरह विधि है कि एक बाइट क्रम कि एन्क्रिप्टेड और की जरूरत है में अगले बाइट पढ़ें लागू करता है कि अनुक्रम में मांग का समर्थन करने के लिए और निम्न चर:

  • BLOCK_SIZE: तय 16 (128 बिट्स, एईएस ब्लॉक आकार);
  • cipher: javax.crypto.Cipher का एक उदाहरण, एईएस से निपटने के लिए शुरू किया गया;
  • delegate: java.io.InputStream जो एक एन्क्रिप्टेड संसाधन को लपेटता है जो यादृच्छिक पहुंच की अनुमति देता है;
  • input: javax.crypto.CipherInputStream हम पढ़ रहे होंगे (स्ट्रीम डिक्रिप्शन का ख्याल रखेगी)। ,

    void seek(long pos) { 
        // calculate the block number that contains the byte we need to seek to 
        long block = pos/BLOCK_SIZE; 
        // allocate a 16-byte buffer 
        ByteBuffer buffer = ByteBuffer.allocate(BLOCK_SIZE); 
        // fill the first 12 bytes with the original IV (the iv minus the actual counter value) 
        buffer.put(cipher.getIV(), 0, BLOCK_SIZE - 4); 
        // set the counter of the IV to the calculated block index + 1 (counter starts at 1) 
        buffer.putInt(block + 1); 
        IvParameterSpec iv = new IvParameterSpec(buffer.array()); 
        // re-init the Cipher instance with the new IV 
        cipher.init(Cipher.ENCRYPT_MODE, key, iv); 
        // seek the delegate wrapper (like seek() in a RandomAccessFile and 
        // recreate the delegate stream to read from the new location) 
        // recreate the input stream we're serving reads from 
        input = new CipherInputStream(delegate, cipher); 
        // next read will be at the block boundary, need to skip some bytes to arrive at pos 
        int toSkip = (int) (pos % BLOCK_SIZE); 
        byte[] garbage = new byte[toSkip]; 
        // read bytes into a garbage array for as long as we need (should be max BLOCK_SIZE 
        // bytes 
        int skipped = input.read(garbage, 0, toSkip); 
        while (skipped < toSkip) { 
         skipped += input.read(garbage, 0, toSkip - skipped); 
        } 
    
        // at this point, the CipherStream is positioned at pos, next read will serve the 
        // plain byte at pos 
    } 
    

    ध्यान दें कि प्रतिनिधि संसाधन की मांग यहां छोड़ दिया जाता है के रूप में यह है कि क्या प्रतिनिधि InputStream नीचे है पर निर्भर करता है:

seek विधि जैसे कार्यान्वित किया जाता है। यह भी ध्यान रखें कि प्रारंभिक IV को काउंटर 1 (अंतिम 4 बाइट्स) पर शुरू करना आवश्यक है।

यूनिट्स दिखाते हैं कि यह दृष्टिकोण काम करता है (प्रदर्शन बेंचमार्क भविष्य में किसी बिंदु पर किया जाएगा :))।

+1

सीटीआर में काउंटर 0 से शुरू किया जाना चाहिए, यदि यह कभी भी रोल करता है तो संभावना है कि उसी कुंजी को उसी 'nonce || के साथ पुन: उपयोग किया जा रहा है। सीटीआर 'मूल्य जो सुरक्षा के लिए विनाशकारी है। ऐसा होने से पहले आपको रीकी करना चाहिए। –

+0

आप सही हैं, मैंने वास्तव में spec के अनुरूप होने के लिए मेरे कार्यान्वयन को थोड़ा सा समय में बदल दिया है (यकीन नहीं है कि मुझे पहले स्थान पर क्यों नहीं मिला/नहीं मिला ...) – akaIDIOT

+0

हम्म, जीता ' मुझे अब टिप्पणी संपादित करने दें। [चश्मे के अनुसार चतुर्थ के निर्माण के लिए एक लिंक] (http://tools.ietf.org/html/rfc3686#section-4)। – akaIDIOT

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