Hackerboard WikiHaboWeb Linkverzeichnis

[HaBo]

major security
 
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; hi, Ich hab jetzt auch mal das Programm geschrieben (ich weiß is schon ne weile her das die aufgabe gestellt ...

Antwort
Alt 27.07.05, 11:19   #16 (permalink)
 
Registriert seit: 27.07.05
Karma: 10
MuskelBiber Leistung: Facit NTK
Standard


hi,
Ich hab jetzt auch mal das Programm geschrieben (ich weiß is schon ne weile her das die aufgabe gestellt wurde ,ich bin aber erst vor kurzem drauf gestoßen).
Geschrieben is es komplett in C kann aber zZt. nur Caesar'isch verschlüsseln, (die Vigenere'ische hab ich auch noch vor zu implementieren)

Bis jetzt hab ich das Prog. nur auf linux getestet ,müsste aber ohne weiteres auch auf Win laufen!

Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
	//Variablen
	FILE* file;
	int i=0;
	int key =0;
	long file_lenght;

	//Testen ob genug Argumente übergeben wurden
	if(argc != 4)
	{
		printf("usage: %s input_file output_file key\n",argv[0]);
		return 1;
	}

	key =atoi(argv[3]);

	//Datei öffnen
	file =fopen(argv[1],"r");
	if(NULL ==file)
	{
		printf("Fehler: Konnte Datei nicht öffnen.\n");
		return 1;
	}

	//Länge der Datei rausfinden
	fseek(file,0,SEEK_END);//filepointer an das ende der Datei setzen
	file_lenght =ftell(file);//die position des fp bekommen (=Länge der datei)
	rewind(file);//fp wieder an den Anfang setzen

	char file_input[file_lenght];//char-feld mit der größe der Datei erzeugen

	//Datei lesen
	fread(file_input,sizeof(file_input),1,file);	
	fclose(file);//Datei schließen

	//Datei (zum schreiben) öffnen
	file =fopen(argv[2],"w");
	if(NULL ==file)
	{
		printf("Fehler: Datei konnte nicht geöffnet werden.\n");
		return 1;
	}

	//Text verschlüsseln und ausgeben
	for(i;i<file_lenght;i++)
	{
		fprintf(file,"%c",file_input[i]+key);
	}

	fclose(file);//datei schließen

	return 0;
}
Was haltet ihr davon?
Wenn ihr Fehler o.ä. findet bitte posten!

cya, MuskelBiber
MuskelBiber ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 09.08.05, 15:38   #17 (permalink)
 
Registriert seit: 09.08.05
Karma: 10
n3on Leistung: Facit NTK
Standard

/*
*ENTFERNT*
*/
n3on ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 09.08.05, 23:53   #18 (permalink)
 
Registriert seit: 04.08.05
Karma: 10
minzel Leistung: Facit NTK
minzel eine Nachricht über ICQ schicken
Standard

Da ich das ganze ziemlich ermüdend finde das hier nur in Basic , c , c++ ect. programmiert wird, habe ich hier eine Java-Awt Execute - Lösung. Ja, ja execute, also ein Blick lohnt sich wobei ich mich auf das nötigste Beschränkt habe.

Java - Proggie (zip)

in diesem Sinne
minzel
minzel ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 11.08.05, 15:32   #19 (permalink)
 
Registriert seit: 27.07.05
Karma: 10
MuskelBiber Leistung: Facit NTK
Standard Antwort:

@minzel
Hallo, ich hab mir dein Progg mal angeguckt (Da ich gerade angefangen hab mit Java zu programmieren ).
Ich find das Programm ganz gelungen ,bis auf ein paar einzelheiten.
Blos ich finde man sollte den Schlüssel selbst einstellen können (z.Zt. wird der Text ja immer mit 3 Codiert) und der Shortkey für "Text -> Ceasarcode (Strg+C))" scheint (bei mir) auch net zu funktionieren.

P.S: Könntest du den Quellcode zum Download bereitstellen?
MuskelBiber ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 11.08.05, 16:40   #20 (permalink)
 
Registriert seit: 04.08.05
Karma: 10
minzel Leistung: Facit NTK
minzel eine Nachricht über ICQ schicken
Standard

Hey muskelbiber,

Danke für dein Feedback. Also das mit dem Shortcut ging bei mir auch nicht *g frag mich aber nicht wieso. vielleicht schau ich mal bei Gelegenheit noch mal rein.

das mit dem Schlüssel ist richtig, wusste nicht wie man das nennen könnte, deshalb hab ich es raus gelassen. Man kann aber mit Hilfe eines Dialoges das sicher schnell bewerkstellig.

Gerne, auch hier der Quelltext:

Quelltext: Verschlüsselung

mfg
minzel
minzel ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 13.08.05, 13:31   #21 (permalink)
 
Registriert seit: 27.07.05
Karma: 10
MuskelBiber Leistung: Facit NTK
Standard

@minzel
thx für den Quelltext

cya, MuskelBiber
MuskelBiber ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 15.11.05, 23:53   #22 (permalink)
 
Registriert seit: 15.11.05
Karma: 9
Vielseitiger Leistung: Facit NTK
Standard

@Boar

Ich habe auch Caesar in Java programmiert, ohne GUI nur als Konsole.
Ich habe ne Methode codieren geschrieben

Code:
public String codieren(String plainT, char key) {
  String cipher = "";
  int len = plainT.length();
  char plainCh;
  char ciphCh = ' ';
  for (int i = 0; i < len; i++) {
    plainCh = plainT.charAt(i);
    if ((plainCh >= 'A') && (plainCh <= 'Z')) {
      ciphCh = (char)(plainCh - 'A' + key)
      if(ciphCh > 'Z') {
        ciphCh = (char)(ciphCh - 'Z' - 1 + 'A');
      }
      cipher = cipher + ciphCh;
    }
  }
  return cipher;
}
Anstatt "char key" kannst du auch "int key" nehmen als Parameter
In der Methode werden nur die Großbuchstaben codiert. Zahlen, Leerzeichen und andere werden nicht codiert und weggelassen.
vor dem Aufruf der Methode den String in Großbuchtaben umformen mit toUpperCase
Vielseitiger ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 24.02.06, 12:27   #23 (permalink)
 
Registriert seit: 18.03.05
Karma: 10
Tasmas Leistung: Facit NTK
Standard

so hab das ganze in php doch noch hingekriegt:

PHP-Code:
<?php

function plain2caesar($input$diff)
        {    
            
$tmp strtoupper($input);
            
$signs = array("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");
            
$anzahl count($signs);

            for (
$x 0$x $anzahl $x++)
            {
                
                if ( (
$x-$anzahl+$diff) >= )
                {
                    
$signs2[$signs{$x}] = $signs[$x-$anzahl+$diff];
                }
                else
                {
                    
$signs2[$signs{$x}] = $signs[$x+$diff];
                }
            }
            
            
print_r($signs2);
            
            
$strRet "";
            
            for(
$i 0$i strlen($tmp); $i++)
            {
                if (
in_array($tmp{$i}, $signs2))
                {
                      
$strRet .= $signs2[$tmp{$i}];
                }
                else
                {
                    
$strRet .= $tmp{$i};
                }
            }
            
            return 
$strRet;
        }
?>
mfg
Tasmas ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 27.03.06, 11:01   #24 (permalink)
 
Registriert seit: 29.01.06
Karma: 9
xsheep Leistung: Facit NTK
Standard

Meine Version ist in C++ geschrieben und kann Files in Caesar ver- und enschlüsseln :]

edit: Hab noch eine Analyse-Funktion eingebaut, mit der man den Schlüssel einer Datei bestimmen kann

Code:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int erkennen(string pfad){
    
    ifstream in;
    
    int out;
    int e_text;
    int temp=0;
    int zaehler=0;
    int e_deutsch=4;
    int text[26]={0};
    
    char zeichen;
    
    in.open(pfad.c_str(), ios_base::in);
        
    while(in.get(zeichen)){
                                
                                if(zeichen>96&&zeichen<123){
                                                            
                                                            text[zeichen-97]++;
                                                            zaehler++;
                                                                  
                                }else if(zeichen>64&&zeichen<91){
                                      
                                      text[zeichen-64]++;
                                      zaehler++;
                                            
                                }else{
                                      
                                }
                                
    }
          
    for(int i=0; i<=25; i++){
            
            if(temp<text[i]){
                             
                             temp=text[i];
                             e_text=i;
                             
            }
                  
    }
          
    if(e_text>=e_deutsch){
                          
                          out=e_text-e_deutsch;
                          
    }else{
          
          out=26-(e_deutsch-e_text);
             
    }
    
    in.close();
    
    return out;
    
}

int verschieben(char input, int inkey){
    
    int output;
    
    if(input>64&&input<91){
                           
                           if(input+inkey>90){
                                                     
                                                     output=(input+inkey)-26;
                                                     
                           }else{
                                 
                                 output=input+inkey;
                                                                   
                           }
                                                             
    }else if(input>96&&input<123){
          
          if(input+inkey>122){
                                       
                                       output=(input+inkey)-26;
                                                                   
          }else{
                
                output=input+inkey;
                                            
          }
                                      
    }else{
          
          output=input;
                                      
    }
    
    return output;
    
}

int main(){
    
    ifstream dat_ein;
    ofstream dat_aus; 
    
    string pfad;
    string crypt;
    string prefix;
    
    char key;
    char zeichen;
    char zeichen_crypt;
    
    int verschiebung;
    int modus;
    
    bool add;
    bool autom;

    cout << endl;
    cout << "--------------------------------" << endl;
    cout << "Ceasar-Verschl\x81 \bsselung by xsheep" << endl;
    cout << "--------------------------------" << endl;
    cout << "Wollen sie verschl\x81 \bsseln (1) oder entschl\x81 \bsseln (2) ? ";
    cin >> modus;
    
    if(modus==2){
                 
                 prefix="ent";
                 add=true;
                 
    }else{
          
          prefix="ver";
          add=false;
          
    }
    
    cout << "Bitte geben sie den Pfad des zu " << prefix << "schl\x81 \bsselnden Files ein : ";
    cin >> pfad;
    
    if(add){
            
            cout << "Wollen sie den Schl\x81 \bssel manuell eingeben (1) " << endl << "oder wollen Sie den Schl\x81 \bssel automatisch bestimmen lassen (2) ?" << endl;
            cin >> modus;
            
            if(modus==2){
                         
                         verschiebung=erkennen(pfad.c_str());
                         key=verschiebung+64;
                         verschiebung=26-verschiebung;
                         cout << "Ermittelter Schl\x81 \bssel : " << key << endl;
                         autom=true;
                         
            }else{
                  
                  autom=false;
                  
            }
            
            if(!autom){
                       
                       cout << "Bitte geben sie den Schl\x81 \bssel ein (A-X) : ";
                       cin >> key;
                       
            }
            
    }else{
          
    cout << "Bitte geben sie den Schl\x81 \bssel ein (A-X) : ";
    cin >> key;
    
    }
    
    if(add&&!autom){
            
            if(key>96&&key<123){
                                
                                verschiebung=26-(key-96);
                                
            }else if(key>64&&key<91){
                  
                  verschiebung=26-(key-64);
                  
            }else{
                  
                  verschiebung=1;
                  
            }
            
    }else if(!add){
          
          if(key>96&&key<123){
                              
                              verschiebung=key-96;
                              
          }else if(key>64&&key<91){
                
                verschiebung=key-64;
                
          }else{
                
                verschiebung=1;
                  
          }
          
    }
    
    dat_ein.open(pfad.c_str(), ios_base::in);
    dat_aus.open(pfad.c_str(), ios_base::in);
    
    if(!dat_ein||!dat_aus){
                     
                 cout << "File '" << pfad << "' konnte nicht ge\x94 \bffnet werden. Programm wird abgebrochen." << endl;
                 return -1;
                 
    }else{
          
          cout << "File wird gelesen und " << prefix << "schl\x81 \bsselt ..." << endl;
          
          while(dat_ein.get(zeichen)){
                                      
                                      zeichen_crypt=verschieben(zeichen,verschiebung);
                                      dat_aus << zeichen_crypt;
                                              
          }
          
          cout << "File erfolgreich " << prefix << "schl\x81 \bsselt. Programm wird beendet." << endl;
          cout << "--------------------------------";
          
    }

    dat_ein.close();
    dat_aus.close();
    
    return 0;
    
}
xsheep ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 04.04.06, 15:54   #25 (permalink)
 
Registriert seit: 03.06.05
Karma: 10
Duker Leistung: Facit NTK
Duker eine Nachricht über ICQ schicken
Standard

hier in VB für Caesar Ver- und Entschlüsselung

Code:
Option Explizit

----------------------------
Private Sub cmdEntschlüsseln_Click()
 Dim UnverText As String, VerText, temp As String
 Dim Schlüssel, i As Integer
 Dim Länge, temp2 As Long
  
VerText = txtVerschlüsselt
 
 Schlüssel = txtSchlüssel
 
Länge = Len(VerText)

For i = 1 To Länge
    temp = Mid(VerText, i, 1)
    temp2 = Asc(temp)
    temp2 = temp2 - Schlüssel
        If temp2 < 32 Then
           temp2 = 255 - Schlüssel
        End If
    temp = Chr(temp2)
    UnverText = UnverText & temp
Next i

 txtUnverschlüsselt = UnverText
 txtVerschlüsselt = ""
 
End Sub

----------------------------
Private Sub cmdVerschlüsseln_Click()
 Dim UnverText As String, VerText, temp As String
 Dim Schlüssel, i As Integer
 Dim Länge, temp2 As Long
  
UnverText = txtUnverschlüsselt
 
 Schlüssel = txtSchlüssel
 
Länge = Len(UnverText)

For i = 1 To Länge
    temp = Mid(UnverText, i, 1)
    temp2 = Asc(temp)
    temp2 = temp2 + Schlüssel
        If temp2 > 255 Then
           temp2 = 32 + Schlüssel
        End If
    temp = Chr(temp2)
    VerText = VerText & temp
Next i

 txtVerschlüsselt = VerText
 txtUnverschlüsselt = ""
 
End Sub
Duker ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 17.11.06, 10:11   #26 (permalink)
 
Registriert seit: 18.12.05
Karma: 9
/etc/shadow Leistung: Facit NTK
Standard

ich hab hier ein vigenere-code-decode programm geschrieben :
mit Haskell :


Code:
-- /etc/shadow --
-- Standardfunktionen importieren
import Char  (toUpper, toLower)
import Maybe (fromMaybe)
import List  (sortBy)
import IO

-- ------------------------ helper functions
-- alle Berechnung auf dem folgenden Alphabet
alphabet = ['A'..'Z'] :: String

-- relative Buchstabenhäufigkeit im Deutschen (bei Wikipedia gefunden)
deutsch = [('E', 0.1740),
           ('N', 0.0978),
           ('I', 0.0755),
           ('S', 0.0727),
           ('R', 0.0700),
           ('A', 0.0651),
           ('T', 0.0615),
           ('D', 0.0508),
           ('H', 0.0476),
           ('U', 0.0435),
           ('L', 0.0344),
           ('C', 0.0306),
           ('G', 0.0301),
           ('M', 0.0253),
           ('O', 0.0251),
           ('B', 0.0189),
           ('W', 0.0189),
           ('F', 0.0166),
           ('K', 0.0121),
           ('Z', 0.0113),
           ('P', 0.0079),
           ('V', 0.0067),
           ('J', 0.0027),
           ('Y', 0.0004),
           ('X', 0.0003),
           ('Q', 0.0002)] :: [(Char, Double)]

-- angepasste Version von isAlpha, die testet, ob ein Buchstabe in unserem Alphabet vorhanden ist
-- klein geschriebene Buchstaben sind auch akzeptabel
isAlpha' = flip elem $ alphabet ++ (map toLower alphabet)

-- entfernt alle komischen Zeichen aus einem String und wandelt den Rest in Grossbuchstaben um
prune = map toUpper . filter isAlpha'

-- sortiert eine Liste aufsteigend entsprechend der Funktionswerte von Funktion f
fsort  f = List.sortBy (\x y -> compare (f x) (f y))
-- macht das gleiche wie fsort, nur in absteigender Reihenfolge
fsort' f = reverse . fsort f

-- summiert die Funktionswerte von der Funktion f auf
fsum f = sum . (map f)

-- dividiert zwei Ganzzahlen
divide x y = fromIntegral x / fromIntegral y

-- ------------------------ text analysis
count :: String -> [(Char, Int)]
-- zählt, wie oft die Buchstaben in einem String vorkommen
count s = zip alphabet $ map (\x -> length $ filter (==x) s) alphabet

normalize :: [(Char, Int)] -> [(Char, Double)]
-- wandelt eine von count erstellte Liste in relative Werte um
normalize s = map (flip normalize' counter) s
                    where counter = fsum snd s

normalize' :: (Char, Int) -> Int -> (Char, Double)
-- normalisiert einen einzelnen Eintrag aus einer von count erstellten Liste
normalize' (s,i) n = (s, divide i n)

-- ------------------------ caesar
caesarEncode :: Char -> String -> String
-- verschlüsselt einen Text nach der Caesar-Methode
caesarEncode x y = substitute (prune y) (getCaesar x)
-- weil man es immer wieder mal braucht: mit verdrehten Argumenten
caesarEncode' = flip caesarEncode

substitute :: String -> [(Char, Char)] -> String
-- hat eine Liste von Ersetungen und führt sie auf einem String aus
substitute x y = map (\x -> fromMaybe x (lookup x y))  x

getCaesar :: Char -> [(Char, Char)]
-- erstellt die Liste der Caesar-Ersetzungen für eine gegebene Verschiebung
getCaesar x = zip alphabet $ dropWhile (/=x) $ cycle alphabet

-- ------------------------ vigenere
vigenere :: String -> String -> String
-- verschlüsselt einen Text nach der Vigenere-Methode. k wie key und d wie data...
vigenere k = zipWith (\k d -> head $ substitute [d] (getCaesar k)) (cycle k)

-- sichere Version von vigenere
vigenereEncode k d = vigenere (prune k) (prune d)
-- und auch hier nochmal geflipt
vigenereEncode'    = flip vigenereEncode

-- entschlüsseln eines mit vigenere verschlüsselten Text bei bekannter Passphrase
vigenereDecode k = vigenereEncode $ invertKey $ prune k
-- und wieder geflipt
vigenereDecode'  = flip vigenereDecode

-- Vigenere-Schlüssel invertieren
invertKey :: String -> String
invertKey = map (\x -> fromMaybe x $ lookup x $ zip y $ reverse y)
            where y = alphabet ++ [head alphabet]

-- ------------------------ übungsblatt
korrelationsfunktion :: String -> String -> Integer
-- Korrelation berechnen. an wievielen Stellen sind beide Strings gleich.
-- nein, das kann man nicht anders machen ;)
korrelationsfunktion = curry $ foldl (\s (x,y) -> if x == y then succ s else s) 0 . uncurry zip

zyklischeverschiebungen :: String -> [String]
-- alle zyklischen Verschiebungen eines Textes
-- die Mengenschreibweise ist zwar normal nicht mein Fall, aber hier ist sie sehr schnell (Ausführungsgeschwindigkeit)
zyklischeverschiebungen s = [(drop n s) ++ (take n s) | n <- [0..pred $ length s]] -- (so ähnlich im Forum gefunden ;))

autokorrelation :: String -> [(Integer, Integer)]
-- Autokorrelation eines Textes mit sich selbst. einfach gegen alle zyklischen Verschiebungen testen
autokorrelation x = zip [0..] $ map (korrelationsfunktion x) (zyklischeverschiebungen x)

-- ------------------------ entschlüsseln
passphraselength :: String -> [(Integer, Integer)]
-- Passphrase-Länge knacken. erst einmal die 25 Verschiebungen mit der besten Korrelation finden
passphraselength = fsort fst . take 25 . fsort' snd . autokorrelation

divCount :: [Integer] -> Integer -> Integer
-- Anzahl der Zahlen aus der Liste, die sich durch die Zahl teilen lassen
divCount x y = foldl (\s x -> if mod x y == 0 then succ s else s) 0 x 

goodDivisors :: [Integer] -> [Integer] -> [Integer]
-- die drei Zahlen aus der zweiten Liste, die die meisten Zahlen aus der ersten Liste teilen
goodDivisors x y = map fst $ take 3 $ fsort' snd $ zip y $ map (divCount x) y

-- above: PW length; below: PW text

split :: [a] -> Int -> [[a]]
-- in unserem Fall: die Buchstaben, die mit dem gleichen Caesar-Schlüssel verschlüsselt wurden zusammenpacken
-- kann man aber bestimmt auch noch andere tolle Dinge mit machen
split x n = foldl (\x (a,b) -> insert a b x) (replicate n []) indexed
            where indexed = zip x $ cycle [0..(n-1)]

insert :: a -> Int -> [[a]] -> [[a]]
-- für die split/insert-Aktion fiel mir nichts einfaches mit Higher-Level-Funktionen ein.
-- jedes Element wird in die vorgesehen Liste einsortiert
insert x 0 (a:b) = (x:a) : b
insert x n (a:b) = a : (insert x (n-1) b)

rateDecrypts :: String -> [(Char, Double)]
-- für einen String bewerten, wie "deutsch" eine Verschiebung ist
-- niedrieger Wert bedeutet, dass die Caesar-Verschlüsselung mit dieser Verschiebung einen besonders deutschen Text liefert
rateDecrypts str = zip (invertKey alphabet) (map undeutschness decs)
                   where decs = map (caesarEncode' str) alphabet

undeutschness :: String -> Double
-- checken, wie undeutsch ein Text ist
undeutschness = (unlikelihood deutsch) . normalize . count                   
   
unlikelihood :: [(Char, Double)] -> [(Char, Double)]  -> Double
-- checken, wie unterschiedlich zwei Buchstabenverteilungen sind
-- sehr ähnliche Verteilungen erzeugen KLEINE werte
unlikelihood d = fsum (\x -> (snd x - find (fst x) d) ^ 4 * 10000)

find :: Char -> [(Char, Double)] -> Double
-- relative Häufigkeit eines Buchstabens aus einer Verteilung heraussuchen
find = curry $ fromMaybe 0 . uncurry lookup

suggestKey :: [[(Char, Double)]] -> String
-- einen genauen Schlüssel vorschlagen (einfach immer den Buchstaben nehmen, der die niedrigste undeutschness hat)
suggestKey = map $ fst . head
-- ------------------------ program
-- Zahl einlesen (irgendwo im Netz gefunden)
readNumber = do line <- getLine
                readIO line

-- Hauptfunktion: erstmal einen Dateinamen erfragen und dann versuchen, sie zu knacken
main = do putStr "Please enter File to analyze:\n"
          filename <- getLine
          catch (
                 do inHandle <- openFile filename ReadMode
                    content' <- hGetContents inHandle
                   
                    let content = prune content' -- Datei einlesen und den String ggf. aufräumen
                    let len = passphraselength content -- die Passphrase-Länge errechen
                   
                    putStr "Processing... ... ... (may take a while, seriously doing sth now)\n"
                    putStr $ show len
                    putStr "\nPassphrase Length Cruncher thus suggests a Passphrase Length of:\n"
                    putStr $ show $ goodDivisors (drop 1 $ map fst len) [2..25]
                    putStr "\nPlease enter Passphrase Length:\n"
                    a <- readNumber
                   
                    let ana = map (take 5 . fsort snd . rateDecrypts) $ split content a -- Caesar-Brute-Force-Entschlüssöung auf die Sache ansetzen
                   
                    putStr "Processing... ... ... (may take a while, seriously doing sth now)\n"
                    putStr $ unlines $ map show ana
                    putStr "\nPassphrase Cruncher thus suggests a Passphrase of:\n"
                    putStr $ suggestKey ana
                    putStr "\nPlease enter Passphrase:\n"
                    key <- getLine
                    putStr $ vigenereDecode key content -- und zum Schluss noch einmal entschlüsseln
                    putStr "\nPress enter to exit:"
                    wait <- getLine
                   
                    hClose inHandle
                )
                (\_ -> putStr "ERROR: does not compute!" ) -- Fehler: bla
          putStr "\n"
/etc/shadow ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 02.01.07, 15:20   #27 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Karma: 8
Eydeet Leistung: Facit NTK
Standard

Ich hab das ganze jetzt in zwei Programme gepackt. Die Werte werden über die Bash mitgegeben (nur unter Linux getestet)

vigenere.cpp   
Code:
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    if(argc != 5) {
        cerr << "Usage: " << argv[0] << " [e|d] [r|a] key text" << endl << endl
             << "e(ncrypt), d(ecrypt)" << endl
             << "mode: Wenn der zu verschlüsselnde Wert länger ist als der Key..." << endl
             << "  r(epeat): wird der Key wiederholt" << endl
             << "  a(utokey): wird der Wert selbst an den Key angehängt (sicherer)" << endl
             << "example: " << argv[0] << " e a AKEY HALLO (returns HKPJV)" << endl;
        return -1;
    }

    int key_len = strlen(argv[3]);
    int txt_len = strlen(argv[4]);

    //string letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
    //int letters_len = 63;
    string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int letters_len = 26;
    int false_keys = 0;

    string out, out_key;

    for(int i=0; i<txt_len; i++)
    {
        char key;
        if(key_len > i) {
            key = argv[3][i-false_keys];
        }
        else if(argv[2][0] == 'r') {
             key = argv[3][i % key_len - false_keys];
        }
        else {
            key = argv[4][i-key_len-false_keys];
        }

        int cur_key = letters.find(toupper(key), 0);
        if(cur_key > letters_len) {
            false_keys++;
            continue;
        }

        int cur_letter = letters.find(toupper(argv[4][i]), 0);
        if(cur_letter > letters_len) continue;

        // Wenn encrypted werden soll, key addieren, sonst subtrahieren
        if(argv[1][0] == 'e') {
            cur_letter += cur_key;
            while(cur_letter > letters_len)
                cur_letter -= letters_len;
        }
        else {
            cur_letter -= cur_key;
            while(cur_letter < 0)
                cur_letter += letters_len;
        }

        out += letters[cur_letter];
        out_key += letters[cur_key];
    }
    cout << out << endl;
    cout << "KEY: " << out_key << endl;
}


caesar.cpp   
Code:
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    if(argc < 3) {
        cerr << "Usage: " << argv[0] << " key text [sys]" << endl
                << "\texample: " << argv[0] << " 1 Hallo (returns Ibmmp)" << endl;
        return -1;
    }

    int key = atoi(argv[1]);
    int txt_len = strlen(argv[2]);

    string letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    int letters_len = 63;

    string out;

    for(int i=0; i<txt_len; i++)  {
        int cur_letter = letters.find(argv[2][i]);
        if(cur_letter > letters_len) continue;

        cur_letter += key;
        while(cur_letter > letters_len)
            cur_letter -= letters_len;

        out += letters[cur_letter];
    }
    cout << out << endl;
}

Beim Cäsar-Programm muss man einen negativen Wert angeben, um zu entschlüsseln.

EDIT:
Das ganze in JavaScript, allerdings nur die Vigenere-Lösung, da Vigenere ja eigentlich schon die Caesar-Verschlüsselung beherrscht:
Vigenere.html   
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <style language="text/css">
    body {
      font: 16px sans-serif;
      background-color: #eee;
    }

    #container {
      background-color: #fff;
      width: 700px;
      position: absolute;
      left: 50%;
      margin: 50px 0 50px -370px;
      padding: 20px;
    }

    h1 {
      font: 50px serif;
      text-align: center;
    }

    textarea, [type="text"] {
      border: 1px dashed #aaa;
      font-size: 16px;
    }

    textarea {
      width: 100%;
      height: 100px;
    }

    textarea:focus, [type="text"]:focus {
      background-color: #eef;
      border: 1px solid #aaa;
    }
    </style>

    <script language="JavaScript">
    function vigenere_en(uncrypted, key) {
        var crypted = "";
        uncrypted = onlyUpper(uncrypted);
        var myKey = onlyUpper(key);

        if(document.vigenere.selfKey.checked) {
            // Self-Key
            myKey += uncrypted;
        } else {
            // Repeat key
            var repeatKey = Math.floor(uncrypted.length / myKey.length);

            while(repeatKey > 0) {
                myKey += myKey;
                repeatKey--;
            }
        }

        var keyPos = 0;

        for(var i=0; i<uncrypted.length; i++) {
            var charCode = uncrypted.charCodeAt(i);
            var keyCode  = myKey.charCodeAt(keyPos);

            if(charCode >= 65 && charCode <= 91) {
                charCode += myKey.charCodeAt(keyPos)-65;
                while(charCode < 65) charCode += 26;
                while(charCode >= 91) charCode -= 26;
                crypted += String.fromCharCode(charCode);
                keyPos++;
            }
        }
        document.vigenere.fullKey.value = myKey;
        return crypted;
    }

    function vigenere_de(crypted, key) {
        var uncrypted = "";
        var myKey = onlyUpper(key);
        var keyPos = 0;
        crypted = onlyUpper(crypted);

        if(!(document.vigenere.selfKey.checked)) {
            // Repeat key
            var repeatKey = Math.floor(crypted.length / myKey.length);

            while(repeatKey > 0) {
                myKey += myKey;
                repeatKey--;
            }
        }

        for(var i=0; i<crypted.length; i++) {
            var charCode = crypted.charCodeAt(i);
            var keyCode  = myKey.charCodeAt(keyPos);

            charCode -= myKey.charCodeAt(keyPos)-65;

            while(charCode <= 65) charCode += 26;
            while(charCode >= 91) charCode -= 26;

            // Add char to solution string
            uncrypted += String.fromCharCode(charCode);

            // If selfkey method is used: add char also to key string
            if(document.vigenere.selfKey.checked) {
                myKey += String.fromCharCode(charCode);
            }

            keyPos++;
        }
        document.vigenere.fullKey.value = myKey;
        return uncrypted;
    }

    function onlyUpper(myText) {
        myText = myText.toUpperCase();
        var ret = "";

        for(var i=0; i<myText.length; i++) {
            var charCode = myText.charCodeAt(i);

            if(charCode >= 65 && charCode <= 91) {
                ret += String.fromCharCode(charCode);
            }
        }

        return ret;
    }

    function encode() {
        var uncrypted = document.vigenere.uncrypted.value;
        var key       = document.vigenere.key.value;
        var crypted   = vigenere_en(uncrypted, key);
        document.vigenere.crypted.value = crypted;
    }

    function decode() {
        var uncrypted = document.vigenere.uncrypted.value;
        var key       = document.vigenere.key.value;
        var crypted   = vigenere_de(uncrypted, key);
        document.vigenere.crypted.value = crypted;
    }

    function swap() {
        var tmp = document.vigenere.uncrypted.value;
        document.vigenere.uncrypted.value = document.vigenere.crypted.value;
        document.vigenere.crypted.value = tmp;
    }

    function clear_all() {
        if(confirm("Do you really want to clear the boxes?")) {
            document.vigenere.uncrypted.value = "";
            document.vigenere.crypted.value = "";
            document.vigenere.key.value = "";
            document.vigenere.fullKey.value = "";
        }
    }
    </script>

    <title>
      Vigenere Cipher
    </title>
  </head>
  <body>
    <div id="container">
      <h1>
        Vigenere Cipher
      </h1>
      <noscript>You have to enable JavaScript to use this tool</noscript>
      <form onsubmit="return false;" name="vigenere">
        <p>
          Input:<br />
          <textarea name="uncrypted" id="uncrypted">YOURTEXT</textarea>
        </p>
        <p>
          Key: <input type="text" id="key" value="ANYKEY" />
          <input type="checkbox" name="selfKey" checked="checked" />Self-Key
          <input type="button" value="encode" onmousedown="encode()" />
          <input type="button" value="decode" onmousedown="decode()" />
          <input type="button" value="swap" onmousedown="swap()" />
          <input type="button" value="clear" onmousedown="clear_all()" />
        </p>
        <p>
          Full key (only for debug purposes; don't enter any text):
          <input type="text" id="fullKey" value="" onkeydown="return false;" />
        </p>
        <p>
          Output:<br />
          <textarea name="crypted" id="crypted"></textarea>
        </p>
      </form>
    </div>
  </body>
</html>
Eydeet ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 12.01.07, 09:10   #28 (permalink)
 
Registriert seit: 12.01.07
Karma: 7
Ivan Dolvich Leistung: Facit NTK
Standard RE: kleines Verschlüsselungsprogramm

Hi Hackers, hier ist meine Lösung für Caesar und Vigenere, powered by Groovy :-)

Code:
// ***** Caesar *****

String encodeCaesar(String text)
{
    return caesar(text, "A", "Z", { it.next() })    
}

String decodeCaesar(String text)
{
    return caesar(text, "Z", "A", { it.previous() })    
}

String caesar(String text, String START, String END, Closure move)
{
    return text.replaceAll("[A-Z]") { c -> 
        3.times {
            c = (c != END) ? move(c) : START
        }
        return c 
    }
}

println encodeCaesar("ABCZ")     // "DEFC"
println decodeCaesar("DEFC")     // "ABCZ"

// ***** Vigenere *****

charRange = "A".."Z"

String encodeVigenere(String text, String key)
{
    return vigenere(text, key, "A", "Z", { it.next() })
}

String decodeVigenere(String text, String key)
{
    return vigenere(text, key, "Z", "A", { it.previous() })
}

String vigenere(String text, String key, String START, String END, Closure move)
{
    char[] result = new char[text.size()]
    keySize = key.size()
    text.eachWithIndex { c, i ->
        keyChar = key[i % keySize]
        shift = charRange.indexOf(keyChar)
        shift.times {
            c = (c != END) ? move(c) : START
        }
        result[i] = c
    }
    return new String(result)
}

println encodeVigenere("GEHEIMNIS", "AKEY")  // "GOLCIWRGS"
println decodeVigenere("GOLCIWRGS", "AKEY")  // "GEHEIMNIS"
Ivan Dolvich ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 12.01.07, 13:53   #29 (permalink)
 
Registriert seit: 08.12.04
Karma: 11
freak4fun Leistung: Facit NTK
Standard

Zitat:
Original von Johnson Morgen liefe ich evtl nen Quellcode, hab jetzt aber wie gesagt keine Zeit das abzutippen.
Kommt da noch was in Delphi? Würde mich sehr interessieren.

MfG
freak
freak4fun ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 02.02.07, 20:54   #30 (permalink)
 
Registriert seit: 30.01.06
Karma: 15
LaNdRiX Leistung: 8086
Standard

Moin!

Hab das ganze nochmal in PHP geschrieben (ich bin gerade erst angefangen mit PHP, also nicht lachen )...

[HIDE]
PHP-Code:

<html>
<body bgcolor="black" text= "white">

<font color="red">
<h1>
<u><b>Caesar De- and Encryption</b></u>
</h1>
</font>
<br>
<br>
<br>
<br>

<form method="GET">

    <font size=5>
        <p><u>Encryption</u></p>
    </font>

    <table>
    <tr>
        <td>
            String:
        </td>
        <td>
            <input type="text" name="string">
        </td>
    </tr>
    <tr>
        <td>
            Encryption-Key:
        </td>
        <td>
            <input type"text" name="key">
        </td>
    </tr>
    <tr>
        <td>
        </td>
        <td>
            <input type="submit" value="Encrypt!">
        </td>
    </tr>
</table>

</form>
                
<?PHP

$string 
htmlentities(strtolower(trim($_GET['string'])));
$key trim($_GET['key']);

$abc = array("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");

$zahl = array("a"=>0"b"=>1"c"=>2,"d"=>3,"e"=>4"f"=>5"g"=>6"h"=>7"i"=>8"j"=>9,   "k"=>10"l"=>11"m"=>12"n"=>13"o"=>14"p"=>15"q"=>16"r"=>17"s"=>18"t"=>19"u"=>20"v"=>21"w"=>22"x"=>23"y"=>24"z"=>25);


$length strlen($string);

if( !
is_numeric($key) || $key || $key 26)
{
    echo 
"Bitte einen Schlüssel zwischen 0 und 26 eingeben!";
}

else
{
    for(
$i0$i<$length$i++)
    {
        
$tmp substr($string$i1);
        
$letter $zahl[$tmp];
        
$index $letter $key;
        if(
$index 25 || $index < -25)
        {
            
$index-=26;
        }
        
$endString .= $abc[$index];

    }
    if(
$endString != "")
    {
        echo 
"Encrypted String:   <b>$endString</b>";
    }
}

?>





<form method="GET">

    <font size=5>
        <p><u>Decryption</u></p>
    </font>

    <table>
    <tr>
        <td>
            String:
        </td>
        <td>
            <input type="text" name="string1">
        </td>
    </tr>
    <tr>
        <td>
            Decryption-Key:
        </td>
        <td>
            <input type"text" name="key1">
        </td>
    </tr>
    <tr>
        <td>
        </td>
        <td>
            <input type="submit" value="Decrypt!">
        </td>
    </tr>
</table>

</form>
    
    <?PHP

$string 
htmlentities(strtolower(trim($_GET['string1'])));
$key trim($_GET['key1']);

$abc = array("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");

$zahl = array("a"=>0"b"=>1"c"=>2,"d"=>3,"e"=>4"f"=>5"g"=>6"h"=>7"i"=>8"j"=>9,   "k"=>10"l"=>11"m"=>12"n"=>13"o"=>14"p"=>15"q"=>16"r"=>17"s"=>18"t"=>19"u"=>20"v"=>21"w"=>22"x"=>23"y"=>24"z"=>25);


$length strlen($string);

if(!
is_numeric($key) ||$key || $key 26)
{
    echo 
"Bitte einen Schlüssel zwischen 0 und 26 eingeben!";
}

else
{
    for(
$i0$i<$length$i++)
    {
        
$tmp substr($string$i1);
        
$letter $zahl[$tmp];
        
$index $letter $key;
        if(
$index 25 || $index < -25)
        {
            
$index-=26;
        }
        
$endString1 .= $abc[$index];

    }
    if(
$endString1 != "")
    {
        echo 
"Decrypted String:   <b>$endString1</b>";
    }
}
?>
    


</body>
</html>
[/HIDE]




http://ad90.ad.funpic.de/Caesar-Code/Caesar.php
__________________
mfg landrix
LaNdRiX ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Antwort

[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 an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Neues Verschlüsselungsprogramm (selbst gecodet) Tec Cryptography & Encryption 101 20.07.07 10:37
Verschlüsselungsprogramm Until-Death Code Kitchen 5 01.07.07 12:34
Verschlüsselungsprogramm antcool Cryptography & Encryption 14 21.10.05 15:31
Bestes Verschlüsselungsprogramm spyro133 Cryptography & Encryption 2 20.06.05 07:09
Verschlüsselungsprogramm Avenger Cryptography & Encryption 5 22.11.04 20: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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194