Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: prosím, těžká úloha na šifrování

Aktivity
Avatar
Petr Slavik
Člen
Avatar
Petr Slavik:8.5.2020 22:56

Dobrý den,
dostali jsme za úkol šifrování a dešifrování textu ze souborů v Javě.
No úplně si tím nevím rady. Hlavní věc co nechápu jsou hesla jaké máme použít.

Zadání znělo:
Vytvořte třídu, která dokáže pomocí níže popsané šifry zašifrovat a rozšifrovat zadaný text. Aplikace načte otevřený text ze souboru "otevreny.txt" (uložte z přílohy do místa, kde ho aplikace dokáže přečíst) a zašifruje ho pomocí hesla "AHOJ" do souboru "sifrovany.txt". Správné řešení je v příloze. Dále aplikace přečte právě zašifrovaný text ze souboru "sifrovany.txt" a dešifruje ho se stejným heslem zpět do otevřeného textu.

Dále aplikace provede prolomení hesel k souboru "prolomit.txt". Ten obsahuje dva řádky, každý je výsledkem šifrování stejného otevřeného textu, ale různými hesly. Jedno heslo je dlouhé 2 znaky, jedno 3 znaky. Pořadí hesel je neznámé. Upřesnění: v otevřeném textu se nevyskytují znaky Q, W, ani X, takže je jen jedno správné řešení úlohy.

Šifrování:

Šifra pracuje pouze s velkými písmeny anglické abecedy (A-Z, 26 znaků), malá písmena na vstupu považuje za velká a do výstupu zapisuje vždy velká písmena. Ostatní znaky (mezery, interpunkce) ponechá, jak jsou (takže textový soubor je stále členěn na řádky na stejných místech).

Heslo je rovněž voleno pouze ze znaků A-Z (příp. a-z zvětšených na A-Z). Pokud je na příslušné pozici znak A, pak nedochází k šifrování a příslušná znak se zachová, jak je. Pokud je heslo znak B, při šifrování se posune šifrovaný znak o jedno doprava, při dešifrování doleva. Pro C o dva znaky atd. Pokud by šifrovaný (dešifrovaný) znak byl větší, než Z (menší, než A), posune se znak o 26 pozic (délku použité abecedy) opačným směrem (např. Z budeme šifrovat heslem B, tedy o jednu pozici doprava, , to bude Z+1, to je víc než Z, výsledkem bude Z+1-26=A), tedy jako kdyby byla písmena na kruhu. Následující písmeno šifrujeme dalším písmenem z hesla, pokud dojdeme na konec hesla, pokračujeme od začátku.

Příklad šifrování:

Otevřený text: AHOJ SVETE
Heslo: ABC
Posun doprava:

  • A o 0
  • B o 1
  • G o 6

Šifrování:

  • A [A] +0 A
  • H [B] +1 I
  • O [G] +6 U
  • J [A] +0 J
  • S [B] +1 T
  • V [G] +6 Z+2 -> B
  • E [A] +0 E
  • T [B] +1 U
  • E [G] +6 K

Šifrový text: AIUJ TBEUK

Příklad dešifrování:

Šifrový text: AIUJ TBEUK
Heslo: ABC
Posun doleva:

  • A o 0
  • B o 1
  • G o 6

Dešifrování: viz výše, ale všude je minus místo plus a první sloupec je prohozen s posledním

  • např. B [G] -6 A-5 -> V

Zkusil jsem: import java.util.*;

class Encryption
{
public static void main(String args[ ])
{
String str,Newstr=" ";
System.out.prin­t("Enter the String you want to Encrypt: ");
try {

Scanner in=new Scanner(System.in);
str=in.nextLine();
for (int i=0;i<str.len­gth();i++)
{
char ch=Character.to­LowerCase(str­.charAt(i));
switch (ch)
{
case 'a':
Newstr=Newstr+"{";
break;
case 'b':
Newstr=Newstr+"}";
break;
case 'c':
Newstr=Newstr+"#";
break;
case 'd':
Newstr=Newstr+"~";
break;
case 'e':
Newstr=Newstr+"+";
break;
case 'f':
Newstr=Newstr+"-";
break;
case 'g':
Newstr=Newstr+"*";
break;
case 'h':
Newstr=Newstr+"@";
break;
case 'i':
Newstr=Newstr+"/";
break;
case 'j':
Newstr=Newstr+"\\";
break;
case 'k':
Newstr=Newstr+"?";
break;
case 'l':
Newstr=Newstr+"$";
break;
case 'm':
Newstr=Newstr+"!";
break;
case 'n':
Newstr=Newstr+"^";
break;
case 'o':
Newstr=Newstr+"(";
break;
case 'p':
Newstr=Newstr+")";
break;
case 'q':
Newstr=Newstr+"<";
break;
case 'r':
Newstr=Newstr+">";
break;
case 's' :
Newstr=Newstr+"=";
break;
case 't':
Newstr=Newstr+";";
break;
case 'u':
Newstr=Newstr+",";
break;
case 'v' :
Newstr=Newstr+"_";
break;
case 'w':
Newstr=Newstr+"[";
break;
case 'x' :
Newstr=Newstr+"]";
break;
case 'y':
Newstr=Newstr+":";
break;
case 'z' :
Newstr=Newstr+"\"";
break;
case ' ' :
Newstr=Newstr+" ";
break;
case '.':
Newstr=Newstr+'3';
break;
case ',':
Newstr=Newstr+"1";
break;
case '(':
Newstr=Newstr+'4';
break;
case '\"':
Newstr=Newstr+'5';
break;
case ')' :
Newstr=Newstr+"7";
break;
case '?' :
Newstr= Newstr+"2";
break;
case '!':
Newstr= Newstr+"8";
break;
case '-' :
Newstr= Newstr+"6";
break;
case '%' :
Newstr = Newstr+"9";
break;
case '1':
Newstr=Newstr+"r";
break;
case '2':
Newstr=Newstr+"k";
break;
case '3':
Newstr=Newstr+"b";
break;
case '4':
Newstr = Newstr+"e";
break;
case '5':
Newstr = Newstr+"q";
break;
case '6':
Newstr = Newstr+"h";
break;
case '7':
Newstr = Newstr+"u";
break;
case '8' :
Newstr= Newstr+"y";
break;
case '9':
Newstr = Newstr+"w";
break;
case '0':
Newstr = Newstr+"z";
break;
default:
Newstr=Newstr+"0";
break;
}
}
}
catch(Exception ioe)
{
ioe.printStac­kTrace();
}
System.out.prin­tln("The encrypted string is: \n" +Newstr);
}
}

Chci docílit: Ale to nečte ze souboru a ani to moc nefunguje potřeboval bych s tím alespoň nějak pomoci :D

Předem děkuji

 
Odpovědět
8.5.2020 22:56
Avatar
Odpovídá na Petr Slavik
Matúš Olejník:9.5.2020 13:30

Ahoj, neviem veľmi o čo si sa v kóde snažil, ale v texte sa píše, že šifrovať máš len písmená anglickej abecedy :)

Dám sem niečo narýchlo napísané snáď to pôjde :D

import java.io.*;

class Scratch {

    private static final String ENCRYPTED_FILE_PATH = "sifrovany.txt";
    private static final String DECRYPTED_FILE_PATH = "otevreny.txt";
    private static final String KEY = "ABG";
    private static final int ALPHABET_SIZE = 'Z' - 'A' + 1;


    public static void main(String[] args) throws IOException {
        Scratch s = new Scratch();
        s.encryptTextFromFile(KEY, DECRYPTED_FILE_PATH, ENCRYPTED_FILE_PATH);
        s.decryptTextFromFile(KEY, ENCRYPTED_FILE_PATH, DECRYPTED_FILE_PATH);
    }

    public void encryptTextFromFile(String key, String inputFilePath, String outputFilePath) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader(inputFilePath))) {
            try (FileWriter fileWriter = new FileWriter(outputFilePath)) {
                int actualKeyOffset = 0;
                char newChar;

                String line = reader.readLine();
                while (line != null) {
                    for(Character ch : line.toCharArray()){
                        if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')){
                            newChar = (char) (Character.toUpperCase(ch) + Character.toUpperCase(key.charAt(actualKeyOffset)) - 'A');
                            fileWriter.write(newChar > 'Z' ? newChar - ALPHABET_SIZE : newChar);
                            actualKeyOffset = (actualKeyOffset + 1) % key.length();
                        } else {
                            fileWriter.write(ch);
                        }
                    }

                    line = reader.readLine();

                    if(line != null){
                        fileWriter.write('\n');
                    }
                }
            }
        }
    }

    public void decryptTextFromFile(String key, String inputFilePath, String outputFilePath) throws IOException {
        //...
    }
}

Pre dešifrovanie v metóde decryptTextFromFile len zmeníš dva riadky na

newChar = (char) (Character.toUpperCase(ch) - Character.toUpperCase(key.charAt(actualKeyOffset)) + 'A');
fileWriter.write(newChar < 'A' ? newChar + ALPHABET_SIZE : newChar);

Nakoniec k tomu zisteniu kľúča, neviem aké máš podmienky, ale ak môžeš použiť zašifrovaný a zároveň aj pôvodný text tak stačí ak použiješ logiku z metódy decryptTextFromFile s tým, že riadok z toho súboru prolomit.txt budeš dešifrovať kľúčom ktorý bude tvoj pôvodný text z otevreny.txt.

Ak ti to nepôjde tak kľudne píš, nejako to doriešime alebo vylepšíme :D

Nahoru Odpovědět
9.5.2020 13:30
/* I am not sure why this works but it fixes the problem */
Avatar
Petr Slavik
Člen
Avatar
Odpovídá na Matúš Olejník
Petr Slavik:11.5.2020 12:34

Jediné co mi tam nejde je ten řádek kde je: Scratch s = new Scratch();
jinak se to tváří dobře

 
Nahoru Odpovědět
11.5.2020 12:34
Avatar
Odpovídá na Petr Slavik
Matúš Olejník:11.5.2020 12:54

To je tak keď nestačí len úplne všetko skopírovať a dať do svojho kódu. Ja mám triedu nazvanú inak než ty. Tak napr. prepíš Scratch na Encryption ako máš ty. Trocha nad tým treba aj porozmýšľať a viacej kódiť a potom sa nezasekneš na takej drobnosti

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
11.5.2020 12:54
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.