Pada Oktober 1999, sebuah kelompok yang dipimpin oleh Jon Lech Johansen, seorang remaja Norwegia berusia 16 tahun saat itu, merilis program DeCSS untuk mengakali sistem perlindungan pemutaran DVD Content Scramble System (CSS). CSS menggunakan enkripsi 40-bit, yang kuncinya didistribusikan kepada produsen berlisensi, untuk membatasi pemutaran DVD. Karena distribusi kode tersebut berada di bawah DMCA AS dan dilarang secara hukum, para aktivis mencari cara untuk menyamarkan kode tersebut sebagai entitas matematika.
Phil Carmody kemudian menyusun bilangan prima yang, ketika diinterpretasikan dalam biner setelah dekompresi gzip, berisi kode sumber lengkap DeCSS. Inti dari algoritma DeCSS dapat diimplementasikan dalam TypeScript sebagai berikut, di mana operasi bit secara langsung memetakan logika dekripsi sektor.:
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 balik bilangan prima adalah menginterpretasikan seluruh kode sumber sebagai satu bilangan bulat tunggal. Karena tidak ada file yang merupakan bilangan prima, angka tersebut secara artifisial ditambah dengan byte tambahan (padding). Padding ini ditingkatkan dalam sebuah loop hingga uji primality, seperti uji Miller-Rabin, mengkonfirmasi bahwa angka tersebut adalah bilangan prima. Generator berikut menggunakan kode DeCSS yang dijelaskan di atas dan mencari representasi bilangan prima yang sesuai.:
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));
Trik bilangan prima tersebut tidak pernah menjadi subjek kasus pengadilan terpisah, dan memang tidak perlu. Meskipun bilangan prima asli Carmody memiliki 1401 digit, bilangan tersebut terlalu kecil untuk masuk dalam daftar bilangan prima terbesar pada saat itu. Ia kemudian menciptakan versi 1905 digit, yang secara artifisial diperbesar dengan byte nol, untuk mencapai peringkat kesepuluh dalam peringkat ECPP . Keberhasilan ini menunjukkan ketidakmungkinan untuk menyensor matematika murni, karena bilangan tersebut mendapatkan tempatnya dalam daftar semata-mata berdasarkan sifat-sifat matematisnya.