Verschlüsselung
Übersicht

NForcerBetreff: Verschlüsselung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
NForcer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
NForcer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group