মৌলিক সংখ্যায় কোড করুন

১৯৯৯ সালের অক্টোবরে, তৎকালীন ১৬ বছর বয়সী নরওয়েজিয়ান জন লেক জোহানসেনের নেতৃত্বে একটি দল কন্টেন্ট স্ক্র্যাম্বল সিস্টেম (CSS) ডিভিডি প্লেব্যাক সুরক্ষা ব্যবস্থা এড়ানোর জন্য DeCSS প্রোগ্রামটি প্রকাশ করে। ডিভিডি প্লেব্যাক সীমাবদ্ধ করার জন্য CSS ৪০-বিট এনক্রিপশন ব্যবহার করত, যার চাবিগুলো লাইসেন্সপ্রাপ্ত নির্মাতাদের কাছে বিতরণ করা হতো। যেহেতু এই কোডের বিতরণ মার্কিন যুক্তরাষ্ট্রের DMCA আইনের আওতায় পড়ে এবং আইনত নিষিদ্ধ ছিল, তাই আন্দোলনকারীরা কোডটিকে একটি গাণিতিক সত্তা হিসেবে ছদ্মবেশে প্রকাশ করার উপায় খুঁজতে থাকে।


এরপর ফিল কারমোডি একটি মৌলিক সংখ্যা তৈরি করেন, যা gzip ডিকম্প্রেশনের পর বাইনারিতে রূপান্তর করলে DeCSS-এর সম্পূর্ণ সোর্স কোড ধারণ করে। DeCSS অ্যালগরিদমের মূল অংশটি টাইপস্ক্রিপ্টে নিম্নোক্তভাবে প্রয়োগ করা যেতে পারে, যেখানে বিট অপারেশনগুলো সরাসরি সেক্টর ডিক্রিপশন লজিকের সাথে সংযুক্ত।:

function CSSdescramble(sec: Uint8Array, key: Uint8Array): void {
    let t1: number, t2: number, t3: number, t4: number, t5: number, t6: number;
    const end = 0x800;

    t1 = (key[0] ^ sec[0x54]) | 0x100;
    t2 = key[1] ^ sec[0x55];

    const keyView = new DataView(key.buffer, key.byteOffset);
    const secView = new DataView(sec.buffer, sec.byteOffset);

    t3 = (keyView.getUint32(2, true) ^ secView.getUint32(0x56, true)) >>> 0;
    t4 = t3 & 7;
    t3 = (t3 * 2 + 8 - t4) >>> 0;

    let offset = 0x80;
    t5 = 0;

    while (offset < end) {
        t4 = CSStab2[t2] ^ CSStab3[t1];
        t2 = t1 >>> 1;
        t1 = ((t1 & 1) << 8) ^ t4;
        t4 = CSStab5[t4];
        t6 = (((((((t3 >>> 3) ^ t3) >>> 1) ^ t3) >>> 8) ^ t3) >>> 5) & 0xff;
        t3 = (((t3 << 8) >>> 0) | t6) >>> 0;
        t6 = CSStab4[t6];
        t5 += t6 + t4;

        sec[offset] = CSStab1[sec[offset]] ^ (t5 & 0xff);
        t5 >>>= 8;
        offset++;
    }
}

মৌলিক সংখ্যার পেছনের মূলনীতি হলো সম্পূর্ণ সোর্স কোডকে একটি একক, নিরেট পূর্ণসংখ্যা হিসেবে বিবেচনা করা। যেহেতু কোনো প্রদত্ত ফাইলই কখনো মৌলিক সংখ্যা হয় না, তাই সংখ্যাটিকে কৃত্রিমভাবে অতিরিক্ত বাইট (প্যাডিং) দিয়ে বর্ধিত করা হয়। এই প্যাডিং একটি লুপের মধ্যে ততক্ষণ পর্যন্ত বাড়ানো হয়, যতক্ষণ না মিলার-র‍্যাবিন পরীক্ষার মতো কোনো মৌলিকত্ব পরীক্ষা সংখ্যাটিকে মৌলিক বলে নিশ্চিত করে। নিম্নলিখিত জেনারেটরটি উপরে বর্ণিত DeCSS কোডটি ব্যবহার করে এবং একটি অনুরূপ মৌলিক সংখ্যা উপস্থাপনা অনুসন্ধান করে।:

import { isPrime } from 'crypto-utils-lib'; // Hypothetical library for primality testing

async function generateIllegalPrime(code: string): Promise<bigint | null> {
    const encoder = new TextEncoder();
    const bytes = encoder.encode(code);

    let hexBase = Array.from(bytes)
        .map(b => b.toString(16).padStart(2, '0'))
        .join('');

    // Start bei 1, da 0x00 immer gerade und damit keine Primzahl ist
    for (let i = 1; i < 256; i++) {
        const candidateHex = hexBase + i.toString(16).padStart(2, '0');
        const candidateInt = BigInt('0x' + candidateHex);

        if (await isPrime(candidateInt)) {
            return candidateInt;
        }
    }
    return null;
}

const source = `void CSSdescramble(unsigned char *sec, unsigned char *key) { ... }`;
generateIllegalPrime(source).then(p => console.log(p));

মৌলিক সংখ্যার কৌশলটি কখনও কোনো পৃথক আদালতের মামলার বিষয় ছিল না, এবং তার প্রয়োজনও ছিল না। যদিও কারমোডির মূল মৌলিক সংখ্যাটি ১৪০১ অঙ্কের ছিল, তৎকালীন বৃহত্তম মৌলিক সংখ্যাগুলোর শীর্ষ তালিকায় স্থান পাওয়ার জন্য এটি খুবই ছোট ছিল। পরে তিনি নাল বাইট দিয়ে কৃত্রিমভাবে স্ফীত একটি ১৯০৫-অঙ্কের সংস্করণ তৈরি করেন, যা ECPP র‍্যাঙ্কিংয়ে দশম স্থান অর্জন করে। এই সাফল্য বিশুদ্ধ গণিতকে সেন্সর করার অসম্ভবতা প্রমাণ করেছিল, কারণ সংখ্যাটি শুধুমাত্র তার গাণিতিক বৈশিষ্ট্যের ভিত্তিতেই তালিকায় স্থান করে নিয়েছিল।

পেছনে