Asal sayılarla kodlayın

Ekim 1999'da, o zamanlar 16 yaşında olan Norveçli Jon Lech Johansen liderliğindeki bir grup, İçerik Şifreleme Sistemi (CSS) DVD oynatma korumasını aşmak için DeCSS programını yayınladı. CSS, DVD oynatımını kısıtlamak için lisanslı üreticilere dağıtılan anahtarlara sahip 40 bitlik şifreleme kullanıyordu. Kodun dağıtımı ABD DMCA kapsamına girdiğinden ve yasal olarak yasaklandığından, aktivistler kodu matematiksel bir varlık olarak gizlemenin yollarını aradılar.


Phil Carmody daha sonra, gzip sıkıştırması açıldıktan sonra ikili olarak yorumlandığında DeCSS'in tüm kaynak kodunu içeren bir asal sayı oluşturdu. DeCSS algoritmasının özü, bit işlemlerinin sektör şifre çözme mantığını doğrudan eşleştirdiği şekilde TypeScript'te şu şekilde uygulanabilir.:

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

Asal sayı prensibinin ardındaki düşünce, tüm kaynak kodunu tek, sağlam bir tamsayı olarak yorumlamaktır. Verilen hiçbir dosya asla asal sayı olmadığından, sayı yapay olarak ek baytlarla (dolgu) artırılır. Bu dolgu, Miller-Rabin testi gibi bir asal sayı testi sayının asal olduğunu doğrulayana kadar bir döngü içinde artırılır. Aşağıdaki üreteç, yukarıda açıklanan DeCSS kodunu kullanır ve karşılık gelen bir asal sayı gösterimi arar.:

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));

Asal sayı hilesi hiçbir zaman ayrı bir mahkeme davasına konu olmadı, olmasına da gerek yoktu. Carmody'nin orijinal asal sayısı 1401 basamaklı olmasına rağmen, o dönemdeki en büyük asal sayılar listelerinde üst sıralarda yer almak için çok küçüktü. Daha sonra, ECPP sıralamasında onuncu sırayı elde etmek için, yapay olarak boş baytlarla şişirilmiş 1905 basamaklı bir versiyon oluşturdu. Bu başarı, saf matematiğin sansürlenmesinin imkansızlığını gösterdi, çünkü sayı listedeki yerini yalnızca matematiksel özelliklerine dayanarak kazandı.

Geri