Java :: Aufgabe #34
6 Lösungen
Mit Caesar Chiffre ent- und verschlüsseln
Anfänger - Java
von Dome
- 03.01.2013 um 01:30 Uhr
Schreiben Sie ein Programm, indem Sie mit Hilfe der Caesar Chiffre einen beliebigen Text ent- und verschlüsseln können. Zuvor muss der Text und die Anzahl der Verschiebung angegeben werden. Groß- und Kleinschreibung muss nicht beachtet werden.
Konsolenausgabe:
Geben Sie den Text ein: Beispielwort
Um wie viele Stellen soll verschoben werden: 1
Ergebnis: Cfjtqjfmxpsu
Lösungen:
public class caesar {
static String verschiebung(String text,int verschiebung){
int Swap;
String endstring = "";
for (int i = 0;i< text.length() ;i++ ) {
Swap = (int)text.charAt(i);
Swap = Swap + verschiebung;
endstring = endstring + (char)Swap;
}
return endstring;
}
public static void main(String[] args) {
String text = InOut.readString("Text zur Verschlüsselung eingeben\n");
int verschiebung = InOut.readInt("Anzahl der Verschiebung\n");
System.out.println(verschiebung(text,verschiebung));
}
}
Entschlüsseln funktioniert im Moment nur mit kleinen Buchstaben und das richtige Wort muss aus eine Liste herausgesucht werden.
Java-Code
import java.util.ArrayList;
import java.io.*;
class caesar
{
static String alphabetVerschlüsseln = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static String alphabetEntschlüsseln = "abcdefghijklmnopqrstuvwxyz";
public static String verschlüsseln(int verschiebung, String text)
{
int index = 0;
String ausgabe = "";
for(int i = 0; i < text.length(); i++)
{
index = alphabetVerschlüsseln.indexOf(text.charAt(i));
ausgabe = ausgabe.concat(String.valueOf(alphabetVerschlüsseln.charAt(index + verschiebung)));
}
return ausgabe;
}
public static String entschlüsseln(String text)
{
String ausgabe = "";
int index = 0;
int verschiebung = 0;
ArrayList<String> ausgabeArray = new ArrayList<String>();
for(int i = 0; i < 26; i++)
{
for(int j = 0; j < text.length(); j++)
{
index = alphabetEntschlüsseln.indexOf(text.charAt(j));
if((index + i) > 25)
{
verschiebung = index + i - 26;
} else {
verschiebung = index + i;
}
ausgabe = ausgabe.concat(String.valueOf(alphabetEntschlüsseln.charAt(verschiebung)));
}
ausgabeArray.add(ausgabe);
System.out.println(ausgabeArray.get(i));
ausgabe = "";
}
return ausgabeArray.toString();
}
public static void main (String[] args) throws java.lang.Exception
{
String StrVerschlüsseln = "Beispielwort";
String StrEntschlüsseln = "qtxhextaldgi";
System.out.println(StrVerschlüsseln + " verschlüsselt ist:\n" + verschlüsseln(1, StrVerschlüsseln) + "\n");
System.out.println("Alle möglichen Verschiebungen von " + StrEntschlüsseln + ":\n");
entschlüsseln(StrEntschlüsseln);
}
}
Version 2
- Entschlüsselung mit Großbuchstaben eingebaut
Java-Code
- Entschlüsselung mit Großbuchstaben eingebaut
import java.util.ArrayList;
import java.lang.Character;
class caesar
{
final static String alphabetBeides = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
final static String alphabetGross = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final static String alphabetKlein = "abcdefghijklmnopqrstuvwxyz";
static String alphabet = "";
public static String verschlüsseln(int verschiebung, String text)
{
int index = 0;
String ausgabe = "";
for(int i = 0; i < text.length(); i++)
{
index = alphabetBeides.indexOf(text.charAt(i));
ausgabe = ausgabe.concat(String.valueOf(alphabetBeides.charAt(index + verschiebung)));
}
return ausgabe;
}
public static String entschlüsseln(String text)
{
String ausgabe = "";
int index = 0;
int verschiebung = 0;
ArrayList<String> ausgabeArray = new ArrayList<String>();
for(int i = 0; i < 26; i++)
{
for(int j = 0; j < text.length(); j++)
{
if(text.charAt(j) == Character.toLowerCase(text.charAt(j)))
{
alphabet = alphabetKlein;
index = alphabetKlein.indexOf(text.charAt(j));
} else {
alphabet = alphabetGross;
index = alphabetGross.indexOf(text.charAt(j));
}
if((index + i) > 25)
{
verschiebung = index + i - 26;
} else {
verschiebung = index + i;
}
ausgabe = ausgabe.concat(String.valueOf(alphabet.charAt(verschiebung)));
}
ausgabeArray.add(ausgabe);
System.out.println(i + ": " + ausgabeArray.get(i));
ausgabe = "";
}
return ausgabeArray.toString();
}
public static void main (String[] args) throws java.lang.Exception
{
String StrVerschlüsseln = "Beispielwort";
String StrEntschlüsseln = "Cfjtqjfmxpsu";
System.out.println(StrVerschlüsseln + " verschlüsselt ist:\n" + verschlüsseln(1, StrVerschlüsseln) + "\n");
System.out.println("Alle möglichen Verschiebungen von " + StrEntschlüsseln + ":\n");
entschlüsseln(StrEntschlüsseln);
}
}
Anmerkung: Die Programmierung kann noch verbessert werden durch z.B eine GUI zur Auswahl, aber ich habe mich vorerst auf das nötigste beschränkt
Zuerst Verschlüsseln:
Java-Code
Entschlüsseln:
Java-Code
Die Methoden die ich aus meinem eigenem Methodensammlung package benutzt habe:
Java-Code
Zuerst Verschlüsseln:
import Methodensammlung.Methoden;
/**
* Ein Text wird mithilfe des Caesar Chiffres verschlüsselt
*
* @author (nOrdan)
* @version (05.06.2019)
*/
public class Verschlüsseln
{
Methoden m = new Methoden();
public Verschlüsseln()
{
inputs();
}
private void inputs()
{
boolean valid1 = false;
int verschiebung = 0;
String text = null;
while (valid1 == false)
{
text = m.userInput("Geben sie ihren Text zum Verschlüsseln ein");
m.errorStringInput(text);
text = text.toUpperCase();
valid1 = true;
}
valid1 = false;
while (valid1 == false)
{
String input1 = m.userInput("Geben sie die gewünschte Verschiebung ein");
m.errorIntInput(input1);
try
{
verschiebung = m.parseInt(input1);
if (verschiebung > 26)
{
m.errorMessage("Ihr Wert ist größer als die größte mögliche Verschiebung","Size busy");
continue;
}
else
{
valid1 = true;
}
}
catch(Exception e)
{
m.errorMessage("Invalid user input","Invalid input");
}
}
verschlüsseln(text,verschiebung);
}
private void verschlüsseln(String text, int verschiebung)
{
String ergebnis = "";
int change;
for (int i = 0; i < text.length(); i++)
{
if (text.charAt(i) == ' ')
{
}
else
{
if (text.charAt(i) >= 65 && text.charAt(i) <= 90)
{
change = (int)text.charAt(i) + verschiebung;
if (change > 90)
{
change -= 26;
ergebnis += (char)change;
}
else
{
ergebnis += (char)change;
}
}
else
{
}
}
}
m.informationMessage("Ihr verschlüsselter Text lautet " + ergebnis + ". Außerdem wurden Leerzeichen,Zahlen und Sonderzeichen entfernt und alle Buchstaben wurden groß geschrieben, damit die alte römische Schreibweise erhalten bleibt!" ,"Ergebnis");
}
}
Entschlüsseln:
import Methodensammlung.Methoden;
/**
* Entschlüsseln eines mit Caesar Chiffre verschlüsseltem Text mit der Hilfe der BrutForce Methode (alle 25 Verschiebungen werden probiert)
*
* @author (nOrdan)
* @version (05.06.2019)
*/
public class Entschlüsseln
{
Methoden m = new Methoden();
public Entschlüsseln()
{
inputs();
}
private void inputs()
{
boolean valid1 = false;
String text = null;
while (valid1 == false)
{
text = m.userInput("Geben sie den zu entschlüsselnden Text ein");
m.errorStringInput(text);
text = text.toUpperCase();
valid1 = true;
}
entschlüsseln(text);
}
private void entschlüsseln(String text)
{
int change = 0;
String ergebnis = "";
for (int i = 1; i < 26; i++)
{
for (int y = 0; y < text.length(); y++)
{
if (text.charAt(y) == ' ')
{
}
else
{
if (text.charAt(y) >= 65 && text.charAt(y) <= 90)
{
change = (int)text.charAt(y) - i;
if (change < 65)
{
change += 26;
ergebnis += (char)change;
}
else
{
ergebnis += (char)change;
}
}
else
{
}
}
}
m.informationMessage("Mit der Verschiebung um " + i + ":" + ergebnis,"Entschlüsselt");
ergebnis = "";
}
}
}
Die Methoden die ich aus meinem eigenem Methodensammlung package benutzt habe:
public String userInput(String message)
{
return JOptionPane.showInputDialog(message);
}
public int parseInt(String input)
{
return Integer.parseInt(input);
}
public void errorIntInput(String input)
{
if (input == null)
{
System.exit(0); //Drückt der User auf abbrechen wird null zurück gegeben und das Programm wird beendet
}
else if (input.isEmpty() == true)
{
//continue; wenn nötig
}
}
public void errorStringInput(String input)
{
if (input == null)
{
System.exit(0); //Drückt der User auf abbrechen wird null zurück gegeben und das Programm wird beendet
}
else if (input.isEmpty() == true)
{
informationMessage("Da sie nichts eingegeben haben wird auch nichts ausgegeben","No input");
System.exit(0);
}
public void errorMessage(String message,String errorName)
{
JOptionPane.showMessageDialog(null,message,errorName,JOptionPane.ERROR_MESSAGE);
}
public void informationMessage(String message,String informationName)
{
JOptionPane.showMessageDialog(null,message,informationName,JOptionPane.INFORMATION_MESSAGE);
}
import java.util.*;
public class CaesarChiffre {
public static void main (String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Geben Sie den Text ein:\t");
String text = scanner.next();
text = text.toLowerCase();
System.out.print("Um wie viele Stellen soll verschoben werden:\t");
int anzahl = scanner.nextInt();
System.out.print("Ergebnis:\t");
for(int i = 0; i < text.length(); i++) {
int var = text.charAt(i);
if((text.charAt(i) == 122) || ((text.charAt(i) + anzahl) > 122)) {
var -= 26;
}
System.out.print((char) (var + anzahl));
}
scanner.close();
}
}import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CeasarChiffre {
public static void main(String args[]) {
FrCeasar frCeasar = new FrCeasar("Ceasar Ziffer");
}
}
class FrCeasar extends JFrame implements ActionListener {
JPanel pEingabe = new JPanel();
JLabel lbEingabe = new JLabel("Geben Sie den Text ein: ");
JTextField tfEingabe = new JTextField(20);
JPanel pZahl = new JPanel();
JLabel lbZahl = new JLabel("Geben Sie eine Zahl ein: ");
JTextField tfZahl = new JTextField(20);
JPanel pButton = new JPanel();
JButton bButton = new JButton("Verschlüsseln");
JPanel pAusgabe = new JPanel();
JLabel lbAusgabe = new JLabel("Ergebnis: ");
JTextField tfAusgabe = new JTextField(20);
FrCeasar(String titel) {
super(titel);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(440, 300);
setLocation(1000, 300);
setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 20));
tfAusgabe.setEditable(false);
pEingabe.add(lbEingabe);
pEingabe.add(tfEingabe);
pZahl.add(lbZahl);
pZahl.add(tfZahl);
pButton.add(bButton);
pAusgabe.add(lbAusgabe);
pAusgabe.add(tfAusgabe);
add(pEingabe);
add(pZahl);
add(pButton);
add(pAusgabe);
bButton.addActionListener(this);
tfEingabe.addActionListener(this);
tfZahl.addActionListener(this);
}
public void berechneCeasar(String stEingabetext, String stEingabeZahl) {
try {
int eingabeZahl = Integer.parseInt(stEingabeZahl);
char[] arrayABC = new char[26];
char[] arrayabc = new char[26];
StringBuilder sbAusgabe = new StringBuilder();
char tempZiffer;
char addZiffer;
for (int i = 0; i <= 25; i++) {
arrayABC[i] = (char) (i + 65);
arrayabc[i] = (char) (i + 97);
}
for (int i = 0; i < stEingabetext.length(); i++) {
tempZiffer = stEingabetext.charAt(i);
for (int j = 0; j < arrayABC.length; j++) {
if (arrayABC[j] == tempZiffer) {
if (eingabeZahl + j > 25) {
addZiffer = arrayABC[eingabeZahl + j - 26];
} else {
addZiffer = arrayABC[eingabeZahl + j];
}
sbAusgabe.append(addZiffer);
}
}
for (int j = 0; j < arrayabc.length; j++) {
if (arrayabc[j] == tempZiffer) {
if (eingabeZahl + j > 25) {
addZiffer = arrayabc[eingabeZahl + j - 26];
} else {
addZiffer = arrayabc[eingabeZahl + j];
}
sbAusgabe.append(addZiffer);
}
}
if (tempZiffer == ' ') {
sbAusgabe.append(' ');
}
}
tfAusgabe.setText(sbAusgabe.toString());
}
catch (NumberFormatException e) {
tfAusgabe.setText("Bitte Ganzzahl eingeben!");
}
}
@Override
public void actionPerformed(ActionEvent evt) {
berechneCeasar(tfEingabe.getText(), tfZahl.getText());
}
}