Verschlüsselung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

NForcer

Betreff: Verschlüsselung

BeitragDi, März 01, 2005 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiss jetzt nicht ob das noch zum Beginner-Forum gehört, aber ich schreibs hier mal rein.
Ich habe da eine Frage, ich will gerne einen Text verschlüsseln, allerdings nicht mit der allseitsbeliebten Xor'erei^^ sondern, nehme ich da lieber nen anderes, und zwar das Transpositionsverfahren: anzuschauen hier:
http://www.regenechsen.de/krypto/transposition.php

Ich habe das jetzt relativ erfolgreich für BB umgesetzt, allerdings hat das ganze einen Haken :(
Die Zahl des Key's muss ein teiler der Länge des Plaintextes sein :(, was einem aber nie gelingen wird, wenn man selbst den Text eingibt...da man ja niemals die Zahl der Buchstaben mitzählen wird^^.

Hier nen Beispiel:

Code: [AUSKLAPPEN]

Plaintext$ = "DIES IST EIN TEST, HOFFENTLICH KLAPPT DIESER."

;Plaintext$ = "WER DAS LESEN KANN IST SCHLAU"
;Plaintext2$ = "die liebe ist sieger - rege ist sie bei leid"
 
Key = 5
Var = 1
Dim Buchstaben$(Len(Plaintext)/Key,Key)


For Zeile = 1 To Len(Plaintext)/Key
    For Spalte = 1 To Key
      Buchstaben$(Zeile,Spalte) = Mid$(Plaintext,Var,1)
      Var = Var+1
   Next
Next
Print "Originaltext:"
For i = 1 To Len(plaintext)/Key
   ;Print " "
   For j = 1 To Key
      Write Buchstaben(i,j)
   Next
Next

Print " "
Print " "
Write "Crypting Text ."

For bla = 1 To 10
   Delay 220
   Write "."
Next

Print " "
Print " "
Print "Hier der codierte Plaintext (auch Chiffretext genannt) "

For i = 1 To Key
   For j = 1 To Len(Plaintext)/Key
      Write Buchstaben(j,i)
   Next
Next

Print " "
Print " "
waitkey

hier funktionierts noch einwandfrei *ps: mann kann das ";" vor dem Print " " in der Schleife für den Originaltext wegnehmen... dann sieht der Text genauso aus, wie auf der Homepage (so zum Vergleichen, das der PC auch alles richtig macht)...

wenn ich nun sagen wir mal den Key ändere, oder den Plaintext also sagen wir ich nehme den 2. Plaintext, fehlen schon einige Buchstaben.
Code: [AUSKLAPPEN]

;Plaintext$ = "DIES IST EIN TEST, HOFFENTLICH KLAPPT DIESER."

Plaintext$ = "WER DAS LESEN KANN IST SCHLAU"
;Plaintext2$ = "die liebe ist sieger - rege ist sie bei leid"
 
Key = 5
Var = 1
Dim Buchstaben$(Len(Plaintext)/Key,Key)


For Zeile = 1 To Len(Plaintext)/Key
    For Spalte = 1 To Key
      Buchstaben$(Zeile,Spalte) = Mid$(Plaintext,Var,1)
      Var = Var+1
   Next
Next
Print "Originaltext:"
For i = 1 To Len(plaintext)/Key
   ;Print " "
   For j = 1 To Key
      Write Buchstaben(i,j)
   Next
Next

Print " "
Print " "
Write "Crypting Text ."

For bla = 1 To 10
   Delay 220
   Write "."
Next

Print " "
Print " "
Print "Hier der codierte Plaintext (auch Chiffretext genannt) "

For i = 1 To Key
   For j = 1 To Len(Plaintext)/Key
      Write Buchstaben(j,i)
   Next
Next

Print " "
Print " "
waitkey

Wenn man sich dann mal die Schreibe weise anguckt, mit dieser "Tabellenform" sieht man halt das "nicht ganz" eine Zeile ganz unten fehlt (ist dann eben dieser Fehler beim Teilen von len(plaintext) durch den Key...)

Ich hatte mir da jetzt 2 Methoden überlegt, allerdings haben beide ihre Nachteile und zwar relativ gravierende!

1. Ich ermittle einfach einen Key, der dann der Teiler ist mithilfe des
modulo also len(plaintext) mod key und zwar solange bis da null rauskommt... allerdings, wo soll ich dann den Key speichern? und doof ist auch, das ich dann nicht immer den gleichen Key benutze, sodass ich den Text nicht immer mit dem gleichen Key entschlüsseln kann.

2. Man fügt einfach soviele Zeichen an den Plaintext bis der Key ein Teiler von ihm ist... Nachteil: 1. Womit fülle ich auf? Denn wenn ich ihn mit "X" oder so auffülle, ist dies ja dann automatisch irgendwo im Text enthalten und ich kann ja nicht einfach alle "X" aus dem Text entfernen, da dieses Zeichen ja vllt. auch so vorkommt...

also wer kann mir helfen?
Ist zwar ziemlich kompliziert, aber hier sind ja auch schlaue köpfe... vllt. habt ihr ja sogar nen 3. besseren Weg...

mfG hoffe auf Antwort
 

Sebe

BeitragDi, März 01, 2005 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Möglichkeit 1 fällt flach, denn wenn die Länge der Nachricht eine Primzahl ergibt kannst du lange einen Teiler suchen.

Die 2te Möglichkeit lässt sich aber ganz leicht befriedigend umsetzen:
Du füllst die Nachricht einfach mit Leerzeichen auf. Dann schreibst du eine Funktion, die bei der entschlüsselten Nachricht alle Leerzeichen am Ende entfernt.
Sollte so jedenfalls befriedigend genug funktionieren Wink

Trotzdem interessanter Thread. Ich habe jetzt schon 3 Verschlüsselungsverfahren für mein Verschlüsselungsmodul entworfen, aber Transposition wird bei keinem benutzt. Haben wir mal wieder was gelernt Rolling Eyes

skey-z

BeitragDi, März 01, 2005 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
habs mir mal alles in ner Word datei auf den rechner gelegt, werde es mir bei zeiten mal durchlesen, weil es mich auch interessiert, vlt kann man da ja was drauss lernen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

NForcer

BeitragDi, März 01, 2005 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Danke für die Hilfe... es scheint zu klappen.
Ich arbeite gerade daran, den Algorithmus zu verbessern und bin auch auf dem besten Weg dahinzukommen^^.

@Sebe: stimmt... an Primzahlen habe ich gar nicht mehr gedacht... da kann sich ja das Programm bei Textlängen wie 29 etc dumm und dämlich rechnen^^

Im endeffekt will ich daraus 2 Funktionen machen

1. Crypt(plain,Key)
2. DeCrypt(code,Key)

und ich schätze mal das ich spätestens morgen daraus eine halbwegs brauchbare Verschlüsselung gemacht habe^^.

So nun arbeite ich noch nen bissel ma sehn wie weit ich komme

mfG
 

NForcer

BeitragMi, März 02, 2005 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe es momentan noch sehr schlecht schonmal geschafft...
leider momentan noch etwas sehr Umständlich... :(
Aber was rede ich, seht selbst:

Code: [AUSKLAPPEN]

;3 Verschiedene Texte zum Rumprobieren
Plaintext$ = "DIES IST EIN TEST, HOFFENTLICH KLAPPT DIESER."
;Plaintext$ = "WER DAS LESEN KANN IST SCHLAU"
;Plaintext2$ = "die liebe ist sieger - rege ist sie bei leid"

Key = 5
Global GesamtLaenge

Dim Buchstaben$(50,10)

   wLaenge = Len(Plaintext)
   m = wLaenge Mod Key
      If m = 0 Then
         m = Key
      EndIf
   add = Key - m  ;Hier wird ermittelt, wieviele Zeichen noch angehangen werden müssen und in "add" gespeiche
   GesamtLaenge = wLaenge+add
   Print GesamtLaenge

Function Crypt$(pText$,Schluessel)
   Var = 1
   
Select add
Case 1 pText$ = pText + "_"
Case 2 pText$ = pText + "__"
Case 3 pText$ = pText + "___"
Case 4 pText$ = pText + "____"
End Select
For Zeile = 1 To GesamtLaenge
    For Spalte = 1 To Schluessel
      Buchstaben$(Zeile,Spalte) = Mid$(pText,Var,1)
      Var = Var+1
   Next
Next

For i = 1 To Schluessel
   For j = 1 To GesamtLaenge
      Code$ = Code + Buchstaben(j,i)
   Next
Next

Return Code$
End Function

Print Crypt$(Plaintext,5)

WaitKey


Wie man sieht habe ich sehr große Probleme mit den Variablen...
dies liegt allerdings ganz allein an dem Dim :( den kann ich nicht in die Funktion reinschreiben, sodass ich die Berechnung der Textlänge und der Gesamtlänge noch vor der Funktion machen muss :(.

Ich komme leider momentan nicht auf die Lösung... ich probiere und probiere aber jedesmal kommt Array out of... usw...

ich habe anstelle der Leerzeichen erstmal "_" angehangen, damit man das vorerst noch nachvollziehen kann, wie "gut" das alles klappt, da habe ich auch gleich mein 2. Prob. ich weiss nicht wie ich das Anhängen von Zeichen möglichst allgemein halten kann..momentan muss der Key 5 oder kleiner sein, da ja sonst der Rest größer 5 wäre aber ich nur bis maximal 4 Zeichen anhängen kann... aber jetzt ists schon spät und ich will langsam schlafen gehen. Meistens komme ich am nächsten morgen immer auf gute Ideen^^

Achja: ich hab das alles auch mal Ohne Funktion geschrieben und da klappts dann noch etwas unaufwändiger (vom Variablenbezeichnen her...
Code:
Code: [AUSKLAPPEN]

;Plaintext$ = "DIES IST EIN TEST, HOFFENTLICH KLAPPT DIESER."
Plaintext$ = "WER DAS LESEN KANN IST SCHLAU"
;Plaintext2$ = "die liebe ist sieger - rege ist sie bei leid"


Key = 5
Var = 1
wLaenge = Len(Plaintext)
m = wLaenge Mod Key
If m = 0 Then
   m = Key
EndIf
add = Key - m

Select add
Case 1 Plaintext$ = Plaintext + "_"
Case 2 Plaintext$ = Plaintext + "__"
Case 3 Plaintext$ = Plaintext + "___"
Case 4 Plaintext$ = Plaintext + "____"
End Select

Dim Buchstaben$(wLaenge+add,Key)


For Zeile = 1 To wLaenge+add
    For Spalte = 1 To Key
      Buchstaben$(Zeile,Spalte) = Mid$(Plaintext,Var,1)
      Var = Var+1
   Next
Next

;Print "Originaltext:"
For i = 1 To wLaenge+add
   ;Print " "
   For j = 1 To Key
      Write Buchstaben(i,j)
   Next
Next

WaitKey

Print " "
For i = 1 To Key
   For j = 1 To wLaenge+add
      ;Write Buchstaben(j,i)
      Code$ = Code + Buchstaben(j,i)
   Next
Next

Print code

WaitKey

auf dieser Grundlage (also vom 2. Quelltext) habe ich meine Funktion versucht zu schreiben, jedoch bisher ohne erfolg... wie gesagt soll man als "Anwender" später nur(!!) mit Crypt(Plaintext,Key) den Code erstellen und nicht vorher noch alle möglichen Variablen ausrechnen ...

so, ich sabbel wieder einen Mist^^

mfG

DivineDominion

BeitragMi, März 02, 2005 1:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Java kannst: Habe für Informatikstunden mal das Cäsar und Vigenere-Verfahren umgesetzt:

Code: [AUSKLAPPEN]
class CEncode
{
   public String caesar( String sText, int iVerschiebung )
   {
      String sBuchstaben = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöü";
      
      //Wert unter 0
      while ( iVerschiebung < 0 )
      {
         iVerschiebung = sBuchstaben.length(  ) + iVerschiebung;
      }
      
      //Wert über 58
      while ( iVerschiebung >= sBuchstaben.length(  ) )
      {
         iVerschiebung = iVerschiebung - sBuchstaben.length(  );
      }
      
            
      String sVerschieben = sBuchstaben.substring( 0, iVerschiebung );
      String sRest = sBuchstaben.substring( iVerschiebung );
      
      String sBuchstabenNeu = sRest + sVerschieben;
      
      String sNeu = "";
         
      
      
      for ( int i = 0;
         i < sText.length(  );
         i++ )
      {
         char c = sText.charAt( i );
         int pos = sBuchstaben.indexOf( c );
         char cNeu = sBuchstabenNeu.charAt( pos );
         
         sNeu += String.valueOf( cNeu );
      }
      
      return sNeu;
   }
   
   public String caesar_decode( String sText, int iVerschiebung )
   {
      iVerschiebung *= -1;
         
      return caesar( sText, iVerschiebung );
   }
   
   
   public String vigenere( String sText, String sCode )   
   {
      /*
       c <-> D
          |
        abcde
        ABCDE
        BCDEA
        CDEAB
       -DEABC  = A
        EABCD
      
       Text: VIGENERESTUDIERTE
       Code: SCHULESCHULESCHUL
           =          N     N
      */   
      
      String sBuchstaben = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      
      //Nur Großbuchstaben
      sText = sText.toUpperCase(  );
      int iTextLen = sText.length(  ) - 1;
      
      String sCodeBuf = sCode.toUpperCase(  );
      int iCodeLen = sCode.length(  ) - 1;
      
      sCode = "";
      
      //Schneller als Modulo
      while ( sCode.length( ) <= iTextLen )
      {
         sCode += sCodeBuf;
      }
      
      //Ergebnis
      String sNeu = "";
      
      for ( int i = 0; i <= iTextLen; i++ )
      {
         /*
             Buchstabenkette verschieben, bis Code-Buchstabe an i der Erste
             der neuen Buchstabenkette ist:
             Code = "CODE", i = 0
                -> Code-Buchstabe = C
                -> Buchstabenkette = CDEFGH..ZAB
         */
         
         //Buchstabe an i
         char c = sText.charAt( i );
         
         //Buchstabe an i im Code (wiederholt bei Überschreitung der Länge)
         //char cCode = sCode.charAt( i % iCodeLen );
         char cCode = sCode.charAt( i );
         
         //Position in Buchstabenkette
         int iPosCode = sBuchstaben.indexOf( cCode );
         
         
         //Neue verschobene Buchstabenkette (-> CDEFGH...ZAB)
         String sVerschieben = sBuchstaben.substring( 0, iPosCode );
         String sRest = sBuchstaben.substring( iPosCode );
         String sBuchstabenNeu = sRest + sVerschieben;
      
      
         //Position des Buchstabens aus dem Text
         int iPos = sBuchstaben.indexOf( c );
         
         //Neuer Buchstabe mit Code
         char cNeu = sBuchstabenNeu.charAt( iPos );
         
         sNeu = sNeu + String.valueOf( cNeu );
      }   
      
      return sNeu;
   }
}


Beim Caesar-Verfahren verschiebst du das Alphabet um "Verschiebung"-Stellen. Bei Verschiebung = 1 wäre der Buchstabe A dann B. Bei 2 wäre es C usw.

Das Vigenere-Verfahren ist da etwas kniffliger:
Du baust dir eine Art Array auf (hab ich da jetzt nicht getan), und zwar so:
Code: [AUSKLAPPEN]
ABCDEF...Z
BCDEF...ZA
CDEF...ZAB
DEF...ZABC
EF...ZABCD
F...ZABCDE
...ZABCDEF
ZABCDEF...


Dann gibst du einen Schlüssel an und wiederholst ihn immer wieder:
SchlüsselSchlüsselSchlüssel...üssel
So lang wie der Text eben ist (lässt sich auch mit Mod lösen, nur ist Mod realtime langsamer und irgendwo war da ein Fehler Wink).

In einer For-Schleife gehst du für "i" alle Zeichen durch und nimmst dann den Buchstaben im Schlüssel, der an "i" ist. Ist i=1, wäre das das hier "S". Im Angegebenen Text wäre i=1 z.B. "B". Dann suchst du in deiner Tabelle links nach S, oben nach B und suchst dir den Schnittpunkt raus.

In meiner Minitabelle oben wäre eine Kombination aus "B" und "C" zum Beispiel "D".


Weiß ja nicht ob dir das reicht, ist aber leichter zu verstehen Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

NForcer

BeitragMi, März 02, 2005 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dive:
Cäser-Chiffre und Vigènère kenne ich. Haben wir erst am Montag im Informatik-untterricht besprochen... auch noch nen paar andere.
Da werden wir wohl aber nur das Cäsar-Chiffre für TCL/TK umsetzen.

Zunächst hatte ich mir auch überlegt das ich das Vinenereverfahren für BB umsetze, allerdings ist das ja dann noch ne ganze ecke schwieriger für mich, zumal ich nun auch noch nicht sooo bewandert in BB bin^^.

Daher hab ich mal im internet nach ne paar Verschlüsselungen gesucht, die zwar einfach aber trotzdem nicht auf den ersten Blick zu durchschauen sind, und da fiel mir eben das Transpositionsverfahren auf^^. Und das will ich erstmal durchziehen, bis ichs geschafft habe.
Achja und´Java kann ich auch nicht^^.

Zu meinem Problem: Weiss jemand vllt. wie ich das mit dem Dimfeld so umändern kann, das ich das auch in der Funktion alles machen kann?
Mir gehen da so langsam die Ideen aus (bzw. sind eigentlich schon ausgegangen... ich probiere jetzt eigentlich nur auf gut glück und hoffe das es klappt... natürlich nicht grade sehr professionell^^)
 

sven123

BeitragMi, März 02, 2005 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm Types dann kannst du es auch in der function ablaufen lassen.
Amd Athlon 2200+,Saphire Atlantis Radeon9800pro,1024 MB DDR RAm,40 Gb Festblatte.
'in shâ'a llâh=so Gott will
Fertiges Projekt:Invasion der Heuschrecken

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group