کد در اعداد اول

در اکتبر ۱۹۹۹، گروهی به رهبری جان لخ یوهانسن، جوان ۱۶ ساله نروژی، برنامه DeCSS را برای دور زدن سیستم رمزگذاری محتوا (CSS) برای محافظت از پخش DVD منتشر کردند. CSS از رمزگذاری ۴۰ بیتی استفاده می‌کرد که کلیدهای آن در اختیار تولیدکنندگان دارای مجوز قرار می‌گرفت تا پخش DVD را محدود کند. از آنجا که توزیع این کد تحت قانون DMCA ایالات متحده قرار می‌گرفت و از نظر قانونی ممنوع بود، فعالان به دنبال راه‌هایی برای پنهان کردن کد به عنوان یک موجودیت ریاضی بودند.


سپس فیل کارمودی یک عدد اول ساخت که وقتی پس از خارج کردن از حالت فشرده در gzip به صورت دودویی تفسیر می‌شود، شامل کد منبع کامل DeCSS است. هسته الگوریتم DeCSS را می‌توان در TypeScript به صورت زیر پیاده‌سازی کرد، که در آن عملیات بیتی مستقیماً منطق رمزگشایی سکتور را نگاشت می‌کنند.:

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++;
    }
}

اصل پشت عدد اول، تفسیر کل کد منبع به عنوان یک عدد صحیح واحد و جامد است. از آنجایی که هیچ فایل داده شده‌ای هرگز یک عدد اول نیست، عدد به صورت مصنوعی با بایت‌های اضافی (padding) افزایش می‌یابد. این padding در یک حلقه افزایش می‌یابد تا زمانی که یک آزمون اول بودن، مانند آزمون میلر-رابین، اول بودن عدد را تأیید کند. مولد زیر از کد 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 به مقام دهم برسد. این موفقیت عدم امکان سانسور ریاضیات محض را نشان داد، زیرا این عدد صرفاً بر اساس خواص ریاضی خود جایگاه خود را در فهرست به دست آورده بود.

بازگشت