سؤال

أود أن XOR ملف كبير جدا (~ 50 Go).

وبصورة أكثر دقة، أود أن أفعل ذلك بواسطة Xoring كل كتلة من 32 بايت من ملف

شكرا لك على أي مساعدة!!

هل كانت مفيدة؟

المحلول

هذا بدا مثل المرح، ولا يبدو وكأنه مهمة الواجبات المنزلية.

ليس لدي ملف مشفر سابقا سابقا لمحاولة مع، ولكن إذا قمت بتحويل مرة أخرى وإلى الأمام، فلا يوجد فرق.

أنني حاولت أتلست. استمتع! :) هذا XOR كل 4 بايت مع 0xe555E5BF، أفترض أن هذا ما تريد.

هنا bloxor.c.

// bloxor.c - by Peter Boström 2009, public domain, use as you see fit. :)

#include <stdio.h>

unsigned int xormask = 0xE555E5BF; //3847611839 in hex.

int main(int argc, char *argv[])
{
    printf("%x\n", xormask);
    if(argc < 3)
    {
        printf("usage: bloxor 'file' 'outfile'\n");
        return -1;
    }

    FILE *in = fopen(argv[1], "rb");
    if(in == NULL)
    {
        printf("Cannot open: %s", argv[2]);
        return -1;
    }

    FILE *out = fopen(argv[2], "wb");

    if(out == NULL)
    {
        fclose(in);
        printf("unable to open '%s' for writing.",argv[2]);
        return -1;
    }
    char buffer[1024]; //presuming 1024 is a good block size, I dunno...

    int count;

    while(count = fread(buffer, 1, 1024, in))
    {
        int i;
        int end = count/4;
        if(count % 4)
            ++end;

        for(i = 0;i < end; ++i)
        {
            ((unsigned int *)buffer)[i] ^= xormask;
        }
        if(fwrite(buffer, 1, count, out) != count)
        {
            fclose(in);
            fclose(out);

            printf("cannot write, disk full?\n");

            return -1;
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}

نصائح أخرى

كما ذكر Starblue في تعليق، "كن على علم بأن هذا هو في أفضل الأحوال، وليس التشفير". وربما لا يضوح حتى.

خاصية واحدة من xor هي ذلك (Y xor 0) == Y. وبعد ما يعنيه هذه الوسيلة بالنسبة للخوارزمية الخاصة بك هو أنه في أي مكان في ملفك الكبير للغاية حيث توجد أعمدة من الأصفار (والذي يبدو من المحتمل أن يعطى حجم الملف)، سيظهر المفتاح الخاص بك في ملف تشفير. عادي مع اليوم.

ميزة أخرى لطيفة من الأشياء المشفرة XOR هي أنه إذا كان لدى شخص ما النصي النصي والنص التشفير، فإن Xor'ing هذه العناصر معا نتساء لك إخراج يحتوي على المفتاح المستخدم لإجراء التشفير المتكرر مرارا وتكرارا. إذا كان الشخص يعرف أن الملفين 2 عبارة عن زوج صغير / نص المشفر، فقد تعلموا المفتاح الذي سيء إذا تم استخدام المفتاح لأكثر من تشفير واحد. إذا لم يكن المهاجم متأكدا مما إذا كانت النص العظيم والسرف المشفر مرتبطا، فإن لديهم فكرة جيدة للغاية بعد ذلك نظرا لأن المفتاح هو نمط متكرر في الإخراج. لا شيء من هذه مشكلة مع وسادة مرة واحدة لأن كل جزء من المفتاح يستخدم مرة واحدة فقط، لذلك يتعلم المرء أي شيء جديد من هذا الهجوم.

يشكل الكثير من الناس خطأ في افتراض أن لوحة زمنية واحدة غير قابلة للكسر، وأن تشفير XOR قد يكون موافق "إذا تم ذلك جيدا" لأن العملية الأساسية المنفذة هي نفسها. الفرق هو أن لوحة لمرة واحدة تستخدم كل بت عشوائي من المفتاح مرة واحدة بالضبط. لذلك من بين أمور أخرى، إذا كان منصبح العمل لديه zeros، لا يوجد شيء يتعلم حول المفتاح، على عكس مع تشفير XOR ذات المفتاح الثابت البسيط.

كما قال بروس شنيير: "هناك نوعان من التشفير في هذا العالم: التشفير الذي سيوقف أخت أطفالك من قراءة ملفاتك، والتشفير الذي سيوقف الحكومات الكبرى من قراءة ملفاتك."

تشفير XOR بالكاد يكون دليل أخت الشقيقة - إذا حتى ذلك.

تحتاج إلى حذف حل حول بنية تدفق: تقرأ ملف الإدخال في "دفق"، وتعديله، واكتب النتيجة في ملف الإخراج.

بهذه الطريقة، ليس عليك قراءة كل الملف في وقت واحد.

إذا كان سؤالك هو كيفية القيام بذلك دون استخدام مساحة إضافية على القرص، فسأقرأ للتو في القطع في مضاعفات 32 بايت (كبيرة قدر الإمكان)، والعمل مع القطعة في الذاكرة، ثم اكتبها مرة أخرى. يجب أن تكون قادرا على استخدام ftell و fseek وظائف للقيام بذلك (على افتراض long النوع كبير بما فيه الكفاية، بالطبع).

هو - هي مايو تكون أسرع في الذاكرة الخريطة في الملف إذا كنت تستطيع قطع الكثير من مساحة عنوانك (ودعم نظام التشغيل الخاص بك) ولكن سأحاول الحل الأسهل أولا.

بالطبع، إذا كانت الفضاء ليست مشكلة، فما عليك سوى قراءة القطع وكتابتها إلى ملف جديد، وشيء مثل ما يلي (رمز pseudo):

open infile
open outfile
while not end of infile:
    read chunk from file
    change chunk
    write chunk to outfile
close outfile
close infile

هذا النوع من القراءة / العملية / الكتابة هي أشياء أساسية جميلة. إذا كان لديك متطلبات أكثر تعقيدا، يجب عليك تحديث سؤالك معهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top