Pada Oktober 1999, sebuah kumpulan yang diketuai oleh Jon Lech Johansen dari Norway yang ketika itu berusia 16 tahun telah mengeluarkan program DeCSS untuk memintas perlindungan main balik DVD Content Scramble System (CSS). CSS menggunakan penyulitan 40-bit, yang kuncinya diedarkan kepada pengeluar berlesen, untuk menyekat main balik DVD. Oleh kerana pengedaran kod tersebut berada di bawah DMCA AS dan dilarang secara sah, aktivis mencari jalan untuk menyamar kod tersebut sebagai entiti matematik.
Phil Carmody kemudian membina nombor perdana yang, apabila ditafsirkan dalam binari selepas penyahmampatan gzip, mengandungi kod sumber lengkap DeCSS. Teras algoritma DeCSS boleh dilaksanakan dalam TypeScript seperti berikut, di mana operasi bit memetakan logik penyahsulitan sektor secara langsung.:
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++;
}
}
Prinsip di sebalik nombor perdana adalah untuk mentafsirkan keseluruhan kod sumber sebagai integer tunggal yang kukuh. Memandangkan tiada fail tertentu yang merupakan nombor perdana, nombor tersebut ditambah secara buatan dengan bait tambahan (padding). Padding ini ditambah dalam satu gelung sehingga ujian primaliti, seperti ujian Miller-Rabin, mengesahkan nombor tersebut adalah nombor perdana. Penjana berikut menggunakan kod DeCSS yang diterangkan di atas dan mencari perwakilan nombor perdana yang sepadan.:
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));
Helah nombor perdana tidak pernah menjadi subjek kes mahkamah yang berasingan, dan ia juga tidak perlu menjadi subjek. Walaupun nombor perdana asal Carmody mempunyai 1401 digit, ia terlalu kecil untuk senarai teratas nombor perdana terbesar pada masa itu. Beliau kemudiannya mencipta versi 1905 digit, yang ditambah secara buatan dengan bait nol, untuk mencapai tempat kesepuluh dalam ranking ECPP . Kejayaan ini menunjukkan kemustahilan menapis matematik tulen, kerana nombor itu memperoleh tempatnya dalam senarai semata-mata berdasarkan sifat matematiknya.