WinFuture-Forum.de: Caesar Cipher - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Caesar Cipher


#1 Mitglied ist offline   TheGreatTimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 305
  • Beigetreten: 04. März 15
  • Reputation: 40
  • Geschlecht:Männlich

geschrieben 30. Juni 2015 - 10:36

Hi Leute,

für eine Prüfung brauche ich einen (äußerst einfachen, auf Zellinhalte beschränkte) Caeser Cipher. Ich hab auch schon einiges geschafft, allerdings wird z.B. bei W ein _ draus. Kann man das irgendwie auf reine Buchstaben beschränken? Danke schon mal für eure Hilfe, bin froh, wenn ich VB nach der Prüfung wieder los bin :)

Option Explicit 			
Dim verschiebung As Integer 
Dim ac As Integer          
Dim intcol As Integer      

Sub caesar()       			
    verschiebung = Cells(1, 2)   
    intcol = 2                      

    Do While Cells(2, intcol) <> "" 
        Cells(3, intcol) = encipher(Cells(2, intcol)) 
        intcol = intcol + 1      
    Loop                          
    
End Sub                    

Function encipher(inputc As String) As String
ac = Asc(inputc)
ac = ac + verschiebung
encipher = Chr(ac)
End Function


Dieser Beitrag wurde von TheGreatTimmy bearbeitet: 04. Juli 2015 - 10:28

Lückenfüller Alles, was ich hier schreibe, entspricht selbstverständlich nur meiner eigenen Meinung :)
0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 30. Juni 2015 - 11:02

Das wird, wenn ich das Fragment richtig lese, immer dann Probleme geben, wenn Du mit Deinem shift übers Z hinauskommst.

Du müßtest Dir also fürs Mapping (plaintext; verschlüsselt) etwas einfallen lassen.

Zum Beispiel etwas wie...

offset_plain_char = Asc(char) - Asc("A")
offset_enc_char = ( offset_plain_char + shift_by ) % 26
enc_char = Char( Asc("A") + offset_enc_char )



... was letztlich einfach durchrotiert. Schätze mal, so hat der der alte Herr auch gemacht.

So erfordert das allerdings Eingaben von A-Z. Kleinbuchstaben gehen damit nicht und Nicht-Buchstaben auch nicht. Soll mehr als nur Großbuchstaben funktionieren, müßte man das entsprechend erweitern.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
1

#3 Mitglied ist offline   TheGreatTimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 305
  • Beigetreten: 04. März 15
  • Reputation: 40
  • Geschlecht:Männlich

geschrieben 30. Juni 2015 - 18:29

Erstmal vielen Dank für die schnelle Antwort!

Das Problem mit Z< stimmt und ich brauche nur Großbuchstaben von A-Z. Also wären alle Kriterien einmal erfüllt :)

Leider habe ich überhaupt keine Programmierkenntnisse und das ist auch das einzige Programm für alle Zeiten, das ich wie im Schlaf bei der Prüfung runtertippen können muss. Hab mich die letzten paar Stunden zwar sehr bemüht, hab deinen Vorschlag aber irgendwie nicht funktionstüchtig einbauen können...

Ganz blöd gefragt: Wo muss das denn bei mir rein, dass das funktioniert? Eingefügtes Bild

Dieser Beitrag wurde von TheGreatTimmy bearbeitet: 30. Juni 2015 - 18:30

Lückenfüller Alles, was ich hier schreibe, entspricht selbstverständlich nur meiner eigenen Meinung :)
0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 30. Juni 2015 - 20:16

In die "Encipher"-Funktion.

Okay, um "funktionsfähigen" Code hab ich mich nun wirklich nicht bemüht, das sollte wirklich nur ein Outline sein. Insbesondere bau ich nicht in VB und kann daher nicht garantieren, "echte" VB-Funktionen anzugeben. :blush:

VB sollte Chr/ChrW haben (wobei -W die bessere, weil Unicode-fähige Option wäre). Aber wenn das einfach nur VBA in Excel sein soll (worauf Deine Verwendung von Cells() hindeutet) dann müßte Char() eigentlich dasselbe tun.

Blöderweise bin ich deswegen grad nicht im Klaren darüber, was Du da von Funktion zu Funktion rüberreichst. Ich hatte jetzt einfach implizit angenommen, ohne da weiter genauer nachzulesen, daß caesar() auf eine einzelne Zelle angewendet wird und encipher() einen einzelnen Buchstaben kriegt, den es transformieren soll.

Falls das in etwa so hinkommt: Okay.

Falls nicht: Aufpassen, denn Chr() gibt logischerweise nur den ANSI-Wert für *ein* Zeichen (und schmeißt den Rest ab dem zweiten Zeichen weg).


Für inputc = "1 Zeichen aus dem Intervall [A;Z]" nochmal in Worten:

1. Bestimme den Abstand (offset) von inputc zu einer fixen Basis. A als erster Buchstabe bietet sich an. Damit kriegen wir Werte von 0 = A bis 25 = Z. Die Basis müssen wir uns merken und stecken daher Chr("A") in die Variable "base".

2. Wir haben einen fixe Verschiebung für die Caesar-Transformation. Wie Du ja selber geschrieben hattest, kommt diese Verschiebung auf unseren Buchstaben obendrauf; ABER wir müssen dafür sorgen, daß wir in unserer Zeichenklasse (0; 25 wie A - Z) DRIN bleiben... damit also 24("Y") + 2 nicht 26("eins-nach-Z"), sondern 0("A") wird. Das macht Modulo 26.

3. Jetzt brauchen wir nur noch den Buchstaben an diesem Offset. Da aber ein jeder Offset relativ zu "etwas" ist (bei uns war das "base") und wir aber ein Zeichen an einem absoluten Wert brauchen, müssen wir wieder diese unsere ursprüngliche Basis verwenden und bekommen Chr(base + offset). Mit offset = 0 also die Basis selber, mit Offset 1 den nächsten Buchstaben... und so weiter bis "der 25. Buchstabe nach A", was dann hoffentlich "Z" gewesen war. Hier wird dann auch offensichtlich, warum wir uns auf das Intervall [A;Z] beschränken müssen: Sonderzeichen finden sich anderswo in der Zeichentabelle und außerdem müßte vorher geklärt werden, WIE ein Sonderzeichen transformiert werden soll. Diese müßten dann als Einzelfälle per If...End If oder (wenn VBA das kann) per Case abgehandelt werden.

4. Fertig; Ergebnis kann zurückgegeben werden.


Für Zeichenfolgen müßte dann entsprechend encipher() für jedes Zeichen einzeln aufgerufen werden und dann das Endergebnis wieder zusammengebaut werden, entweder seriell oder parallel, je nachdem was VBA mitmacht.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
1

#5 Mitglied ist offline   TheGreatTimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 305
  • Beigetreten: 04. März 15
  • Reputation: 40
  • Geschlecht:Männlich

geschrieben 02. Juli 2015 - 06:43

Großes Danke für die ausführliche Antwort :)
Hab mich damit auseinander gesetzt und bin dann tatsächlich auf die richtige Lösung gekommen!

Den fertigen (sicher nicht schönen, aber funktionstüchtigen) Code kann ich ja mal posten, wenn ich wieder Zugriff auf mein OneDrive habe!
Lückenfüller Alles, was ich hier schreibe, entspricht selbstverständlich nur meiner eigenen Meinung :)
0

#6 Mitglied ist offline   TheGreatTimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 305
  • Beigetreten: 04. März 15
  • Reputation: 40
  • Geschlecht:Männlich

geschrieben 04. Juli 2015 - 10:30

Hier, wie versprochen, der vollständige und funktionsfähige Code :)

Option Explicit                     	
Dim verschiebung As Integer 
Dim ac As Integer          
Dim intcol As Integer      

Sub caesar()                            
    verschiebung = Cells(1, 2)   
    intcol = 2                      

    Do While Cells(2, intcol) <> "" 
        Cells(3, intcol) = encipher(Cells(2, intcol)) 
        intcol = intcol + 1      
    Loop                          
    
End Sub                    

Public Function encipher(zelle) As String
Dim btTMP() As Byte
Dim I As Integer
btTMP = StrConv(zelle.Value, vbFromUnicode)
For I = LBound(btTMP) To UBound(btTMP)
    Select Case btTMP(I)
        Case 65 To 87: btTMP(I) = btTMP(I) + 3
        Case 88 To 90: btTMP(I) = btTMP(I) - 23
    End Select
Next
encipher = StrConv(btTMP, vbUnicode)
End Function


Dieser Beitrag wurde von TheGreatTimmy bearbeitet: 04. Juli 2015 - 10:31

Lückenfüller Alles, was ich hier schreibe, entspricht selbstverständlich nur meiner eigenen Meinung :)
0

#7 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 05. Juli 2015 - 08:07

Sieht irgendwie nach VBA aus: Arg quick, und arg dirty. :lol:

Ich häng mich ja an der Auto-conversion etwas auf, aber gut, ist VBA. Warum die irgendwelche Datentypen außer Variant definieren... naja. Hatten vermutlich Langeweie bei Microsoft.

--- Anyway ein was fällt noch auf: Deine Verschiebung ist so ziemlich hart codiert. Kann man so machen, aber ein Shift um 2 oder 4 oder was anderes wird dadurch erschwert. Nichts kritisches; aber mh, wenn ich derjenige bin wo wer kommt und geprüft werden will würde ich dem das ankreiden.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#8 Mitglied ist offline   Sturmovik 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.776
  • Beigetreten: 10. Januar 08
  • Reputation: 445
  • Geschlecht:unbekannt
  • Wohnort:In Reichweite der Kaffeemaschine
  • Interessen:IT, Luftfahrt, historische Technik

geschrieben 05. Juli 2015 - 08:57

ist auf jeden Fall VB. Aber es freut mich zu sehen, dass die erste Zeile gesetzt ist. Sieht man leider nicht mehr häufig :/
«Geschichte wiederholt sich nicht, aber sie reimt sich» (Mark Twain)

Unix won't hold your hand. You wanna shoot your foot, Unix reliably delivers the shot.

True Cloudstorage
0

#9 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 05. Juli 2015 - 09:36

Hat man das jemals "häufig" gesehen? Bei VB muß man ja schon froh sein, wenn da ein End Sub dasteht. :D
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0