Łamanie szyfru: wszystkie przesunięcia

Praktyka: teksty i szyfry - JavaScript od podstaw: konsola (JavaScript)

Szyfr Cezara ma tylko 25 sensownych kluczy, więc da się go złamać, próbując każdego (atak siłowy, brute force). Komputer odszyfrowuje tekst każdym przesunięciem i szuka słowa, którego się spodziewamy. Przy okazji liczymy litery obiektem-licznikiem: w polskich tekstach najczęstsze jest A, więc najczęstsza litera szyfrogramu też podpowiada klucz.

function shiftChar(ch, k) {
  const code = ch.charCodeAt(0);
  if (code >= 65 && code <= 90) {
    return String.fromCharCode(((code - 65 + k) % 26 + 26) % 26 + 65);
  }
  if (code >= 97 && code <= 122) {
    return String.fromCharCode(((code - 97 + k) % 26 + 26) % 26 + 97);
  }
  return ch;
}

function caesar(text, k) {
  let result = '';
  for (const ch of text) {
    result += shiftChar(ch, k);
  }
  return result;
}
const secret = 'ZWVARHUPL D ZGRVSL V VZTLQ';

for (let k = 1; k < 26; k++) {
  const attempt = caesar(secret, -k);
  if (attempt.includes('SZKOLE')) {
    console.log(`Klucz ${k}: ${attempt}`);
  }
}

const counts = {};
for (const ch of secret) {
  if (ch !== ' ') counts[ch] = (counts[ch] || 0) + 1;
}
const [top] = Object.entries(counts).sort((a, b) => b[1] - a[1]);
console.log('Najczęstsza litera:', top[0], 'razy', top[1]);

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu JavaScript od podstaw: konsola·Zaloguj się, aby zapisać postęp na koncie.