Césarovou šifrou - Visual Basic Vyřešeno
Césarovou šifrou - Visual Basic Vyřešeno
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
- CZechBoY
- Master Level 9.5
- Příspěvky: 8813
- Registrován: srpen 08
- Bydliště: Brno
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: Césarovou šifrou - Visual Basic
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
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
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Re: Césarovou šifrou - Visual Basic
Caesarova šifra, posun o tři znaky:
Š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.
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)
(pravil K. H. Borovský o cenzuře internetu)
Re: Césarovou šifrou - Visual Basic
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ř: Š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.
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
Re: Césarovou šifrou - Visual Basic
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:
Šifrovací rutina:
Rutina pro dešifrování bude mít tyhle dva řádky odlišné:
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í

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)
(pravil K. H. Borovský o cenzuře internetu)
Re: Césarovou šifrou - Visual Basic
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ě...
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
Re: Césarovou šifrou - Visual Basic
Tohle mi vysvětli:
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
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)
(pravil K. H. Borovský o cenzuře internetu)
Re: Césarovou šifrou - Visual Basic
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
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
Re: Césarovou šifrou - Visual Basic
Už ti ten program něco dělá? Já ho tu neodzkouším, na Linuxu mi VB nepoběží.
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ů:
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
Š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)
(pravil K. H. Borovský o cenzuře internetu)
Re: Césarovou šifrou - Visual Basic
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
Re: Césarovou šifrou - Visual Basic
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)
(pravil K. H. Borovský o cenzuře internetu)
Re: Césarovou šifrou - Visual Basic
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.
--- 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
-
- 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