• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

ROT13 cipher - Encrypt & Decript & lussen door de getallen 1 t/m 26

Status
Niet open voor verdere reacties.

Ginger

Terugkerende gebruiker
Lid geworden
29 dec 2006
Berichten
2.972
Nav een vraag hier op het forum (kan 'm ff niet meer vinden...) ben ik bezig geweest met het ROT Cipher systeem. Voor het Geo Cachen had ik al ooit in Excel iets gebouwd met ROT13. Deze is niet zo moeilijk omdat je altijd kan "doortellen" met 13. Of je nou Decrypt en Encrypt. Maar als je met een andere sleutel dan 13 gaat werken, wordt het een ander verhaal. De "heenweg" (dus: ROT13 A = N; of: ROT2 Z = B) heb ik al weten aan te maken. Dit heb ik gedaan via de MOD functie (MOD(letterwaarde - 64 + ROTwaarde;26)). Ik zit nu op m'n werk en heb m'n voorbeeld thuis (schiet dus niet op voor een heldere bijlage :eek:), maar kan die vanavond ff plaatsen.

Mijn bedachte oplossing in het geheel is dus dat je binnen de getallen 1 t/m 26 "rondjes" moet kunnen draaien. En dat dus "heen en weer". De terugweg gaat mis bij mij omdat dan de "nul" er tussen zit (26 mod 26 = 0 en daar zou ik 26 willen zien) en daardoor de MOD functie niet goed werkt.
Hoe kan ik het dus voor elkaar krijgen dat:
(doortellen)
ROT13
1 + 13 = 14
12 + 13 = 25
22 + 13 = 9

ROT6
1 + 6 = 7
12 + 6 = 18
22 + 6 = 2

(terugtellen)
ROT13
22 - 13 = 9
12 - 13 = 25
1 - 13 = 14

ROT6
1 - 6 = 21
12 - 6 = 6
22 - 6 = 16

Via IF structuren heb ik dit geregeld. Waarmee ik wil zeggen dat ik puur zoek naar het "rondjes draaien" in die getallen van 1 t/m 26...
De oplossing is nodig voor VBA, maar als er een formule-kunstenaar is die die gedaan krijgt is dat óók gaaf natuurlijk.

P.s. voor de liefhebbers hierbij nog een URL naar een site met een voorbeeld voor het ROT cipher systeem
 
Laatst bewerkt:
Ik snap nooit het probleem dat mensen hebben met nul. Waarom MOET 'A' 1 zijn? Er is een reden waarom nagenoeg alle programmeertalen (waaronder VBA op standaard settings) "nul-based" zijn.

PS: ROT-13 is zo populair omdat je nooit terug hoeft te tellen natuurlijk. ROT-13 toepassen op ROT-13 geeft het originele bericht. Dat is juist de "grap": als je het bericht opnieuw codeert krijg je het origineel.
 
Wellicht behulpzaam:
Gevonden op het WWW:
https://codereview.stackexchange.com/questions/118247/simple-caesar-cipher-function

Code:
Public Function CaesarCipher(ByVal TextToEncrypt As String, ByVal CaesarShift As Long) As String

    Dim OutputText As String
    TextToEncrypt = UCase(TextToEncrypt)

    If CaesarShift > 26 Then
        CaesarShift = CaesarShift Mod 26
    End If

    If CaesarShift = 0 Then
        OutputText = TextToEncrypt
    ElseIf CaesarShift > 0 Then
        OutputText = ShiftRight(TextToEncrypt, CaesarShift)
    Else
        CaesarShift = Abs(CaesarShift)
        OutputText = ShiftLeft(TextToEncrypt, CaesarShift)
    End If

    CaesarCipher = OutputText
End Function

Private Function ShiftRight(ByVal ShiftString As String, ByVal ShiftQuantity As Long) As String

    Dim TextLength As Long
    TextLength = Len(ShiftString)

    Dim CipherText As String
    Dim CharacterCode As Long
    Dim AsciiIndex As Long
    Dim AsciiIdentifier() As Long
    ReDim AsciiIdentifier(1 To TextLength)

    For AsciiIndex = 1 To TextLength
        CharacterCode = Asc(Mid(ShiftString, AsciiIndex, 1))
        If CharacterCode + ShiftQuantity > 90 Then
            CharacterCode = CharacterCode - 26 + ShiftQuantity
        ElseIf CharacterCode = 32 Then GoTo Spaces
        Else:  CharacterCode = CharacterCode + ShiftQuantity
        End If
Spaces:
        AsciiIdentifier(AsciiIndex) = CharacterCode
    Next

        For AsciiIndex = 1 To TextLength
            CipherText = CipherText & Chr(AsciiIdentifier(AsciiIndex))
        Next
    ShiftRight = CipherText
End Function


Private Function ShiftLeft(ByVal ShiftString As String, ByVal ShiftQuantity As Long) As String

    Dim TextLength As Long
    TextLength = Len(ShiftString)

    Dim CipherText As String
    Dim CharacterCode As Long
    Dim AsciiIndex As Long
    Dim AsciiIdentifier() As Long
    ReDim AsciiIdentifier(1 To TextLength)

    For AsciiIndex = 1 To TextLength
        CharacterCode = Asc(Mid(ShiftString, AsciiIndex, 1))
        If CharacterCode = 32 Then GoTo Spaces
        If CharacterCode - ShiftQuantity < 65 Then
            CharacterCode = CharacterCode + 26 - ShiftQuantity
        Else: CharacterCode = CharacterCode - ShiftQuantity
        End If
Spaces:
        AsciiIdentifier(AsciiIndex) = CharacterCode
    Next

        For AsciiIndex = 1 To TextLength
            CipherText = CipherText & Chr(AsciiIdentifier(AsciiIndex))
        Next
    ShiftLeft = CipherText
End Function
 
Laatst bewerkt:
Je moet hier en daar corrigeren met 1 op te kunnen "doortellen" en weer te kunnen beginnen op 1 in plaats van 0
((code+rotatie-1) mod 26)+1
 
Laatst bewerkt:
universele formule
Code:
=REST(getal-minimum+term;maximum-minimum+1)+minimum
term is het getal wat je erbij optelt of aftrekt

in een UDF (in lngNumber heb je de berekening al gedaan)
Code:
Option Explicit

Public Function ModA(lngNumber As Long, lngMinimum As Long, lngMaximum As Long)
'https://stackoverflow.com/questions/3057640/math-looping-between-min-and-max-using-mod
'bij negatieve getallen geeft de VBA mod-functie een andere uitkomst dan Excel REST-functie
    Dim lngRange As Long
        lngRange = lngMaximum - lngMinimum + 1
        ModA = (lngNumber - lngMinimum) Mod lngRange
        If (ModA < 0) Then
            ModA = ModA + lngRange
        End If
        ModA = ModA + lngMinimum
End Function
 

Bijlagen

  • helpmij ginger universele modulo.xls
    35,5 KB · Weergaven: 34
Laatst bewerkt:
Op basis van het algoritme Alphamax heb ik een voorbeeldje gemaakt met formules waarbij je woorden kunt encrypten en decrypten met een zelf gekozen rotatie. Dit voorbeeldje werkt alleen met woorden in kleine letters met een maximale lengte van 15 tekens, maar dat kan eenvoudig uitgebreid worden.
 

Bijlagen

  • ROT cipher rebmog.xlsx
    9,9 KB · Weergaven: 42
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan