Cod în numere prime

În octombrie 1999, un grup condus de norvegianul Jon Lech Johansen, pe atunci în vârstă de 16 ani, a lansat programul DeCSS pentru a ocoli protecția la redarea DVD-urilor prin intermediul sistemului Content Scramble System (CSS). CSS a folosit criptare pe 40 de biți, ale cărei chei au fost distribuite producătorilor licențiați, pentru a restricționa redarea DVD-urilor. Deoarece distribuirea codului intra sub incidența DMCA din SUA și era interzisă din punct de vedere legal, activiștii au căutat modalități de a deghiza codul ca o entitate matematică.


Phil Carmody a construit apoi un număr prim care, atunci când este interpretat în binar după decompresia gzip, conține codul sursă complet al DeCSS. Nucleul algoritmului DeCSS poate fi implementat în TypeScript după cum urmează, unde operațiile pe biți mapează direct logica de decriptare a sectorului.:

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

Principiul din spatele numărului prim este interpretarea întregului cod sursă ca un singur număr întreg solid. Deoarece niciun fișier dat nu este vreodată un număr prim, numărul este mărit artificial cu octeți suplimentari (umplutură). Această umplutură este incrementată într-o buclă până când un test de primalitate, cum ar fi testul Miller-Rabin, confirmă că numărul este prim. Următorul generator folosește codul DeCSS descris mai sus și caută o reprezentare corespunzătoare a unui număr prim.:

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

Trucul numerelor prime nu a făcut niciodată obiectul unui proces separat și nici nu era nevoie. Deși numărul prim original al lui Carmody avea 1401 cifre, acesta era prea mic pentru listele de top ale celor mai mari numere prime de la acea vreme. Ulterior, el a creat o versiune cu 1905 cifre, umflată artificial cu octeți nuli, pentru a obține locul zece în clasamentul ECPP . Acest succes a demonstrat imposibilitatea cenzurii matematicii pure, deoarece numărul și-a câștigat locul pe listă exclusiv pe baza proprietăților sale matematice.

Înapoi