Τον Οκτώβριο του 1999, μια ομάδα με επικεφαλής τον τότε 16χρονο Νορβηγό Jon Lech Johansen κυκλοφόρησε το πρόγραμμα DeCSS για να παρακάμψει την προστασία αναπαραγωγής DVD του Συστήματος Αναδιαμόρφωσης Περιεχομένου (CSS). Το CSS χρησιμοποιούσε κρυπτογράφηση 40-bit, τα κλειδιά της οποίας διανεμήθηκαν σε αδειοδοτημένους κατασκευαστές, για να περιορίσει την αναπαραγωγή DVD. Επειδή η διανομή του κώδικα εμπίπτει στον αμερικανικό νόμο DMCA και απαγορεύεται νομικά, οι ακτιβιστές αναζήτησαν τρόπους να συγκαλύψουν τον κώδικα ως μαθηματική οντότητα.
Στη συνέχεια, ο Phil Carmody κατασκεύασε έναν πρώτο αριθμό ο οποίος, όταν ερμηνεύεται σε δυαδικό κώδικα μετά από αποσυμπίεση gzip, περιέχει τον πλήρη πηγαίο κώδικα του DeCSS. Ο πυρήνας του αλγορίθμου DeCSS μπορεί να υλοποιηθεί σε TypeScript ως εξής, όπου οι λειτουργίες bit αντιστοιχούν απευθείας στη λογική αποκρυπτογράφησης τομέων.:
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++;
}
}
Η αρχή πίσω από τον πρώτο αριθμό είναι η ερμηνεία ολόκληρου του πηγαίου κώδικα ως ένας ενιαίος, συμπαγής ακέραιος αριθμός. Δεδομένου ότι κανένα δεδομένο αρχείο δεν είναι ποτέ πρώτος αριθμός, ο αριθμός αυξάνεται τεχνητά με επιπλέον bytes (συμπλήρωση). Αυτή η συμπλήρωση αυξάνεται σε έναν βρόχο μέχρι μια δοκιμή πρωτότητας, όπως η δοκιμή Miller-Rabin, να επιβεβαιώσει ότι ο αριθμός είναι πρώτος. Η ακόλουθη γεννήτρια χρησιμοποιεί τον κώδικα DeCSS που περιγράφεται παραπάνω και αναζητά μια αντίστοιχη αναπαράσταση πρώτου αριθμού.:
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));
Το κόλπο με τους πρώτους αριθμούς δεν αποτέλεσε ποτέ αντικείμενο ξεχωριστής δικαστικής υπόθεσης, ούτε χρειαζόταν. Αν και ο αρχικός πρώτος αριθμός του Carmody είχε 1401 ψηφία, ήταν πολύ μικρός για τις κορυφαίες λίστες με τους μεγαλύτερους πρώτους αριθμούς εκείνη την εποχή. Αργότερα δημιούργησε μια έκδοση 1905 ψηφίων, τεχνητά διογκωμένη με null bytes, για να κατακτήσει τη δέκατη θέση στην κατάταξη του ECPP . Αυτή η επιτυχία κατέδειξε την αδυναμία λογοκρισίας των καθαρών μαθηματικών, καθώς ο αριθμός κέρδισε τη θέση του στη λίστα αποκλειστικά με βάση τις μαθηματικές του ιδιότητες.