Vào tháng 10 năm 1999, một nhóm do Jon Lech Johansen, khi đó mới 16 tuổi, người Na Uy, dẫn đầu đã phát hành chương trình DeCSS để phá vỡ hệ thống mã hóa nội dung (CSS) bảo vệ phát lại DVD. CSS sử dụng mã hóa 40 bit, với các khóa được phân phối cho các nhà sản xuất được cấp phép, để hạn chế việc phát lại DVD. Vì việc phân phối mã này thuộc phạm vi Đạo luật DMCA của Hoa Kỳ và bị cấm theo pháp luật, các nhà hoạt động đã tìm cách ngụy trang mã này dưới dạng một thực thể toán học.
Phil Carmody sau đó đã tạo ra một số nguyên tố mà khi được diễn giải dưới dạng nhị phân sau khi giải nén gzip, chứa toàn bộ mã nguồn của DeCSS. Phần cốt lõi của thuật toán DeCSS có thể được triển khai trong TypeScript như sau, trong đó các phép toán bit trực tiếp ánh xạ logic giải mã sector.:
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++;
}
}
Nguyên tắc đằng sau số nguyên tố là diễn giải toàn bộ mã nguồn như một số nguyên duy nhất, vững chắc. Vì không có tệp nào là số nguyên tố ngay từ đầu, nên số này được bổ sung thêm các byte (đệm) một cách nhân tạo. Phần đệm này được tăng dần trong một vòng lặp cho đến khi một phép thử tính nguyên tố, chẳng hạn như phép thử Miller-Rabin, xác nhận số đó là số nguyên tố. Trình tạo sau đây sử dụng mã DeCSS được mô tả ở trên và tìm kiếm một biểu diễn số nguyên tố tương ứng.:
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));
Thủ thuật số nguyên tố chưa bao giờ là chủ đề của một vụ kiện riêng biệt, và cũng không cần thiết phải như vậy. Mặc dù số nguyên tố ban đầu của Carmody có 1401 chữ số, nhưng nó quá nhỏ so với danh sách các số nguyên tố lớn nhất vào thời điểm đó. Sau này, ông đã tạo ra một phiên bản 1905 chữ số, được làm phồng lên một cách nhân tạo bằng các byte rỗng, để đạt được vị trí thứ mười trong bảng xếp hạng ECPP . Thành công này đã chứng minh sự bất khả thi của việc kiểm duyệt toán học thuần túy, vì con số này đã giành được vị trí trong danh sách chỉ dựa trên các thuộc tính toán học của nó.