JavaRush /Kurslar /All lectures for UZ purposes /1-modul yakuniy loyiha uchun topshiriq

1-modul yakuniy loyiha uchun topshiriq

All lectures for UZ purposes
Daraja, Dars
Mavjud

Texnik topshiriq

Matnni Sezar shifri orqali shifrlash va shifrdan chiqarishga imkon beradigan dastur tuzish kerak. Dastur bir nechta ishlash rejimlarini qo'llab-quvvatlashi, katta fayllarni qayta ishlashi va kirish ma'lumotlarini tasdiqlashi kerak. Qo'shimcha ravishda grafik foydalanuvchi interfeysini va avtomatik shifrni buzish uchun statistik tahlilni qo'shishingiz mumkin.

Asosiy vazifalar:

Sezar shifrini amalga oshirish:

  • Alfavitni yaratish va ishlatish.
  • Berilgan kalitga mos ravishda belgilarni siljitish algoritmi.

Fayllarni qayta ishlash:

  • Fayllar bilan ishlash uchun funksionallik (o'qish, yozish).
  • Katta hajmdagi matnli fayllarni qayta ishlash.

Kirish ma'lumotlarini tasdiqlash:

  • Fayllarning mavjudligini tekshirish.
  • Kalitlarning yaroqliligini tekshirish.

Ish rejimlari:

Matnni shifrlash:

  • Faylni olib, kalit bilan shifrlash va yangi faylga shifrlangan matnni yozib qo'yuvchi shifrlash funksiyasi.

Matnni shifrdan chiqarish:

  • Ma'lum kalitdan foydalanib shifrdan chiqarish funksiyasi.

brute force usuli bilan shifrdan chiqarish (ixtiyoriy):

  • Har bir kalitni sinovdan o'tkazib muvaffaqiyatli shifrdan chiqarishning brute force usulini amalga oshirish.

Statistik tahlil usuli bilan shifrdan chiqarish (ixtiyoriy):

  • Tillarning xususiyatlaridan foydalangan holda avtomatik shifrdan chiqarish uchun statistik tahlil algoritmini rivojlantirish.

Foydalanuvchi interfeysini ishlab chiqish:

  • Matnli menyu yoki (ixtiyoriy) grafik interfeys

Qo'shimcha vazifalar:

  • Xatolik va istisnolarni qayta ishlash.
  • Ishlash uchun optimallashtirish.
  • Hujjatlashtirish va sinov.

Kriptologiya, kriptografiya va kriptoanaliz

Yakuniy loyihani yozish paytida kerak bo'ladigan nazariyani tahlil qilishni boshlaymiz. Kriptologiya va uning tarkibiy qismlarini ko'proq bilib olamiz. Shuningdek, yakuniy amaliy loyiha uchun foydalanadigan shifri haqida ko'proq o'rganamiz.

Vazifa: Sezar shifri bilan ishlaydigan dastur yozish.

Bu eng oddiy va mashhur shifrlash usullaridan biridir. Bu shifrning nomi, albatta, imperator Gay Yuliy Sezardan olingan va u buni generallari bilan maxfiy yozishmalar uchun ishlatgan.

Sezar shifri — bu o'rin almashtirish shifri: unda har bir ochiq matndagi belgi alfavitdagi biror doimiy sondan chapga yoki o'ngga joylashgan belgiga almashtiriladi.

Masalan, biz siljishni 3 ga o'rnatamiz (kalit = 3). Bunday holda A G ga, B D ga o'zgaradi va hokazo.

Sezar shifrini ko'rib chiqish uchun quyidagi o'yinchoqni ko'rib chiqamiz:

Bu o'yin o'zaro aylanuvchi ikki doiradan iborat. Har bir doiraning perimeterida alifbo tartibida harflar yozilgan. Barcha ichki doira harflari tashqi doira harflariga nisbatan bir xil masofaga siljiydi.

Shifrlash uchun biz tashqi doiradagi harflarni pastki doiradagi yonidagi harflar bilan almashtiramiz. Misol uchun, agar doiralar rasmda ko'rsatilgan bo'lsa, A C ga, R esa T ga almashtiriladi. A shifrdan chiqarishda esa hammasini teskari qilamiz: ichki doiradagi harflarni tashqi doiradagi harflarga almashtiramiz; ya'ni, C ni A ga, va T ni R ga qaytaramiz.

Faraz qilaylik, it Bobik qizcha Alisaga maxfiy xabar yozmoqchi. Ularning har biri bu o'yinchoqqa ega. Muvaffaqiyatli shifrlash va shifrdan chiqarish uchun ular o'yinchoqlarini aylantirish uchun qancha joylashish kerakligini kelishib olishlari kerak. Rasmda o'yinchoqlar ko'rsatilganidek, A C ga, B esa D ga aylangan, demak ichki doira 2 pozitsiyaga surilgan. Y ni A ga aylangan (va koinotga chiqib ketmaganini sez). Ular doiralarni 2 pozitsiyaga siljitishga kelishganda va Bobik Alisaga NGVU RNCA NGIQ deb yozilgan xabarni yubordi, Alisa darhol hammasini tushundi va Lego bilan qutini ochishga boshladi.

Ingliz alifbosida faqat 26 ta harf mavjud, shuning uchun doiralarni 1,2,...,25 pozitsiyaga aylantirish mumkin. Agar biz ularni 26 (yoki 0) pozitsiyaga aylantirsak, doira atrofidagi harflar mos keladi. CS50 ma’ruzasi, Kriptografiya. Sezar shifri va Vigenère shifrini o'qishingiz mumkin.

Kriptoanaliz — shifrni buzish

Kriptografiya — ma'lumotlarni shifrlash algoritmalari (va faqat bu emas)

Alfavit — shifrlash mumkin bo'lgan matnda uchraydi mumkin bo'lgan barcha belgilar to'plami. Sezar shifri uchun bu belgilar tartibini bilish juda muhim. Bu klassik harf tartibida bo'lmasligi mumkin, lekin Bobik (shifrlovchi) va Alisa (shifrdan chiqaruvchi) bu tartibni bilishlari kerak.

Statistik ma'lumotlarga asoslangan kriptoanaliz har bir tilda belgilarni ishlatish statistikasi mavjudligiga asoslangan. Masalan, bu matnda (men yozayotganimda) allaqachon 14 ta "va" va 24 ta "u" so'zlari mavjud. Agar bo'shliqlar saqlansa, bir harfli so'zlar eng ko'p ehtimol bilan U yoki Q yoki I bo'lishini taxmin qilish qiyin emas. Va agar Sezar shifrida klassik harf tartibida ishlatilgan bo'lsa, bu matnni shifrdan chiqarish juda oson bo'ladi (B uchun siljishni sinab ko'rin — o'qilmaydi — keyin Q uchun siljishni sinab ko'rin va hokazo).

Albatta, bir harfli so'zlarni yashirish uchun bo'shliqlarni o'chirish mumkin. Lekin shunda ham unli harflarni aniqlash oson (ular undosh harflarga nisbatan ancha ko'p uchraydi), yoki tez-tez uchraydigan so'zlar kabi YOKI. Hatto oddiy takrorlash ham qiyinchilik tug'dirmaydi, chunki tuzatish uchun juda kam variantlar mavjud (ingliz alifbosi uchun 25 ta). Shuning uchun, Bobik va Alisa ancha murakkab shifrlash usuliga urinishlari kerak.

Xiralikdan uzoqlashish — mumkin. Muhimi — ma'no.

Bu yakuniy loyiha uchun kerak bo'ladigan minimal nazariy ma'lumotlar. Topshiriqni ta'riflashga o'tamiz!

Qayerdan boshlash kerak: dastur arxitekturasi

Kod yozishni boshlashdan oldin, vazifani kichik vazifalarga ajratish va loyihaning umumiy arxitekturasi haqida o'ylash kerak. Aslida, bu sizning birinchi katta loyihangiz, shuning uchun nazariy jihatdan barchasini bitta katta sinfga joylashtirib, bir nechta metodlarni unda amalga oshirib, ularni main asosiy metodda chaqirish mumkin.

Bizning sinfimizni CaesarCipher deb ataymiz.

Bu sinfda biz alfavitni belgilaymiz, unda ishlaymiz, shifrlash, shifrdan chiqarish metodlarini yaratamiz, va main metodida — menyuning chaqirilishi.


public class CaesarCipher {
    
    // Alfavit
    private static final String ALPHABET = "bu yerda bizning alfavit bo'ladi";
        
    // Shifrlash, shifrdan chiqarish, brute force, statistik tahlil uchun metodlar
        
    public void encrypt(String inputFile, String outputFile, int key) {
        // Shifrlashni amalga oshirish
    }

    public void decrypt(String inputFile, String outputFile, int key) {
        // Shifrdan chiqarishni amalga oshirish
    }

    public void bruteForce(String inputFile, String outputFile, 
String optionalSampleFile) {
                // Brute force ni amalga oshirish
    }

    public void statisticalAnalysis(String inputFile, 
String outputFile, String optionalSampleFile) {
        // Statistik tahlilni amalga oshirish
    }

    // Yordamchi metodlar: validateInput(), createAlphabet(), shiftCharacter(), readFile(), writeFile()

public static void main(String[] args) {
    CaesarCipher cipher = new CaesarCipher();
    // Menyu logikasi
    // 1. Shifrlash
    // 2. Shifrdan chiqarish kalit bilan
    // 3. Brute force
    // 4. Statistik tahlil
    // 0. Chiqish
                
    // Shifrlash metodining chaqiruvining namunasi:
    // cipher.encrypt("input.txt", "output.txt", 3);
    }
}
}

Lekin tasavvur qiling, agar dasturingiz kengaysa. Barchasini bitta sinfda yozish unchalik qulay bo'lmaydi. Shuning uchun vaqt va xohishingiz bo'lsa, kodni yaxshiroq tashkil qilish va o'qish qulayligini oshirish uchun dasturni bir nechta sinflarga ajratish mumkin.

Masalan:

1. MainApp: Bu dastur ishga tushiriladigan asosiy sinf. Foydalanuvchining buyruqlarini qayta ishlash, mos metodlarni chaqirish va dastur ish jarayonini boshqarish uchun mas'ul.

public class MainApp {
    public static void main(String[] args) {
        // Ishlash rejimini tanlash uchun logika, mos metodlarni chaqirish
    }
}

2. Cipher: Sezar shifri va shifrdan chiqarish funksiyalarini amalga oshiradigan sinf


public class Cipher {
    private char[] alphabet;
    public Cipher(char[] alphabet) {
    this.alphabet = alphabet;
    }
    public String encrypt(String text, int shift) {
        // Shifrlash logikasi
    }
    public String decrypt(String encryptedText, int shift) {
        // Shifrdan chiqarish logikasi
    }
}

3. FileManager: Fayllarni o'qish va yozish uchun mas'ul.


public class FileManager {
    public String readFile(String filePath) {
        // Faylni o'qish logikasi
    }
    public void writeFile(String content, String filePath) {
        // Faylni yozish logikasi
    }
}

4. Validator: Fayl mavjudligi kabi kirish ma'lumotlarini tasdiqlash, kalitning yaroqliligini tekshirish.


public class Validator {
    public boolean isValidKey(int key, char[] alphabet) {
        // Kalitni tekshirish
    }
    public boolean isFileExists(String filePath) {
        // Fayl mavjudligini tekshirish
    }
}

5. BruteForce: Barcha kalitlarni sinovdan o‘tkazib, ochish usulini amalga oshirish.


public class BruteForce {
    public String decryptByBruteForce(String encryptedText, char[] alphabet) {
        // Brute force logikasi
    }
}

6. StatisticalAnalyzer: Shifrdan chiqarishda statistik tahlil uchun.


public class StatisticalAnalyzer {
    public int findMostLikelyShift(String encryptedText, 
char[] alphabet, String representativeText) {
        // Statik tahlil uchun siljishni aniqlash logikasi
    }
}

Sinflardan foydalanishning umumiy yondashuvi:

MainApp da foydalanuvchi ishlash rejimini tanlaydi, masalan, buyruqlar satrlari orqali yoki oddiy GUI orqali.

Keyin, FileManager, Cipher, Validator, BruteForce, va StatisticalAnalyzer sinflarining namunalari yordamida faylni o'qish, shifrlash/shifrdan chiqarish, tasdiqlash va tahlil kabi tegishli operatsiyalarni bajaradi.

Natijalar faylga qayta yoziladi yoki foydalanuvchiga ko'rsatiladi.

Bu shunchaki tavsiyalar! Siz dasturingizni boshqacha sinflarga ajratishingiz va ularga boshqacha nomlar berishingiz, alfavitni boshqacha yaratishingiz mumkin.

Natija

Natija: dastur bir nechta rejimda ishlaydi

Rejimlar:

  • Matnni shifrlash
  • Kalit yordamida matnni shifrdan chiqarish
  • brute force yordamida matnni shifrdan chiqarish (barcha variantlarni sinash)
  • (qo'shimcha) Matnni statistik tahlil yordamida shifrdan chiqarish

Dastur foydalanuvchi tomonidan ko'rsatilgan matn faylini ochib, yuqorida ko'rsatilgan amallardan birini bajarishi kerak. Shundan so'ng, natijani yangi faylga yozishi kerak.

Dastur quyidagi funktsiyalarni bajarishi kerak:

  • Belgilangan fayldan matnni shifrlash. Kirishda original matn faylining manzili, shifrlangan matnni yozish kerak bo'lgan fayl manzili va alfavitdagi siljish (bu Sezar shifrining kalitidir) berilgan. a) original fayl manzilda mavjudligini va b) kalit 0 dan (alfavit o'lchami - 1) gacha ekanligini tekshiring (yoki alfavit o'lchamiga bo'linmasi qoldig'ini oling).
  • Ma'lum kalit bilan shifrdan chiqarish. Kirishda — shifrlangan faylning manzili va shifrdan chiqarilgan fayl manzili, shuningdek shifrlashda foydalanilgan alfavitdagi siljish (kalit).
  • brute force usuli bilan shifrdan chiqarish (barcha mumkin bo'lgan siljishlarni sinash); Kirishda - shifrlangan fayl manzili, (ixtiyoriy) shifrlangan matnning namunasi bo'lgan matn bilan fayl manzili (masalan, boshqa muallifning asari) va shifrdan chiqarilgan matnni o‘z ichiga olishi kerak bo‘lgan fayl manzili.
  • Statistik tahlil usuli bilan shifrdan chiqarish; Kirishda hammasi brute force bilan bir xil.

Kirish ma'lumotlarini tasdiqlashni unutmang.

Shifrlash uchun dastlabki matn faylda bo‘lishi kerak. Ma'qul format txt bo‘lishi kerak. dastur yuzlab sahifalardagi katta matnlar bilan ishlay olishi kerak. Bu faylni dastur shifrlab, shifrlangan matnni boshqa faylga yozishi kerak.

Ko'rsatmalar

Alfavit

Bu masala mavjud bo'lgan alfavitni yarating. Shartga ko‘ra, bu rus alifbosi va punktuatsiya . , ” ’ : - ! ? BO‘SHLIQni o‘z ichiga oladi. Bo'shliqni esdan chiqarmang! Qanday qilib buni amalga oshirish mumkin? Masalan, alfabytni String, bir nechta qatorlar yoki String massiviga joylashtirish mumkin.

Yoki… alfavitni Set to‘plami, massiv yoki List ro'yxat asosida yaratishingiz mumkin. Shuningdek, ASCII jadvalidan foydalanishingiz mumkin.

Alfavit o'zgarmasligi sababli, bunday o'zgaruvchini public static final konstanda qilib qilish mantiqan to'g'ri bo'ladi. Bunday o'zgaruvchilarning nomlarini katta harflarda yozish odatiy.


    private static final List ALPHABET = Arrays.asList('а', 'б',
    'в','г', 'д', 'е', 'ж', 'з', 'и', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у',
    'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'я', '.', ',', '«', '»',
    ':', '!', '?', ' ');

Yana oddiy massivdan foydalanish yaxshiroqdir (chunki alfavit o'zgarmas, uni ro'yxatga joylashtirishning hech qanday ma'nosi yo'q). Massivlar kamroq xotira egallaydi, shuning uchun iloji boricha massivlardan foydalanish kerak, ayniqsa gap primitiv turlar haqida ketganda (ro'yxatlarda primitiv turlar obyektlarga o'ralib olinadi va ko'proq xotira egallaydi).


private static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з',
'и','к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ',
'ъ', 'ы', 'ь', 'э', 'я', '.', ',', '«', '»', '"', '\'', ':', '!', '?', ' '};
    

Shifrlash

Buning uchun siljish (kalit) va alfavitni bilish kerak.

Har bir original matn belgisini:

  • sizning alfavitda mavjudligini tekshiring. Agar u mavjud bo'lmasa, bu belgini o'tkazib yuboring.
  • uni alfavitdagi pozitsiyasini toping. Bu jarayonni (15 marta) tezlashtirish uchun qaysi ma'lumotlar tuzilmasidan foydalanish kerakligini o'ylab ko'ring, axir kutubxonani a harfini qidirmasdan skanerlash shart emas (Yaxshi, P harfini qidirish ham shart emas).
  • berilgan siljish bo'yicha joylashtirilgan belgini toping. Va shuni esda tutingki, o'yinchoqda Y A ga aylangan (va kosmosga uchib ketmagan). Qanday qilib buni kafolatlash mumkin? (harf pozitsiyasi + siljish) %( alfavit o'lchami) qilib ko'rishingiz mumkin.
  • original belgini shifrlangan belgiga almashtiring

Nafas olayotgan foydalanuvchini ko'rib chiqish uchun natijani faylga saqlang! (Agar foydalanuvchi .bash_profile yoki hosts faylingizni buzishga harakat qilsa, fayl nomini tasdiqlang!)

Dastur interfeysini yaratish / foydalanuvchi menyusi

Grafik interfeysni JavaFX yoki Swing yordamida yaratishingiz mumkin. Asosiy dastur yaratilgandan keyin yaxshi bo'ladi grafik interfeys bilan shug'ullanish. Ammo agar vaqt yetmayotgan bo'lsa yoki bunga vaqt sarflashni istamasangiz, tekstli menyu yaratib uni konsolda chiqarishingiz mumkin. Masalan:


import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Model.CommandSpec;
import picocli.CommandLine.Parameters;
import picocli.CommandLine.Option;
import picocli.CommandLine.ParameterException;
import picocli.CommandLine.Spec;
import java.util.Locale;
import java.io.File;
            
@Command(name = "cypher", subcommands = 
{CommandLine.HelpCommand.class },
        description = "Caesar cypher command")
public class Cypher implements Runnable {
    @Spec CommandSpec spec;
    @Command(name = "encrypt", description = "Encrypt from 
file to file using key")
    void encrypt(
                @Parameters(paramLabel = "", description = 
"source file with text to encrypt") File src,
                @Parameters(paramLabel = "", description = 
"dest file which should have encrypted text") File dest,
                @Parameters(paramLabel = "", description = 
"key for encryption") int key) {
        // TODO
    }
            
    @Command(name = "brute force", description = "Decrypt 
from file to file using brute force") // |3|
    void bruteForce(
                @Parameters(paramLabel = "", description = 
"source file with encrypted text") File src,
                @Option(names = {"-r",
"--representative"}, description = "file with unencrypted 
representative text") File representativeFile,
                @Parameters(paramLabel = "", description = 
"dest file which should have decrypted text") File dest) {
        // TODO
    }
            
    @Command(name = "statistical decryption", description = 
"Decrypt from file to file using statistical analysis") // |3|
    void statisticalDecrypt(
                @Parameters(paramLabel = "", description = 
"source file with encrypted text") File src,
                @Option(names = {"-r", 
"--representative"}, description = "file with unencrypted 
representative text") File representativeFile,
                @Parameters(paramLabel = "", description = 
"dest file which should have decrypted text") File dest) {
        // TODO
}
            
    @Command(name = "decrypt", description = "Decrypt from 
file to file using statistical analysis") // |3|
    void decrypt(
                @Parameters(paramLabel = "", description = 
"source file with encrypted text") File src,
                @Parameters(paramLabel = "", description = 
"dest file which should have decrypted text") File dest,
                @Parameters(paramLabel = "", description = 
"key for encryption") int key) {
        // TODO
    }
            
    @Override
    public void run() {
        throw new ParameterException(spec.commandLine(),
"Specify a subcommand");
    }
            
    public static void main(String[] args) {
        int exitCode = new CommandLine(new 
Cypher()).execute(args);
        System.exit(exitCode);
    }
}

Agar Picocli kutubxonasi bilan shug'ullanishni istamasangiz, eng oddiy tarzda: menyuni sikllar yoki switch operatori yordamida yaratishingiz mumkin. Shuningdek, foydalanuvchi istagiga ko'ra dasturni yakunlash kerak (masalan, "exit" so'zini kiritish orqali).

Fayllar bilan ishlash

Fayllar bilan ishlash uchun Java NIO kutubxonasidan foydalanish tavsiya etiladi, chunki:

  • Bu IO bilan solishtirganda zamonaviy va yuqori samarador API hisoblanadi.
  • Fayllarni asinxron qayta ishlashni qo'llab-quvvatlaydi.
  • Katta fayllar bilan to'g'ri ishlashni ta'minlaydi.

Fayllar bilan ishlash uchun NIO ning asosiy sinflari:

Path: Fayl yoki direktoriyaning yo'lini ifodalaydi.

Files: Fayllar va direktoriyalar bilan ishlash uchun statik metodlarni taqdim etadi (o'qish, yozish, nusxa olish, o'chirish va boshqalar).

Charset:matnli fayllarni o'qish/yozishda foydalaniladigan belgi kodlashni ifodalaydi.

NIO yordamida katta faylni o'qishning namunasi:


    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.charset.StandardCharsets;
    
    public class FileHandler {
    
        public static String readFile(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        byte[] bytes = Files.readAllBytes(path);
        return new String(bytes, StandardCharsets.UTF_8);
        }
    
        // ... fayllar bilan ishlash uchun boshqa metodlar ...
    
    }

Katta fayllar bilan ishlash uchun tavsiyalar:

  • Bo'limlarga bo'lib o'qish/yazish. Juda katta fayllar uchun, ular operativ xotiraga sig'masa, matnlarni satrlar bo'yicha o'qish uchun Files.lines() metodlarini yoki bloklar bo'yicha o'qish uchun Files.newInputStream() metodlarini qo'llang.
  • Bufferlash. Kirish/chiqish operatsiyalarini bufferdan o'tkazish uchun BufferedReader va BufferedWriter dan foydalaning, bu samaradorlikni oshiradi.

Shifrdan chiqarish

Buning uchun siljish (kalit) va alfavitni bilish kerak.

Har bir shifrlangan matn belgisini:

  • uning sizning alfavitda mavjudligini tekshiring. Agar yo'q bo'lsa — sizni xakerlar buzishyapti. Buni his qilib (yoki xatolik qaytaring).
  • uning alfavitdagi pozitsiyasini toping.
  • berilgan siljish bo'yicha belgi pozitsiyasini toping (lekin unutmang: siz shifrni yana bir marta shifrlashga urinayotganingiz yo'q, shuning uchun boshqa tomonga siljiting).
  • shifrlangan belgini shifrdan chiqarilgan belgiga almashtiring

Siz ushbu kodni keyingi kichik vazifalarda ishlatasiz, shuning uchun natijani oqimda chiqaring.

Natijani faylda saqlash kerak.

Vzlom (Brute Force)

Ma'lum kalitda shifrdan chiqarishni amalga oshirish uchun yozgan kodni kalitning barcha imkoniyatlarini sinab ko'rish uchun ishlatishingiz mumkin.

Ammo qanday qilib shifrdan chiqarish muvaffaqiyatli bo'lganini aniqlash mumkin? Matn namunasidan (muallifning vakil matni yoki bir xil uslubdagi) foydalaning. Lug'at yaratish va so'zlarni qanchalik mos kelishi va ularning uzunligi asosida metrika tuzish mumkin; yoki jumla va so'zlarning uzunligini o'rganadigan boshqa metrika tuzish, yoki qaysi harflar eng ko'p qaysi harflardan yoki so'zlarning boshlanishi qandayligini (3 harf) o'rganish mumkin, vakil fayllarni umuman ishlatmasdan, punktuatsiya va bo'shliqlarni tekshirish mumkinligini tekshirish mumkin; Eng yaxshi natijalarga ega variantni chiqish fayliga saqlang.

Vzlom (Statistik tahlil)

Qo'shimcha talablar (ixtiyoriy)

Matn namunasi (muallifning vakil matni yoki bir xil uslubda) va harflarning statistikasi (masalan, har 1000 belgiga qanchalik ko'p uchraydi)ni tuz. Yuzasidan. Shifrni bunday fayl va tahlilsiz ham buzish oson: ehtimol, odatiy matnda eng ko'p uchraydigan belgi bo'shliq.

Keyin shifrlangan matn uchun shunday statistika tuz. Shuni yodingizda tutingki, faqat belgilarni sanab chiqish kifoya emas, chunki matnlar turli uzunlikda bo'lishi mumkin!

Keyin vakil matn statistikasi nisbatan shifrlangan statistikasi uchun har bir mumkin bo'lgan siljishning og'ishini hisoblang (buning uchun og'ish kvadratlari yig'indisini yoki vektorlarning nuqta mahsulotini ishlatishingiz mumkin). Eng kam og'ishga ega siljishni toping va shu siljishdan foydalanib shifrdan chiqarasiz.

Tayyor loyiha variantlarini ko'rib chiqish

Loyiha uning guruhi tomonidan o'tgan paytda tekshiriladi

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION