kleines Verschlüsselungsprogramm

Hier meine Version in ruby, sie verschlüsselt eingegebenen Text oder Files im Caesarcode, man kann eingeben, um wieviel Buchstaben verschoben werden soll. Der eingegebene Text oder der Text im File sollte in Kleinbuchstaben geschrieben sein, alles andere bleibt wie es ist, und das Ergebnis ist in Großbuchstaben, wie es bei Verschlüsselungen Standard ist.

Code:
class VProg
	def initialize(x)
		@x = x
	end
	def to_s
		if @x == 1
			textv()
		elsif @x == 2
			dateiv()
		else
			exit
		end
	end
	private
	def textv()
		puts "\n\n|-----Caesar-Verschluesselung-----|"
		puts "Geben Sie nun den Text in Kleinbuchstaben ein, der verschluesselt werden soll:\n\n"
		text1 = gets.chomp
		puts "\n\nGeben Sie ein, mit welchem Faktor der Text verschluesselt werden soll:\n\n"
		faktor = gets.to_i; text2 = verschluesseln(text1, faktor)
		puts text2
	end
	def dateiv()
		puts "\n\n|-----Caesar-Verschluesselung-----|"
		puts "Geben Sie nun den kompletten Pfad der Datei an, die verschluesselt werden soll:\n\n"
		pfad = gets.chomp
		puts "\n\nGeben Sie ein, mit welchem Faktor der Text verschluesselt werden soll:\n\n"
		faktor = gets.to_i; file = open(pfad, "r"); text1 = file.read; file.close
		text2 = verschluesseln(text1, faktor); file = open(pfad, "w"); file.print "#{text2}"
		puts "\n\nDatei verschluesselt.\n\n"
	end
	def verschluesseln(text1, faktor)
		a = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
		b = {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7, "h"=>8, "i"=>9, "j"=>10, "k"=>11, "l"=>12, "m"=>13, "n"=>14, "o"=>15, "p"=>16, "q"=>17, "r"=>18, "s"=>19, "t"=>20, "u"=>21, "v"=>22, "w"=>23, "x"=>24, "y"=>25, "z"=>26}
		text2 = text1.split(""); text1 = ""
		text2.each { |part|
			if b[part] != nil
				text1 += a[(b[part]-1-(26-faktor))]
			else
				text1 += part
			end
		}
		return text1
	end
end
puts "\n\n|--------------Menue--------------|"
puts "(1) Text verschluesseln"
puts "(2) Datei verschluesseln"
puts "(3) Programm beenden\n\n"
x = gets.to_i; vprog = VProg.new(x); vprog.to_s
 
und nochmal in Haskell ...

Code:
import Char
import List

caesar :: String -> (Int, Int) -> String
caesar [] (_, _) = []
caesar (x:xs) (shift, dec) = enc : caesar xs (shift, dec)
  where
    enc = [ 'A'..'Z'] !! (mod (ord x - 65 + (dec * shift)) 26)

vigenere :: String -> String -> (Int, Int) -> String
vigenere [] _ (_, _) = []
vigenere (x:xs) ks (idx, dec) = enc : vigenere xs ks (newIdx, dec)
  where
    alph = [ 'A'..'Z']
    newIdx = mod (idx + 1) (length ks)
    enc = alph !! (mod (ord x - 65 + (dec * (shift (ks !! idx, 0)))) 26)
    shift (k, i) = if i > 25 then 1 else if alph !! i == k then i else shift (k, i+1)

main :: IO()
main = do
  putStrLn $ "FELIX -> " ++ caesar "FELIX" (3, 1)
  putStrLn $ "IHOLA -> " ++ caesar "IHOLA" (3, -1)
  putStrLn $ "GEHEIMNIS -> " ++ vigenere "GEHEIMNIS" "AKEY" (0, 1)
  putStrLn $ "GOLCIWRGS -> " ++ vigenere "GOLCIWRGS" "AKEY" (0, -1)

Gruß
Felix
 
python3

kann nur cäsar und kann nur eingegebenen string ver-/entschlüsseln. habe vor, dateien vielleicht in den nächsten tagen noch ein zu bauen.


Code:
def encode(char, str):
    clear = "abcdefghijklmnopqrstuvwxyz"
    cryptic = clear[clear.index(char):] + clear[:clear.index(char)]

    crystr = ""

    str = str.lower()
    
    for i in str:
        if i not in clear:
            new = i
        else:
            new = cryptic[clear.index(i)]

        crystr = crystr + new

    return crystr

def decode(char, str):
    clear = "abcdefghijklmnopqrstuvwxyz"
    cryptic = clear[clear.index(char):] + clear[:clear.index(char)]

    enstr = ""

    str = str.lower()

    for i in str:
        if i not in cryptic:
            new = i
        else:
            new = clear[cryptic.index(i)]

        enstr = enstr + new

    return enstr
 
Nochmal in Python so dass es keiner versteht ;)

Cäsar:
Code:
text="TEST"; key=3; print "".join([chr((ord(c)-65+key)%26+65) for c in text])
Vigen?re:
Code:
text="TEST"; key="ABC"; print "".join([chr((ord(text[i])+ord(key[i%len(key)])-130)%26+65) for i in range(len(text))])
 
Hier mal mein Cäsar programm in Brainfuck :D:
Code:
,------------------------------------------------[->+<],>>>,----------[++++++++++<<[->+>+<<]>[-<+>]>.,----------]
Als erstes muss man den Schlüssel eingeben(leider nur von 0-9) und dann mit enter bestätigen. Als nächstes gibt man den zu verschlüsselnden text ein und bestätigt wieder mit enter.
Getestet mit Brainfuck Developer.
Ist vieleicht noch verbesserbar... ;)
 
So, das ganz mal in Assembler. Der Code ist ein bisschen unschön, aber ich fang erst an Assembler zu lernen.
Eingegeben werden dürfen nur Buchstaben (keine Leerzeichen). Die Buchstaben werden danach in Kleinbuchstaben umgewandelt und dann einzeln verschlüsselt.

Compiled wird das ganze mit:
Code:
nasm -fwin32 -o caesar.obj caesar.asm
golink /console /entry _main /fo caesar.exe caesar.obj msvcrt.dll kernel32.dll
Zum Compilieren benötigt man nasmx.

Code:
%include 'C:\Program Files\nasmx\inc\nasmx.inc'
%include 'C:\Program Files\nasmx\inc\win32\windows.inc'
%include 'C:\Program Files\nasmx\inc\win32\user32.inc'
%include 'C:\Program Files\nasmx\inc\win32\kernel32.inc'

extern printf
extern scanf
extern system
entry    caesar


[section .text]
    proc caesar
        invoke printf, "Enter a String to encrypt: "
        invoke scanf, "%s", input
        invoke printf, "Enter a number to shift: "
        invoke scanf, "%d", input2
        
        ;making lowercase
        mov ecx, 0
        .loopl:
            mov al, byte [input + ecx]
            cmp al, 0
            jz .extl
            ;Only letters?
            cmp al, 0x41
            jb .error
            cmp al, 0x7A
            ja .error
            cmp al, 0x5A
            jb .tstext
            cmp al, 0x61
            jb .error
            ;to lower
            .tstext:
            cmp al, 0x61
            jge .nothChange
            add al, 0x20
            mov byte [input + ecx], al
            .nothChange:
            inc ecx
            jmp .loopl
        .extl:
        
        ;encrypting
        mov ecx, 0
        .loope:
            mov al, byte [input + ecx]
            cmp al, 0
            jz .ext
            add al, byte [input2]
        .tst:
            cmp al, 0x7A
            ja .cora
            cmp al, 0x61
            jb .corb
            mov byte [input + ecx], al
            inc ecx
            jmp .loope
        .ext:
        
        invoke printf, "Encrypted: %s", input
        invoke system, "PAUSE>nul"
        
        .extProc:
        invoke ExitProcess, 0
        ret
        
        .cora:
            sub al, 0x19
            jmp .tst
        .corb:
            add al, 0x19
            jmp .tst
        .error:
            invoke printf, "Error: Only letters are allowd"
            jmp .extProc
    endproc

[section .bss]
    input    resb    256
    input2    resb    16
 
Da ich mich gerade (mal wieder) etwas näher mit Kryptographie beschäftige & die beiden Chiffren echte Klassiker der Kryptographie bilden, so wie das allseits beliebte HelloWorld für die Programmierung, habe ich eine kleine Java-Anwendung dazu geschrieben. Für eine GUI war ich zu faul & das Programm arbeitet auch ausschließlich mit Textdateien die im selben Ordner liegen...

Code:
import java.io.*;

public class KryptoHabo 
{//class
    public static void vigenereDecipher(String name, String keyWord)throws IOException
    {//vigenereDecipher()
        String dateiInhalt="0", dateiKlar;
        int textZaehler, keyZaehler;
        char[]krypt;
        FileReader faus=new FileReader(name+".txt");
        for (int i; (i=faus.read())!=-1;)
        {
            dateiInhalt=dateiInhalt+(char)(i);
        }
        dateiKlar=dateiInhalt.substring(1);
        textZaehler=dateiKlar.length();
        keyZaehler=keyWord.length();
        krypt=new char[textZaehler];
        for (int i=0, j=0; i<textZaehler; i++, j++)
        {
            if (j==keyZaehler)j=0;
            krypt[i]=(char)(dateiKlar.charAt(i)-keyWord.charAt(j));
        }
        FileWriter fein=new FileWriter(name+".txt");
        for (int i=0; i<textZaehler; i++)
        {
            fein.write(krypt[i]);
        }
        fein.close();
        System.out.println("Datei >"+name+"< entschlüsselt!");
        menue();
    }//vigenereDecipher()
    public static void vigenereCipher(String name, String keyWord)throws IOException
    {//vigenereCipher()
        String dateiInhalt="0", dateiKlar;
        int textZaehler, keyZaehler;
        char[]krypt;
        FileReader faus=new FileReader(name+".txt");
        for (int i; (i=faus.read())!=-1;)
        {
            dateiInhalt=dateiInhalt+(char)(i);
        }
        dateiKlar=dateiInhalt.substring(1);
        textZaehler=dateiKlar.length();
        keyZaehler=keyWord.length();
        krypt=new char[textZaehler];
        for (int i=0, j=0; i<textZaehler; i++, j++)
        {
            if (j==keyZaehler)j=0;
            krypt[i]=(char)(dateiKlar.charAt(i)+keyWord.charAt(j));
        }
        FileWriter fein=new FileWriter(name+".txt");
        for (int i=0; i<textZaehler; i++)
        {
            fein.write(krypt[i]);
        }
        fein.close();
        System.out.println("Datei >"+name+"< verschlüsselt!");
        menue();
    }//vigenereCipher()
    public static void caesarDecipher(String name, Integer key)throws IOException
    {//caesarDecipher()
        String dateiInhalt="0", dateiNeu;
        FileReader faus=new FileReader(name+".txt");
        for (int i; (i=faus.read())!=-1;)
        {
            dateiInhalt=dateiInhalt+(char)(i-key);
        }
        dateiNeu=dateiInhalt.substring(1);
        FileWriter fein=new FileWriter(name+".txt");
        fein.write(dateiNeu);
        fein.close();
        System.out.println("Datei >"+name+"< entschlüsselt!");
        menue();
    }//caesarDecipher()        
    public static void caesarCipher(String name, Integer key)throws IOException
    {//caesarKrypt()
        String dateiInhalt="0", dateiNeu;
        FileReader faus=new FileReader(name+".txt");
        for (int i; (i=faus.read())!=-1;)
        {
            dateiInhalt=dateiInhalt+(char)(i+key);
        }
        dateiNeu=dateiInhalt.substring(1);
        FileWriter fein=new FileWriter(name+".txt");
        fein.write(dateiNeu);
        fein.close();
        System.out.println("Datei >"+name+"< verschlüsselt!");
        menue();
    }//caesarKrypt()
    public static void menue()throws IOException
    {//menue()
        BufferedReader ein=new BufferedReader(new InputStreamReader(System.in));
        int auswahl, key;
        String name, keyWord;
        
        System.out.println("1 - Textdatei mit dem Cäsar-Code verschlüsseln");
        System.out.println("2 - Textdatei mit dem Cäsar-Code entschlüsseln");
        System.out.println("3 - Textdatei mit dem Vigenere-Code verschlüsseln");
        System.out.println("4 - Textdatei mit dem Vigenere-Code entschlüsseln");
        System.out.println("5 - Programm beenden");
        auswahl=Integer.parseInt(ein.readLine());
        
        if (auswahl==1)
        {
            System.out.println("Namen der Textdatei eingeben:");
            name=ein.readLine();
            System.out.println("Schlüssel angeben (Integer):");
            key=Integer.parseInt(ein.readLine());
            
            caesarCipher(name, key);
        }
        else if (auswahl==2)
        {
            System.out.println("Namen der Textdatei eingeben:");
            name=ein.readLine();
            System.out.println("Schlüssel angeben (Integer):");
            key=Integer.parseInt(ein.readLine());
            caesarDecipher(name, key);
        }
        else if (auswahl==3)
        {
            System.out.println("Namen der Textdatei eingeben:");
            name=ein.readLine();
            System.out.println("Schlüsselwort eingeben:");
            keyWord=ein.readLine();
            vigenereCipher(name, keyWord);
        }
        else if (auswahl==4)
        {
            System.out.println("Namen der Textdatei eingeben:");
            name=ein.readLine();
            System.out.println("Schlüsselwort eingeben:");
            keyWord=ein.readLine();
            vigenereDecipher(name, keyWord);
        }
        else if (auswahl==5)
        {
            System.out.println("Programm beendet...");
            System.exit(0);
        }
        else
        {
            System.out.println("Ungültige Eingabe!");
            menue();
        }
    }//menue()    
    public static void main(String[]args)throws IOException
    {//main
        menue();
    }//main
}//class
 
Zuletzt bearbeitet:
So hier mal meine etwas ausführlichere Version in C++.
Unterstützt bisher jedoch nur die Ceasar-Verschlüsselung und Ceasar-Entschlüsselung. Man kann entweder einen Text von Hand eingeben, oder eine Datei angeben.
Den ver- oder entschlüsselten Text, kann man sich zusätzlich zur Anzeige im Konsolenfenster, wenn man will in eine Datei schreiben lassen.

Weitere Verschlüsselungen folgen, diese sind ja jetzt leicht einzufügen.

Gruß freeG

EDIT:

Sooo nun hab ich auch die Vigenere-Verschlüsselung eingebaut.
Man kann jetzt also mit der Caesar- oder Vigenere-Verschlüsselung, eingegebene Texte, oder Dateien ver- und entschlüsseln.
Hier das neue Archiv.

Gruß freeG
 
Zuletzt bearbeitet:
Zwar schon alt der Thread hier, aber ich hab trotzdem was in Java gebastelt.
Es kann Vinegre, Cäsar hab ich ignoriert, da das "zu unsicher" ist ;-) Auf Wunsch kann es einen zufälligen Schlüssel generieren. Sollte ein eignegebenr Schlüssel zu kurz sein (kürzer als 3 Zeichen) wird ebenfalls automatisch ein neuer generiert.
Es ist möglich, (lesbare also txt oder sowas) Dateien zu verschlüsseln, oder einfach einen eingebenen Text. Auch Ausgabe in Dateien ist möglich. Oder eine wilde Kombination aus beidem ;-)
Wird eine Datei verschklüsselt gespeichert, wird der Schlüssel am Schluss angehängt, da ich keine Lust hatte, den ewig zu suchen, falls ich mal Mist baue ;-).
Die Codierte Ausgabe kann auf Wunsch in Großbuchstaben und/oder in 4er Gruppen formatiert werden, oder im ursprünglichem Zustand wiedergegeben werden.

Das ganze schön in eine Gui verpackt. -- nur Fehlermeldungen landen der Faulheit halber auf der Konsole.

Da es mehrere Dateien sind (wie eigentlich meißt in Java) hab ich die Quelldateien angehängt.
Hier die RunnableJar.
 
Zuletzt bearbeitet:
VB

Und hier noch ne Lösung in VB.

Habe allerdings die beiden Verschlüsselungen in zwei separate Konsolenanwendungen geschrieben.
Groß- oder Kleinschreibung wird hierbei nicht beachtet. Nicht-alphabetische Zeichen (alles, was nicht im Array ist) führen noch zum Absturz - mal gucken, wann/ob ich das noch ändere.

Code:
Module Module1

    Dim Alpha() As String = New String() {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", _
                                        "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
    Dim key As Integer
    Dim textalt As String = ""
    Dim textneu As String = ""
    Dim position As Integer
    Dim verschluesseln As Boolean

    Sub Main()
        Console.WriteLine("Text eingeben:")
        textalt = (Console.ReadLine).ToLower
        Console.WriteLine("Schlüssel eingeben:")
        key = Console.ReadLine
        Console.WriteLine("Richtung? (0 = entschlüsseln // 1 = verschlüsseln)")
        If Console.ReadLine() = 1 Then
            verschluesseln = True
        End If

        If verschluesseln Then
            For i As Integer = 0 To textalt.Length - 1
                position = Array.IndexOf(Alpha, textalt.Substring(i, 1))
                position += key
                If position > 25 Then
                    position -= 26
                End If
                textneu &= Alpha(position)
            Next
        Else
            For i As Integer = 0 To textalt.Length - 1
                position = Array.IndexOf(Alpha, textalt.Substring(i, 1))
                position -= key
                If position < 0 Then
                    position += 26
                End If
                textneu &= Alpha(position)
            Next
        End If

        Console.WriteLine(textneu)
        Console.ReadLine()
    End Sub
End Module

Code:
Module Module1

    Dim Alpha() As String = New String() {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", _
                                        "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
    Dim key As String
    Dim textalt As String = ""
    Dim textneu As String = ""
    Dim zeichen As String
    Dim position As Integer
    Dim verschluesseln As Boolean

    Sub Main()
        Console.WriteLine("Text eingeben:")
        textalt = (Console.ReadLine).ToLower
        Console.WriteLine("Schlüssel eingeben:")
        key = Console.ReadLine
        Console.WriteLine("Richtung? (0 = entschlüsseln // 1 = verschlüsseln)")
        If Console.ReadLine() = 1 Then
            verschluesseln = True
        End If

        If key.Length < textalt.Length Then
            Do While key.Length < textalt.Length
                key &= key
            Loop
        End If

        If verschluesseln Then
            For i As Integer = 0 To textalt.Length - 1
                position = Array.IndexOf(Alpha, textalt.Substring(i, 1))
                position += Array.IndexOf(Alpha, key.Substring(i, 1))
                If position > 25 Then
                    position -= 26
                End If
                textneu &= Alpha(position)
            Next
        Else
            For i As Integer = 0 To textalt.Length - 1
                position = Array.IndexOf(Alpha, textalt.Substring(i, 1))
                position -= Array.IndexOf(Alpha, key.Substring(i, 1))
                If position < 0 Then
                    position += 26
                End If
                textneu &= Alpha(position)
            Next
        End If

        Console.WriteLine(textneu)
        Console.ReadLine()
    End Sub
End Module
 
Zuletzt bearbeitet:
Source Code

Hier ist meine C++ Version:
(nur Ceaser-Schlüssel, kann man aber selbst angeben)

Code:
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
using namespace std;

int getcode();

int setcode();

int main()
{
    char eingabe;
    cout << "kleines Verschluesselungsprogramm" << endl;
    while(true)
    {
        cout << "Option: " << endl;
        cout << "Datei (v)erschluesseln" << endl;
        cout << "Datei (e)ntschluesseln" << endl;
        cout << "(B)eenden" << endl << endl;
        cin >> eingabe;

        switch(eingabe)
        {
        case 'v':
        case 'V':
            setcode();
            break;
        case 'e':
        case 'E':
            getcode();
            break;
        case 'b':
        case 'B':
            cout << "Programm wird beendet" << endl;
            cout << "Druecken Sie eine Taste um das Fenster zu schliessen" << endl;
            getch();
            return 0;
            break;
        default:
            cout << "Falsche Eingabe!" << endl;
            break;
        }
    }
}

int getcode()
{
    char zeichen;
    string quelldatei, zieldatei;
    int key;
    ifstream dat_ein;
    ofstream dat_aus;

    cout << "Welche Datei moechten Sie entschluesseln: ";
    cin >> quelldatei;
    cout << "In welche Datei soll geschrieben werden: ";
    cin >> zieldatei;

    dat_ein.open(quelldatei.c_str(), ios_base::in);
    dat_aus.open(zieldatei.c_str(), ios_base::out);

    if(!dat_ein)
    {
        cerr << "Quelldatei konnte nich geoeffnet werden!" << endl;
        return -1;
    }

    if(!dat_aus)
    {
        cerr << "Zieldatei konnte nich geoeffnet werden!" << endl;
        return -1;
    }

    cout << "Bitte geben Sie den Schluessel (Zahl) an: ";
    cin >> key;


    while(!dat_ein.eof())
    {
        dat_ein.get(zeichen);
        zeichen = zeichen - key;
        dat_aus << zeichen;
    }

    dat_ein.close();
    dat_aus.close();
        
    
    cout << "erledigt!" << endl;
    return 1;
}

int setcode()
{
    char zeichen;
    string quelldatei, zieldatei;    
    int key;
    ifstream dat_ein;
    ofstream dat_aus;

    cout << "Welche Datei moechten Sie verschluesseln: ";
    cin >> quelldatei;
    cout << "In welche Datei soll geschrieben werden: ";
    cin >> zieldatei;

    dat_ein.open(quelldatei.c_str(), ios_base::in);
    dat_aus.open(zieldatei.c_str(), ios_base::out);

    if(!dat_ein)
    {
        cerr << "Quelldatei konnte nich geoeffnet werden!" << endl;
        return -1;
    }

    if(!dat_aus)
    {
        cerr << "Zieldatei konnte nich geoeffnet werden!" << endl;
        return -1;
    }

    cout << "Bitte geben Sie den Schluessel (Zahl) an: ";
    cin >> key;

    while(!dat_ein.eof())
    {
        dat_ein.get(zeichen);
        zeichen = zeichen + key;
        dat_aus << zeichen;
    }

    dat_ein.close();
    dat_aus.close();
        
    
    cout << "erledigt!" << endl;
    return 1;
}
 
RC4 in 26 Python-Zeilen. 1:1 aus Wikipedia umgesetzt und kann Dateien ver/entschlüsseleln. Muss also nicht immer Caeser oder Vigenère sein ;)

Code:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys

def init_sbox(key):
    s = range(256)
    j = 0
    for i in range(256):
        j = (j + s[i] + ord(key[i % len(key)])) % 256
        s[i], s[j] = s[j], s[i]
    return s

def crypt(text, key):
    buf = list(text)
    i = j = 0
    s = init_sbox(key)
    for n in xrange(len(text)):
        i = (i + 1) % 256
        j = (j + s[i]) % 256
        s[i], s[j] = s[j], s[i]
        rand = s[(s[i] + s[j]) % 256]
        buf[n] = chr(rand ^ ord(buf[n]))

    return "".join(buf)

try:
    with open(sys.argv[1], "r+b") as data:
        new_content = crypt(data.read(), sys.argv[2])
        data.seek(0)
        data.write(new_content)
except IndexError:
    print "usage: rc4.py file key"
 
Chiffrierung

Hallo,

ich hab hier ein kleines, aber noch unvollständiges Programm, mit dem auch ganze Dateigruppen ver- und entschlüsselt werden können.
Unvollständig deshalb, weil mir noch der Enigma Code fehlt.
ist in C# geschrieben.

VS2008 Projekt als Anhang.
 
Hi,

Ich habe es auch mal in Python versucht und denke ich habe das ganz erfolgreich geschafft. Verbesserungsvorschläge nehme ich gerne an:wink:

Code:
#! /usr/bin/env python

a = 3
#Eingabe
klartext = raw_input("Klartext: ")
auswahl = input("Verschluesseln(1)&Entschluesseln(0): ")
#Verarbeitung
laenge = len(klartext)
i = 0
if auswahl != 0:
  while i < laenge:
      zeichen = klartext[i]
      zahl = ord(zeichen)
      neuezahl = zahl + a
      zeichen = chr(neuezahl)
      print zeichen
      i = i + 1
else:
  while i < laenge:
     zeichen = klartext[i]
     zahl = ord(zeichen)
     neuezahl = zahl - a
     zeichen = chr(neuezahl)
     print zeichen
     i = i + 1
# Ausgabe
print klartext
 
Als Zusatzaufgabe könnte man noch machen, dass das Programm den Schlüssel selbst herausfinden muss und dann entsprechend entschlüsselt. Bei Caesar funktioniert das ganz gut, Häufigstes Zeichen ist (in langen Texten) das Leerzeichen. Man kann die Entschlüsselung der Texte auch so machen, dass es nach ein paar Worten das bisherige Ergebnis mit einem Wörterbuch gegenprüft und bei entsprechender Erfolgsrate weiter entschlüsselt / einen neuen Schlüssel sucht. Werd mich heute Mittag mal dran setzen...

LG, Micha
 
meine lösung zu der aufgabe ist ein konsolenprogramm das dateien per caesar oder vigenere ver/entschluesselt. :)
nur lateinische buchstaben werden verschlüsselt, sonderzeichen/satzzeichen und exotische buchstaben bleiben unverändert.
(so habe ich zumindest das konzept dieser alten verschlüsselungskonzepte verstanden, dass die buchstaben nur im alphabet rotieren)

Code:
import java.io.*;
public class Caesar {
	public static String alphabet = "abcdefghijklmnopqrstuvwxyz";
	
	public static void cfileCode(String file, int key) throws IOException {
		FileReader freader = new FileReader(file);
	    BufferedReader breader = new BufferedReader(freader);
	    FileWriter fwriter = new FileWriter(file + "-coded.txt");
	    BufferedWriter bwriter = new BufferedWriter(fwriter);
	    boolean ende = false;
	    while (ende==false) {
	    	String zeile = breader.readLine();
	    	if (zeile == null) {
	    		ende = true;
	    	} else {
	    		String codedZeile = code(zeile, key);
	    		bwriter.write(codedZeile);
	    		bwriter.newLine();
	    	}
	    }
	    bwriter.close();
	    breader.close(); 
	}
	public static void cfileDecode(String file, int key) throws IOException {
		FileReader freader = new FileReader(file);
	    BufferedReader breader = new BufferedReader(freader);
	    FileWriter fwriter = new FileWriter(file + "-decoded.txt");
	    BufferedWriter bwriter = new BufferedWriter(fwriter);
	    boolean ende = false;
	    while (ende==false) {
	    	String zeile = breader.readLine();
	    	if (zeile == null) {
	    		ende = true;
	    	} else {
	    		String decodedZeile = decode(zeile, key);
	    		bwriter.write(decodedZeile);
	    		bwriter.newLine();
	    	}
	    }
	    bwriter.close();
	    breader.close(); 
	}
	public static String code(String text, int key) {
		StringBuffer codedText = new StringBuffer();
		text = text.toLowerCase();
		for (int i=0; i<text.length(); i++) {
			boolean isAlpha = false;
			char c = text.charAt(i);
			for (int j=0; j<alphabet.length(); j++) {
				if(c == alphabet.charAt(j)) {
					isAlpha = true;
				}
			}
			if (isAlpha == true) {
				int pos = alphabet.indexOf(c);
				for (int j=0; j<key; j++) {
					if((pos) == (alphabet.length()-1)) {
						pos = 0;
					} else {
						pos++;
					}
				}
				codedText.append(alphabet.charAt(pos));
			} else if(!Character.isLetter(c)) {
				codedText.append(c);
			}
		}
		return codedText.toString();
	}
	public static String decode(String text, int key) {
		StringBuffer decodedText = new StringBuffer();
		text = text.toLowerCase();
		for (int i=0; i<text.length(); i++) {
			boolean isAlpha = false;
			char c = text.charAt(i);
			for (int j=0; j<alphabet.length(); j++) {
				if(c == alphabet.charAt(j)) {
					isAlpha = true;
				}
			}
			if (isAlpha == true) {
				int pos = alphabet.indexOf(c);
				for (int j=0; j<key; j++) {
					if((pos) == 0) {
						pos = (alphabet.length()-1);
					} else {
						pos--;
					}
				}
				decodedText.append(alphabet.charAt(pos));
			} else if(!Character.isLetter(c)) {
				decodedText.append(c);
			}
		}
		return decodedText.toString();
	}
}
Code:
import java.io.*;
public class Vigenere {
	public static String alphabet = "abcdefghijklmnopqrstuvwxyz";
	
	public static void vfileCode(String file, String key) throws IOException {
		FileReader freader = new FileReader(file);
	    BufferedReader breader = new BufferedReader(freader);
	    FileWriter fwriter = new FileWriter(file + "-coded.txt");
	    BufferedWriter bwriter = new BufferedWriter(fwriter);
	    boolean ende = false;
	    while (ende==false) {
	    	String zeile = breader.readLine();
	    	if (zeile == null) {
	    		ende = true;
	    	} else {
	    		String codedZeile = code(zeile, key);
	    		bwriter.write(codedZeile);
	    		bwriter.newLine();
	    	}
	    }
	    bwriter.close();
	    breader.close();
	}
	public static void vfileDecode(String file, String key) throws IOException {
		FileReader freader = new FileReader(file);
	    BufferedReader breader = new BufferedReader(freader);
	    FileWriter fwriter = new FileWriter(file + "-decoded.txt");
	    BufferedWriter bwriter = new BufferedWriter(fwriter);
	    boolean ende = false;
	    while (ende==false) {
	    	String zeile = breader.readLine();
	    	if (zeile == null) {
	    		ende = true;
	    	} else {
	    		String decodedZeile = decode(zeile, key);
	    		bwriter.write(decodedZeile);
	    		bwriter.newLine();
	    	}
	    }
	    bwriter.close();
	    breader.close();
	}
	public static String code(String text, String key) {
		StringBuffer codedText = new StringBuffer();
		text = text.toLowerCase();
		int schluessel[] = new int[key.length()];
		int zaehler = 0;
		for (int i=0; i<key.length(); i++) {
			schluessel[i] = alphabet.indexOf(key.charAt(i));
		}
		for (int i=0; i<text.length(); i++) {
			if (zaehler == schluessel.length) {
				zaehler = 0;
			}
			boolean isAlpha = false;
			char c = text.charAt(i);
			for (int j=0; j<alphabet.length(); j++) {
				if(c == alphabet.charAt(j)) {
					isAlpha = true;
				}
			}
			if (isAlpha == true) {
				int pos = alphabet.indexOf(c);
				for (int j=0; j<schluessel[zaehler]; j++) {
					if((pos) == (alphabet.length()-1)) {
						pos = 0;
					} else {
						pos++;
					}
				}
				codedText.append(alphabet.charAt(pos));
			} else if(!Character.isLetter(c)) {
				codedText.append(c);
			}
			zaehler++;
		}
		return codedText.toString();
	}
	public static String decode(String text, String key) {
		StringBuffer decodedText = new StringBuffer();
		text = text.toLowerCase();
		int schluessel[] = new int[key.length()];
		int zaehler = 0;
		for (int i=0; i<key.length(); i++) {
			schluessel[i] = alphabet.indexOf(key.charAt(i));
		}
		for (int i=0; i<text.length(); i++) {
			if (zaehler == schluessel.length) {
				zaehler = 0;
			}
			boolean isAlpha = false;
			char c = text.charAt(i);
			for (int j=0; j<alphabet.length(); j++) {
				if(c == alphabet.charAt(j)) {
					isAlpha = true;
				}
			}
			if (isAlpha == true) {
				int pos = alphabet.indexOf(c);
				for (int j=0; j<schluessel[zaehler]; j++) {
					if((pos) == 0) {
						pos = (alphabet.length()-1);
					} else {
						pos--;
					}
				}
				decodedText.append(alphabet.charAt(pos));
			} else if(!Character.isLetter(c)) {
				decodedText.append(c);
			}
			zaehler++;
		}
		return decodedText.toString();
	}
}
Code:
import java.io.IOException;
public class StartVProgramm {

	public static void main(String[] args) throws IOException {
		char option = '$';
		while(option != '5') {
			StringBuffer file = new StringBuffer();
			StringBuffer key = new StringBuffer();
			int ikey = 0;
			System.out.println("Wählen Sie eine Option:");
			System.out.println("1 - Datei mit Caesar-Code verschlüsseln");
			System.out.println("2 - Datei mit Caesar-Code entschlüsseln");
			System.out.println("3 - Datei mit Vignere-Code verschlüsseln");
			System.out.println("4 - Datei mit Vignere-Code entschlüsseln");
			System.out.println("5 - Programm beenden");
			option = new java.util.Scanner(System.in).nextLine().toString().charAt(0);
			switch (option) {
			case '1':
				System.out.println("1 - DATEI MIT CAESAR-CODE VERSCHLÜSSELN");
				System.out.println("Geben Sie den Namen der Datei ein (Dateipfad/Dateiendung nicht vergessen):");
				file.append(new java.util.Scanner(System.in).nextLine().toString());
				System.out.println("Geben Sie nun den Caesar-Code ein (Ganzzahl):");
				ikey = new java.util.Scanner(System.in).nextInt();
				try{
					Caesar.cfileCode(file.toString(), ikey);
					System.out.println("Verschlüsselung erfolgreich!");
					System.out.println("Verschlüsselte Datei: " + file.toString() + "-coded.txt");
				} catch(Exception e) {
					System.out.println("Es ist ein Fehler aufgetreten");
					System.out.println("Bitte überprüfen Sie Ihre Eingaben");
				}
				break;
		case '2':
			System.out.println("2 - DATEI MIT CAESAR-CODE ENTSCHLÜSSELN");
			System.out.println("Geben Sie den Namen der Datei ein (Dateipfad/Dateiendung nicht vergessen):");
			file.append(new java.util.Scanner(System.in).nextLine().toString());
			System.out.println("Geben Sie nun den Caesar-Code ein (Ganzzahl):");
			ikey = new java.util.Scanner(System.in).nextInt();
			try{
				Caesar.cfileDecode(file.toString(), ikey);
				System.out.println("Entschlüsselung erfolgreich!");
				System.out.println("Entschlüsselte Datei: " + file.toString() + "-decoded.txt");
			} catch(Exception e) {
				System.out.println("Es ist ein Fehler aufgetreten");
				System.out.println("Bitte überprüfen Sie Ihre Eingaben");
			}
			break;
		case '3':
			System.out.println("3 - DATEI MIT VIGENERE-CODE VERSCHLÜSSELN");
			System.out.println("Geben Sie den Namen der Datei ein (Dateipfad/Dateiendung nicht vergessen):");
			file.append(new java.util.Scanner(System.in).nextLine().toString());
			System.out.println("Geben Sie nun den Vigenere-Code ein:");
			key.append(new java.util.Scanner(System.in).nextLine().toString());
			try{
				Vigenere.vfileCode(file.toString(), key.toString());
				System.out.println("Verschlüsselung erfolgreich!");
				System.out.println("Verschlüsselte Datei: " + file.toString() + "-coded.txt");
			} catch(Exception e) {
				System.out.println("Es ist ein Fehler aufgetreten");
				System.out.println("Bitte überprüfen Sie Ihre Eingaben");
			}
			break;
		case '4':
			System.out.println("4 - DATEI MIT VIGENERE-CODE ENTSCHLÜSSELN");
			System.out.println("Geben Sie den Namen der Datei ein (Dateipfad/Dateiendung nicht vergessen):");
			file.append(new java.util.Scanner(System.in).nextLine().toString());
			System.out.println("Geben Sie nun den Vigenere-Code ein:");
			key.append(new java.util.Scanner(System.in).nextLine().toString());
			try{
				Vigenere.vfileDecode(file.toString(), key.toString());
				System.out.println("Entschlüsselung erfolgreich!");
				System.out.println("Entschlüsselte Datei: " + file.toString() + "-decoded.txt");
			} catch(Exception e) {
				System.out.println("Es ist ein Fehler aufgetreten");
				System.out.println("Bitte überprüfen Sie Ihre Eingaben");
			}
			break;
			}
			System.out.println();
		}
	}
}
 
Zuletzt bearbeitet:
Mein Verschlüsselungsprogramm

Hallo,

ich bin neu hier im Forum und zwar bin ich gerade durch dieses Forum "Programmieraufgaben" auf den Geschmack gekommen mich bei euch anzumelden.

Habe mit Python ein Klasse erstellt die, die Spezifikation der Aufgabe erfüllen sollte.

Anmerkung: Wie ich erst später gemerkt habe, hätte ich mir die zwei verschiedenen Alphabethe alphaSmall und alphaBig sparen können. Habe das ganze so realisiert das auch Sonderzeichen und Zahlen codiert werden können.

Mit freundlichen Grüßen

Christian

Code:
class Crypto(object):
    def __init__(self,key):
        self.alphaSmall = "0123456789abcdefghijklmnopqrstuvwxyz!§$%&/()=?@:-;#'<>"
        self.alphaBig = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!§$%&/()=?@:-;#'<>"
        self.key = key
    
    def _getIndex(self,character): # Liefert den passenden Index
        if character == "\n":
            return -1
            
        if character in self.alphaSmall:
            for i in range(len(self.alphaSmall)):
                if self.alphaSmall[i] == character:
                    return i
        elif character in self.alphaBig:
            for i in range(len(self.alphaBig)):
                if self.alphaBig[i] == character:
                    return i
        else:
            return -1
            
    def encodeString(self,string): # Methode dient zum verschlüssel 
        tmp = ""
        index =0
        for char in string:
            #print "1. for char: %s" % (char)
            index = self._getIndex(char)
            if index == -1 or char == " " or char == "\n":
                tmp += char
                continue
            try:
                #print "index vor: %i " % (index)
                index += self.key
                if index>=len(self.alphaSmall):
                    index -=len(self.alphaSmall)
                #print "index nach: %i " % (index)
                if char in self.alphaSmall:
                    tmp += self.alphaSmall[index]
                else:
                    tmp += self.alphaBig[index]
                #print "1. for tmp: %s" %(tmp)
            except:
                #print "Fehler!"
                pass
        return tmp
    
    def decodeString(self,string): # Endschlüsselung
        tmp = ""
        index =0
        for char in string:
            index = self._getIndex(char)
            if index == -1:
                tmp += char
                continue
            try:
                index -= self.key
                if char in self.alphaSmall:
                    tmp += self.alphaSmall[index]
                else:
                    tmp += self.alphaBig[index]
            except:
                pass
        return tmp
    
    def encodeFile(self,normal,encode,token="\n"):
        try:
            nFile = open(normal,"r")
            encFile = open(encode,"w")
            string = nFile.read()
            string = string[:-1]
            worte = string.split(token)
            #print "encode : ",
            #print worte
            toWrite = ""
            for word in worte:
                toWrite += " " +self.encodeString(word) 
            encFile.write(toWrite)
            encFile.close()
            nFile.close()
        except:
            print "Error at File request! --> encodeFile"
    
    def decodeFile(self,en,de,token = " "):
        try:
            encFile = open(en,"r")
            decFile = open(de,"w")
            string = encFile.read()
            #string = string[:-1]
            worte = string.split(token)
            #print "decode : ",
            #print worte
            toWrite = ""
            for word in worte:
                #print "in decodeFile word : %s" %(word)
                toWrite += " " +self.decodeString(word) 
                
                #print "in decodeFile toWrite: %s" %(toWrite)
            decFile.write(toWrite)
            decFile.close()
            encFile.close()
        except:
            print "Error at File request! --> decodeFile"
 
Zurück
Oben