W październiku 1999 roku grupa kierowana przez 16-letniego wówczas Norwega Jona Lecha Johansena opublikowała program DeCSS , aby obejść zabezpieczenie Content Scramble System (CSS) przed odtwarzaniem płyt DVD. CSS wykorzystywał 40-bitowe szyfrowanie, którego klucze były przekazywane licencjonowanym producentom, aby ograniczyć odtwarzanie płyt DVD. Ponieważ dystrybucja kodu podlegała amerykańskiej ustawie DMCA i była prawnie zabroniona, aktywiści szukali sposobów na zamaskowanie go jako encji matematycznej.
Phil Carmody skonstruował następnie liczbę pierwszą, która po zinterpretowaniu binarnym po dekompresji gzip zawiera kompletny kod źródłowy DeCSS. Rdzeń algorytmu DeCSS można zaimplementować w TypeScript w następujący sposób, gdzie operacje bitowe bezpośrednio odwzorowują logikę deszyfrowania sektorów.:
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++;
}
}
Zasada działania liczby pierwszej polega na interpretowaniu całego kodu źródłowego jako pojedynczej, spójnej liczby całkowitej. Ponieważ żaden plik nie jest liczbą pierwszą, liczba ta jest sztucznie powiększana o dodatkowe bajty (uzupełnienie). To uzupełnienie jest zwiększane w pętli, aż test pierwszości, taki jak test Millera-Rabina, potwierdzi, że liczba jest pierwsza. Poniższy generator wykorzystuje opisany powyżej kod DeCSS i wyszukuje odpowiednią reprezentację liczby pierwszej.:
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));
Sztuczka z liczbami pierwszymi nigdy nie była przedmiotem osobnej sprawy sądowej i nie musiała nią być. Chociaż pierwotna liczba pierwsza Carmody'ego miała 1401 cyfr, była zbyt mała, aby znaleźć się na ówczesnych listach największych liczb pierwszych. Później stworzył wersję z 1905 cyframi, sztucznie rozszerzoną bajtami zerowymi, aby osiągnąć dziesiąte miejsce w rankingu ECPP . Ten sukces dowiódł niemożności cenzurowania czystej matematyki, ponieważ liczba ta zdobyła miejsce na liście wyłącznie dzięki swoim właściwościom matematycznym.