Stránka 1 z 2

Césarovou šifrou - Visual Basic  Vyřešeno

Napsal: 24 dub 2012 13:05
od roady
Zdravím, potřeboval bych pomoc s Césarovou šifrou ve VB.

Re: Césarovou šifrou - Visual Basic

Napsal: 24 dub 2012 16:08
od CZechBoY
1)uděláš si pole písmen
2)procházíš cyklem každé písmeno v textu, pokud narazíš na písmeno, který je větší než délka pole tak pokračuješ od začátku
3)vypíšeš překodovaný text

u dekodování to uděláš stejně, akorát budeš místo přičítání toho čísla odečítat

Re: Césarovou šifrou - Visual Basic

Napsal: 24 dub 2012 17:24
od faraon
Caesarova šifra, posun o tři znaky:

Kód: Vybrat vše

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
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C


Šifrování probíhá v tabulce shora dolů:
A=>D, H=>K, O=>R, J=>M, takže AHOJ=>DKRM.
Dešifrování je opačný proces, zdola nahoru.

Postup šifrování:
1. Uložíš text do řetězce.
2. Ve smyčce bereš jedno písmeno po druhém.
3. Ověříš jestli je to znak v intervalu A..Z nebo a..z, znaky mimo tyhle oblasti ignoruješ (přeskočíš body 4-6).
4. Zjistíš ASCII kód znaku, je-li větší než 97, odečteš 32 (tím převedeš malá písmena na velká).
5. Ke kódu přičteš zadaný posun, vyjde-li číslo větší než 90 (kód písmene Z), odečteš 26.
6. Výslednou hodnotu převedeš na znak.
7. Zobrazíš znak.

Dešifrování se liší pouze v jednom bodě:
5. Od kódu odečteš zadaný posun, vyjde-li číslo menší než 65 (kód písmene A), přičteš 26.

Je jenom na tobě, jestli použiješ dvě samostatné rutiny pro šifrování a dešifrování, nebo jednu s větvením podle potřeby. V druhém případě máš dokonce víc možností jak řešení implementovat.

Tenhle způsob je rychlejší než vyhledávání znaku v poli, ale nemůžeš ho použít pro "zpřeházenou" abecedu, kde písmena nejdou za sebou, nebo jsou kombinované s číslicemi a jinými znaky.

Re: Césarovou šifrou - Visual Basic

Napsal: 24 dub 2012 18:25
od roady
No, já chápu jak tu funguje a jak by to mělo vypadat, ale neumím to napsat. Nepomůžeš mi aspoň jak začít? Mám to takhle, a nevím jak dál. A ještě když to má být takto
Př: Šifrované slovo: Kolik
Šifra: 12
Zašifrované slovo: Lqmkl
Kdyby jen o tu jedničku, ale o 1 a pak o 2 nevím jak udělat.

Re: Césarovou šifrou - Visual Basic

Napsal: 25 dub 2012 00:31
od faraon
No, já VisualBasic neumím (a ani nechci, je to jeden z nejodpornějších jazyků jaké jsem viděl), ale ty příkazy mi místy připomínají starý QuickBasic, tak se pokusím o něco přibližného.
Ten klíč mi není úplně jasný, to se má jako opakovaně posouvat dvakrát za sebou? To ten kdo to vymyslel o šifrování moc neví ;-) Zadáváš to tam jako dvoumístné číslo, tak bys mohl provést postupně (int(posun/10)) a (posun mod 10), nebo posunout jednou o ciferný součet, nebo úplně jinak.
A dal bych ta tlačítka vedle sebe, takhle:

Kód: Vybrat vše

Text     [                       ]
Klíč     [                       ]
         [Zašifrovat] [Dešifrovat]
Výsledek [                       ]


Šifrovací rutina:

Kód: Vybrat vše

vysledek=text
while (posun>0)
      for i=1 to len(vysledek)
          znak=asc(mid(vysledek,i,1))
          if ((znak>=65 and znak<=90) or (znak>=97 and znak<=122)) then
             if (znak>90) then znak=znak-32
             znak=znak+(posun mod 10)
             if (znak>90) then znak=znak-26
          end if
          mid(vysledek,i)=chr(znak)
      next i
      posun=posun/10
wend


Rutina pro dešifrování bude mít tyhle dva řádky odlišné:

Kód: Vybrat vše

             znak=znak-(posun mod 10)
             if (znak<65) then znak=znak+26

Re: Césarovou šifrou - Visual Basic

Napsal: 25 kvě 2012 18:42
od roady
No každopádně mi to nefunguje :(

Dim vstup As String
Dim vystup As String
Dim i As Long
Dim znak As String
Dim posun As Long

posun = UCase(text2.Text)
vstup = UCase(text1.Text)
text3.Text = vystup
vystup = ""
For i = 1 To Len(vstup)
znak = Mid(vstup, i, 1)
If znak >= "A" And znak <= "Z" Then
znak = Chr(Asc(znak) + 3)
If znak > "Z" Then znak = Chr(Asc(znak) - 26)
End If
vystup = vystup & znak
Next i

Nevím co tam mám špatně...

Re: Césarovou šifrou - Visual Basic

Napsal: 25 kvě 2012 19:37
od faraon
Tohle mi vysvětli:

Kód: Vybrat vše

Dim posun As Long

posun = UCase(text2.Text)


Podle mě je posun číselná proměnná, a (co si vzpomínám z QBasicu) UCase je převod na velká písmena. Takže se pokoušíš přiřadit řetezec jako číslo bez nějakého převodu? V BASICu na tohle existovala funkce VAL.

A o kus dál máš ten posun zase zadaný jako konstantu:

Kód: Vybrat vše

znak = Chr(Asc(znak) + 3)

Re: Césarovou šifrou - Visual Basic

Napsal: 25 kvě 2012 20:33
od roady
Ok, takže takhle?

Private Sub Command1_Click()
Dim vstup As String
Dim vystup As String
Dim i As Long
Dim znak As String
Dim posun As Long

posun = Val(text2.Text)
vstup = text1.Text
vystup = ""
For i = 1 To Len(vstup)
znak = Mid(vstup, i, 1)
If znak >= "A" And znak <= "Z" Then
znak = Chr(Asc(znak) - posun)
If znak > "Z" Then znak = Chr(Asc(znak) - 26)
End If
vystup = vystup & znak
Next i
text3.Text = vystup

End Sub

Private Sub Command2_Click()
Dim vstup As String
Dim vystup As String
Dim i As Long
Dim znak As String
Dim posun As Long

posun = Val(text2.Text)
vstup = text1.Text
vystup = ""
For i = 1 To Len(vstup)
znak = Mid(vstup, i, 1)
If znak >= "A" And znak <= "Z" Then
znak = Chr(Asc(znak) + posun)
If znak > "Z" Then znak = Chr(Asc(znak) - 26)
End If
vystup = vystup & znak
Next i
text3.Text= vystup

--- Doplnění předchozího příspěvku (25 Kvě 2012 20:35) ---

Ještě bych potřeboval poradit jak udělám tohle
Šifrované slovo:
Kolik
Šifra: 12
Zašifrované slovo: Lqmkl
V tom posunu

Re: Césarovou šifrou - Visual Basic

Napsal: 26 kvě 2012 17:39
od faraon
Už ti ten program něco dělá? Já ho tu neodzkouším, na Linuxu mi VB nepoběží.

Šifrované slovo:
Kolik
Šifra: 12
Zašifrované slovo: Lqmkl

Tohle jsi mi měl ukázat hned, podle toho bych pochopil co se tím myslí! Z toho tvého popisu se to fakt nedalo uhádnout že se má ten posun dělat na střídačku, lichá písmena o jeden a sudá o dva znaky...

Ale pokud používáš funkci UCase, tak se ti ten text celý převede na velká písmena, takže Kolik bude LQMKL. Jestli chceš zachovat velikost, musíš buď ohlídat obě skupiny písmen A..Z i a..z zvlášť, nebo pracovat s celou sadou tisknutelných znaků, což je 32..255, ale někde se nedají použít znaky 127 a občas i 255.
Abys zjistil co všechno se ti podaří zobrazit, nech si vypsat tabulku znaků:

Kód: Vybrat vše

for i=32 to 255
    print chr$(i);" ";
    if (i mod 16 = 15) then print
next i


Ten zdroják příště označ tlačítkem (Code), ať se zachová formátování a je to přehlednější, abych to nemusel luštit přes HTML kód stránky ;-)

Re: Césarovou šifrou - Visual Basic

Napsal: 27 kvě 2012 15:54
od roady
No takhle to funguje, co mám dát místo toho UCase?

Re: Césarovou šifrou - Visual Basic

Napsal: 27 kvě 2012 18:52
od faraon
Nedávej tam nic ať zůstane velikost jaká je, ale budeš muset řešit zvlášť velká a zvlášť malá písmena, a navíc z toho druhého okénka získat posun1 a posun2, a těmi šifrovat střídavě.

Re: Césarovou šifrou - Visual Basic

Napsal: 27 kvě 2012 21:10
od roady
No když tam nedám nic, tak se změní jen první písmeno a ostatní zůstanou.

--- Doplnění předchozího příspěvku (27 Kvě 2012 21:13) ---

Na netu jsem našel kod k té šifře, je tam to char1 a 2, ale nevím jak to mám použít u toho mého.

Kód: Vybrat vše

  Function EncryptDecrypt(ByVal text1 As String, ByVal key As String, ByVal isEncrypt As Boolean) As String
        Dim char1 As String 'primo carattere del testo da cifrare/decifrare
        Dim char2 As String 'carattere cifrato/decifrato
        Dim cKey As Byte 'cifra chiave
        'lunghezza stringa da cifrare/decifrare
        Dim strLength As Integer
        Dim Result As String = "" 'risultato finale
        Dim j As Integer = -1
        If text1 <> "" And IsNumeric(key) Then
            strLength = text1.Length
            For i As Integer = 0 To strLength - 1
                char1 = text1.Substring(i, 1) 'estrae carattere
                If j < key.Length - 1 Then
                    j = j + 1
                Else
                    j = 0
                End If
                cKey = Val(key.Substring(j, 1))
                If isEncrypt Then 'se voglio cifrare il testo
                   If (Asc(char1) + cKey) > 255 Then
                        char2 = Chr(Asc(char1) + cKey - 255)
                   Else
                        char2 = Chr(Asc(char1) + cKey)
                   End If
                Else
                    If (Asc(char1) - cKey) < 1 Then
                        char2 = Chr(Asc(char1) - cKey + 255)
                    Else
                        char2 = Chr(Asc(char1) - cKey)
                    End If
                End If
                Result &= char2
            Next
        Else
            MsgBox("Enter text or key!")
        End If
        Return Result
    End Function