Në tetor të vitit 1999, një grup i udhëhequr nga norvegjezi 16-vjeçar Jon Lech Johansen publikoi programin DeCSS për të anashkaluar mbrojtjen e riprodhimit të DVD-ve nga Sistemi i Përzierjes së Përmbajtjes (CSS). CSS përdorte enkriptim 40-bit, çelësat e të cilit u shpërndaheshin prodhuesve të licencuar, për të kufizuar riprodhimin e DVD-ve. Meqenëse shpërndarja e kodit binte nën DMCA- në e SHBA-së dhe ishte e ndaluar ligjërisht, aktivistët kërkuan mënyra për ta maskuar kodin si një entitet matematik.
Pastaj Phil Carmody ndërtoi një numër të thjeshtë i cili, kur interpretohet në binar pas dekompresimit gzip, përmban kodin burimor të plotë të DeCSS. Bërthama e algoritmit DeCSS mund të zbatohet në TypeScript si më poshtë, ku operacionet e biteve hartëzojnë drejtpërdrejt logjikën e deshifrimit të sektorit.:
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++;
}
}
Parimi që qëndron pas numrit të thjeshtë është interpretimi i të gjithë kodit burimor si një numër i plotë i vetëm dhe i ngurtë. Meqenëse asnjë skedar i dhënë nuk është kurrë një numër i thjeshtë, numri shtohet artificialisht me bajt shtesë (mbushje). Ky mbushje rritet në një cikël derisa një test i thjeshtësisë, siç është testi Miller-Rabin, të konfirmojë se numri është i thjeshtë. Gjeneratori i mëposhtëm përdor kodin DeCSS të përshkruar më sipër dhe kërkon një përfaqësim përkatës të numrit të thjeshtë.:
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));
Truku me numrin e thjeshtë nuk ishte kurrë objekt i një çështjeje të veçantë gjyqësore, as nuk kishte nevojë të ishte. Edhe pse numri i thjeshtë origjinal i Carmody-t kishte 1401 shifra, ai ishte shumë i vogël për listat kryesore të numrave të thjeshtë më të mëdhenj në atë kohë. Më vonë ai krijoi një version me 1905 shifra, të fryrë artificialisht me bajt zero, për të arritur vendin e dhjetë në renditjen e ECPP-së . Ky sukses demonstroi pamundësinë e censurimit të matematikës së pastër, pasi numri e fitoi vendin e tij në listë vetëm në bazë të vetive të tij matematikore.