У жовтні 1999 року група під керівництвом 16-річного норвежця Йона Леха Йохансена випустила програму DeCSS для обходу захисту відтворення DVD-дисків за допомогою системи Content Scramble System (CSS). CSS використовувала 40-бітове шифрування, ключі до якого розповсюджувалися серед ліцензованих виробників, для обмеження відтворення DVD. Оскільки розповсюдження коду підпадало під дію DMCA США та було юридично заборонено, активісти шукали способи замаскувати код під математичну сутність.
Потім Філ Кармоді побудував просте число, яке при інтерпретації у двійковому вигляді після розпакування gzip містить повний вихідний код DeCSS. Ядро алгоритму DeCSS можна реалізувати в TypeScript наступним чином, де бітові операції безпосередньо відображають логіку дешифрування сектора.:
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++;
}
}
Принцип, що лежить в основі простого числа, полягає в інтерпретації всього вихідного коду як єдиного цілого числа. Оскільки жоден файл ніколи не є простим числом, число штучно доповнюється додатковими байтами (доповнення). Це доповнення збільшується в циклі, доки тест на простоту, такий як тест Міллера-Рабіна, не підтвердить, що число є простим. Наступний генератор використовує код 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));
Трюк із простими числами ніколи не був предметом окремої судової справи, та й не було потреби в цьому. Хоча оригінальне просте число Кармоді мало 1401 цифру, воно було занадто малим для перших списків найбільших простих чисел на той час. Пізніше він створив версію з 1905 цифрами, штучно завищену нульовими байтами, щоб посісти десяте місце в рейтингу ECPP . Цей успіх продемонстрував неможливість цензурування чистої математики, оскільки число заслужило своє місце у списку виключно на основі своїх математичних властивостей.