Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

kleines Verschlüsselungsprogramm

Diskussion: kleines Verschlüsselungsprogramm im Forum Programmieraufgaben, in der Kategorie Code Kitchen; So, das ganz mal in Assembler. Der Code ist ein bisschen unschön, aber ich fang erst an Assembler zu lernen. ...

Like Tree2Likes

Antwort
Alt 05.12.09, 22:30   #46 (permalink)
 
Registriert seit: 31.03.08
MrSpider Leistung: Facit NTK
Likes: 0
Standard


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
MrSpider ist offline   Mit Zitat antworten
Alt 06.12.09, 01:36   #47 (permalink)
Senior Member
 
Registriert seit: 13.07.08
enkore Leistung: Pentium Ienkore Leistung: Pentium Ienkore Leistung: Pentium I
Likes: 60
Standard

Naja jetzt wo du den Thread schon aus der Pensionierung getrieben hast:
http://28398.org/2009/11/mini-progra...essum-erganzt/
__________________
"It is the human race! The deterioration of the spirit of man. Man undermining himself, causing a self-willed, self-imposed, self-evident self-destruction."
+++ BREAKING +++ Troll ertrinkt im Planschbecken +++
enkore ist offline   Mit Zitat antworten
Alt 26.04.10, 23:37   #48 (permalink)
Moderator
 
Benutzerbild von Tarantoga
 
Registriert seit: 11.02.06
Tarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga QuadcoreTarantoga Quadcore
Likes: 195
Standard

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...

Java-Code   
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

Geändert von Tarantoga (26.11.10 um 16:18 Uhr)
Tarantoga ist offline   Mit Zitat antworten
Alt 04.05.10, 18:37   #49 (permalink)
 
Registriert seit: 03.03.10
fr33g Leistung: Facit NTK
Likes: 0
Standard

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
Angehängte Dateien
Dateityp: zip Verschluesselung.zip (243,8 KB, 9x aufgerufen)

Geändert von fr33g (18.05.10 um 19:40 Uhr)
fr33g ist offline   Mit Zitat antworten
Alt 02.09.10, 23:36   #50 (permalink)
 
Registriert seit: 02.09.10
DarkMozart Leistung: Facit NTK
Likes: 0
Standard

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.
Angehängte Dateien
Dateityp: zip src.zip (4,8 KB, 3x aufgerufen)

Geändert von DarkMozart (03.09.10 um 00:11 Uhr)
DarkMozart ist offline   Mit Zitat antworten
Alt 30.11.10, 16:17   #51 (permalink)
 
Registriert seit: 10.11.10
DMRMcK Leistung: Z3
Likes: 0
Standard 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.

Caesar VB   
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


Vigenère VB   
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

Geändert von DMRMcK (30.11.10 um 16:25 Uhr)
DMRMcK ist offline   Mit Zitat antworten
Alt 09.07.11, 21:47   #52 (permalink)
 
Benutzerbild von IGotMuscles
 
Registriert seit: 09.07.11
IGotMuscles Leistung: Facit NTK
Likes: 2
Standard 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;
}
IGotMuscles ist offline   Mit Zitat antworten
Alt 09.07.11, 23:20   #53 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard

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

Py   

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"
IGotMuscles likes this.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » kleines Verschlüsselungsprogramm
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Neues Verschlüsselungsprogramm (selbst gecodet) Tec Cryptography & Encryption 101 20.07.07 11:37
Verschlüsselungsprogramm Until-Death Code Kitchen 5 01.07.07 13:34
Verschlüsselungsprogramm antcool Cryptography & Encryption 14 21.10.05 16:31
Bestes Verschlüsselungsprogramm spyro133 Cryptography & Encryption 2 20.06.05 08:09
Verschlüsselungsprogramm Avenger Cryptography & Encryption 5 22.11.04 21:59


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61