នៅក្នុងខែតុលា ឆ្នាំ១៩៩៩ ក្រុមមួយដឹកនាំដោយលោក Jon Lech Johansen ជនជាតិន័រវេស អាយុ ១៦ ឆ្នាំនៅពេលនោះ បានចេញផ្សាយកម្មវិធី DeCSS ដើម្បីគេចវេះការការពារការចាក់ឌីវីឌី Content Scramble System (CSS)។ CSS បានប្រើការអ៊ិនគ្រីប ៤០ ប៊ីត ដែលសោត្រូវបានចែកចាយទៅឱ្យក្រុមហ៊ុនផលិតដែលមានអាជ្ញាប័ណ្ណ ដើម្បីរឹតបន្តឹងការចាក់ឌីវីឌី។ ដោយសារតែការចែកចាយលេខកូដស្ថិតនៅក្រោម DMCA របស់សហរដ្ឋអាមេរិក ហើយត្រូវបានហាមឃាត់ដោយស្របច្បាប់ សកម្មជនបានស្វែងរកវិធីដើម្បីក្លែងបន្លំលេខកូដជាអង្គភាពគណិតវិទ្យា។
បន្ទាប់មក Phil Carmody បានបង្កើតចំនួនបឋមមួយ ដែលនៅពេលបកស្រាយជាប្រព័ន្ធគោលពីរបន្ទាប់ពីការពន្លា 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++;
}
}
គោលការណ៍នៅពីក្រោយចំនួនបឋមគឺដើម្បីបកស្រាយកូដប្រភពទាំងមូលជាចំនួនគត់រឹងតែមួយ។ ដោយសារតែគ្មានឯកសារណាមួយជាចំនួនបឋមទេ ចំនួននេះត្រូវបានបង្កើនដោយសិប្បនិម្មិតជាមួយនឹងបៃបន្ថែម (ការបន្ថែមចន្លោះ)។ ការបន្ថែមចន្លោះនេះត្រូវបានបង្កើនជារង្វិលជុំរហូតដល់ការធ្វើតេស្តបឋម ដូចជា ការធ្វើតេស្ត 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 ខ្ទង់ ដែលត្រូវបានបំប៉ោងដោយសិប្បនិម្មិតជាមួយនឹងបៃទទេ ដើម្បីសម្រេចបានចំណាត់ថ្នាក់ទីដប់នៅក្នុង ចំណាត់ថ្នាក់ ECPP ។ ភាពជោគជ័យនេះបានបង្ហាញពីភាពមិនអាចទៅរួចនៃការត្រួតពិនិត្យគណិតវិទ្យាសុទ្ធ ដោយសារចំនួននេះទទួលបានកន្លែងរបស់វានៅក្នុងបញ្ជីតែលើមូលដ្ឋាននៃលក្ខណៈសម្បត្តិគណិតវិទ្យារបស់វា។