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

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
roady
Level 2.5
Level 2.5
Příspěvky: 351
Registrován: červen 09
Pohlaví: Muž
Stav:
Offline
Kontakt:

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

Příspěvekod roady » 24 dub 2012 13:05

Zdravím, potřeboval bych pomoc s Césarovou šifrou ve VB.
Naposledy upravil(a) roady dne 05 čer 2012 08:50, celkem upraveno 1 x.
KINGSTON 4GB RAM | nVIDIA GeForce GTX 560 | Intel Core2 Quad Q8400 @ 2.67GHz | LCPOWER 600W | Gigabyte GA-EP35-DS4 | SAMSUNG SpinPoint F3 1000Gb, Hitachi 500GB | W7

Reklama
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Césarovou šifrou - Visual Basic

Příspěvekod CZechBoY » 24 dub 2012 16:08

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
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Césarovou šifrou - Visual Basic

Příspěvekod faraon » 24 dub 2012 17:24

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
roady
Level 2.5
Level 2.5
Příspěvky: 351
Registrován: červen 09
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Césarovou šifrou - Visual Basic

Příspěvekod roady » 24 dub 2012 18:25

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.
Přílohy
prg.png
KINGSTON 4GB RAM | nVIDIA GeForce GTX 560 | Intel Core2 Quad Q8400 @ 2.67GHz | LCPOWER 600W | Gigabyte GA-EP35-DS4 | SAMSUNG SpinPoint F3 1000Gb, Hitachi 500GB | W7

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Césarovou šifrou - Visual Basic

Příspěvekod faraon » 25 dub 2012 00:31

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
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
roady
Level 2.5
Level 2.5
Příspěvky: 351
Registrován: červen 09
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Césarovou šifrou - Visual Basic

Příspěvekod roady » 25 kvě 2012 18:42

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ě...
KINGSTON 4GB RAM | nVIDIA GeForce GTX 560 | Intel Core2 Quad Q8400 @ 2.67GHz | LCPOWER 600W | Gigabyte GA-EP35-DS4 | SAMSUNG SpinPoint F3 1000Gb, Hitachi 500GB | W7

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Césarovou šifrou - Visual Basic

Příspěvekod faraon » 25 kvě 2012 19:37

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)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
roady
Level 2.5
Level 2.5
Příspěvky: 351
Registrován: červen 09
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Césarovou šifrou - Visual Basic

Příspěvekod roady » 25 kvě 2012 20:33

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
Naposledy upravil(a) roady dne 27 kvě 2012 15:32, celkem upraveno 1 x.
KINGSTON 4GB RAM | nVIDIA GeForce GTX 560 | Intel Core2 Quad Q8400 @ 2.67GHz | LCPOWER 600W | Gigabyte GA-EP35-DS4 | SAMSUNG SpinPoint F3 1000Gb, Hitachi 500GB | W7

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Césarovou šifrou - Visual Basic

Příspěvekod faraon » 26 kvě 2012 17:39

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 ;-)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
roady
Level 2.5
Level 2.5
Příspěvky: 351
Registrován: červen 09
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Césarovou šifrou - Visual Basic

Příspěvekod roady » 27 kvě 2012 15:54

No takhle to funguje, co mám dát místo toho UCase?
KINGSTON 4GB RAM | nVIDIA GeForce GTX 560 | Intel Core2 Quad Q8400 @ 2.67GHz | LCPOWER 600W | Gigabyte GA-EP35-DS4 | SAMSUNG SpinPoint F3 1000Gb, Hitachi 500GB | W7

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Césarovou šifrou - Visual Basic

Příspěvekod faraon » 27 kvě 2012 18:52

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ě.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
roady
Level 2.5
Level 2.5
Příspěvky: 351
Registrován: červen 09
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Césarovou šifrou - Visual Basic

Příspěvekod roady » 27 kvě 2012 21:10

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
KINGSTON 4GB RAM | nVIDIA GeForce GTX 560 | Intel Core2 Quad Q8400 @ 2.67GHz | LCPOWER 600W | Gigabyte GA-EP35-DS4 | SAMSUNG SpinPoint F3 1000Gb, Hitachi 500GB | W7


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Visual studio 2022 Příloha(y)
    od Tondaaaa » 06 říj 2024 20:03 » v Vše ostatní (sw)
    3
    3366
    od faraon Zobrazit poslední příspěvek
    08 říj 2024 19:33

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti