20.1 Soubory s nastavením .ini
20.2 Šifrování pomocí XOR
20.3 Domácí Úkol
20.4 V další lekci
20.1 Soubory s nastavením .ini
Pokud chcete tvořit plnohodnotné aplikace, tak se bez těchto souborů obejdete jen těžko, soubory .ini si totiž pamatují mnohé nastavení a nejen to. Do souborů ini můžete ukládat jakékoliv textové údaje, na které si vzpomenete, například i různé jazykové modifikace vašeho programu, což je výhodné, pokud se vám překlad nechce psát přímo do kódu, zaprvé je to nepraktické a zadruhé to znemožňuje tvorbu dalších jazykových modifikací, na které vy nebo váš tým nestačí. Takto může vypadat kousek kódu ze souboru s jazyky. Toto je konkrétně z mého překladu programu WinASO.
[Font]
Name=MS Sans Serif
[Main]
Title=WinASO Optimalizátor Registrů
MenuHelp=Pomoc
Version=Verze 2.0.5
Register=Registrovat
LangError=Chyba: Nenalezen soubor "Language.ini"
TrialVersion= (Zkušební Verze)
[Clean Registry]
Title=Čistič Registrů
Description=Opraví a vyčistí registry.
OptionTitle=Prosím zvolte si možnosti čištění
OptionSelectAll=Vybrat vše
V hranatých závorkách jsou sekce, na které se odkazujete. Před znamínkem je klíč, přes který přistupujeme k hodnotě (no dejme tomu proměnná, do které se ukládá hodnota), za znamínkem rovná se je právě ona hodnota.
Pro práci se soubory ini se používají dvě základní API funkce, bez kterých se neobejdeme:
Declare Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long
To jsou ony, jsou trochu rozsáhlejší, ale umožní nám bezproblémovou práci se soubory .ini.
Jak nyní do funkcí zapisovat a jak z nich číst? Nejdříve se podívame na to, jak do nich zapisovat.
Private Sub Command1_Click()
WritePrivateProfileString "X", "roky", Text1.Text, App.Path & "\XYing.ini"
End Sub
Máme zde název funkce a v ní parametry. Parametr X nám udáva sekci v souboru, parametr roky nám udává klíč, do kterého budeme zapisovat. A parametr Text1.Text nám udává, ze kterého prvku nebo ze které proměnné budeme zapisovat do souboru ini. A poslední parametr nám udává, kam se uloží nebo kde je soubor .ini.
Funkce nám může vracet i hodnotu, pokud je hodnota 1, je vše v pořádku, pokud je hodnota jiná, je někde chyba a tu je potřeba ošetřit.
Private Sub Command1_Click()
a = WritePrivateProfileString("X", "roky", Text1.Text, App.Path & "\XYing.ini")
End Sub
Čtení z funkce:
Private Sub Command2_Click()
Dim returnstr As String * 255
GetPrivateProfileString "X", "roky", "", returnstr, 255, App.Path & "\XYing.ini"
Text1.Text = returnstr
End Sub
Tato funkce se podobá funkci předchozí, čte tedy stejnou hodnotu. Má ovšem jeden pro nás důležitý parametr, navíc to je proměnná, která se v našem případě jmenuje returnstr. V ní se vrací hodnota ze souboru ini a z ní také tuto hodnotu čteme. V názvu funkce se vrací, opět jako v předchozím případě, zpráva o úspěchu či neúspěchu funkce.
Jak jsem již předeslal, soubory ini vytvoří aplikaci profesionálnější, protože leckterý program by si měl pamatovat nastavení uživatele, ať jsou to třeba jen drobnosti. Vnitřek souboru ini by měl být čitelný i pokud jej otevřeme v poznámkovém bloku, to znamená, že bychom měli používat názvy odvozené od funkce uložené hodnoty. Pokud tedy ukládáme třeba uživatelské nastavení, tak nebude vypadat takto:
[sdfsdg]
dfdafdf=PertZ
dggdrfz=0269hhjk6
[OU]
j=Petr
p=Zahradníček
c=6550035
ale takto:
[Login]
Prihlasovaci jmeno= PetrZ
heslo=0269hhjk6
[Osobní udaje]
Jmeno=Petr
Primeni=Zahradníček
ID cislo=6550035
Samozřejmě, že pokud se ukládá třeba zmiňované heslo, je potřeba tento údaj šifrovat. A jak, to se dozvíme v další kapitole této lekce.
20.2 Šifrování pomocí XOR
XOR je sice běžný logický operátor, ale má své speciální použití, a to při šifrování textu. A to vám poslouží nejen při šifrování hesla, jak jsem uvedl v předchozí kapitole, ale třeba při šifrování celých textů, u kterých nestojíte o to, aby do nich určitá osoba nahlížela. Zde vám ukážu základní postup a princip a další ,nejspíš dokonalejší, metody nechám na vás.
A rovnou se podíváme na to, jak bude vypadat zdrojový kód, ale dříve než se podíváme na šifrování pomocí operátoru XOR, tak se podíváme na jednoduchý program, který šifruje pomocí záměny znaků o určitý počet. V následujícím případě o jednu, ale to není vhodná metoda, protože je snadno odhalitelná:
Dim Retezec As String
Dim Pismeno As String
Dim DelkaRetezce As Long
Dim VyslednyText As String
Private Sub Command1_Click()
Retezec = Text1.Text
DelkaRetezce = Len(Retezec)
For i = 1 To DelkaRetezce
Pismeno = Mid(Retezec, i, 1)
VyslednyText = VyslednyText & Chr(Asc(Pismeno) + 1)
Next i
Text1.Text = VyslednyText
VyslednyText = ""
End Sub
Private Sub Command2_Click()
Retezec = Text1.Text
DelkaRetezce = Len(Retezec)
For i = 1 To DelkaRetezce
Pismeno = Mid(Retezec, i, 1)
VyslednyText = VyslednyText & Chr(Asc(Pismeno) - 1)
Next i
Text1.Text = VyslednyText
VyslednyText = ""
End Sub
Podíváme se na princip. Je naprosto jednoduchý. Z textového souboru bereme znak po znaku, měníme ho na hodnotu ASCII a tu zvětšíme či zmenšíme a převedeme zpátky na znak. A v opačném případě postupujeme totožně, jen prohodíme znamínko.
Vypadat tedy může třeba tak, jak jsem uvedl, ale můžete ji zdokonalit třeba o heslo:
Dim Retezec As String
Dim Pismeno As String
Dim DelkaRetezce As Long
Dim VyslednyText As String
Dim Heslo As Long
Dim DelkaHesla As Byte
Dim Kriptor As Byte
Private Sub Command1_Click()
Retezec = Text1.Text
DelkaRetezce = Len(Retezec)
Heslo = InputBox("Zadejte maximálně pětimístné heslo číselné heslo", "Heslo")
DelkaHesla = Len(Heslo)
If DelkaHesla <> 5 Then
MsgBox ""zadali jste špatné heslo", , "chyba"
Else
For i = 1 To DelkaRetezce
If a = DelkaHesla Then a = 0
a = a + 1
Kriptor = Mid((Heslo), a, 1)
Pismeno = Mid(Retezec, i, 1)
VyslednyText = VyslednyText & Chr(Asc(Pismeno) + Kriptor)
Next i
Text1.Text = VyslednyText
VyslednyText = ""
End If
End Sub
Private Sub Command2_Click()
Retezec = Text1.Text
DelkaRetezce = Len(Retezec)
Heslo = InputBox("Zadejte maximálně pětimístné heslo", "Heslo")
DelkaHesla = Len(Heslo)
If DelkaHesla <> 5 Then
MsgBox "zadali jste špatné heslo", , "chyba"
Else
For i = 1 To DelkaRetezce
If a = DelkaHesla Then a = 0
a = a + 1
Kriptor = Mid(Heslo, a, 1)
Pismeno = Mid(Retezec, i, 1)
VyslednyText = VyslednyText & Chr(Asc(Pismeno) - Kriptor)
Next i
Text1.Text = VyslednyText
VyslednyText = ""
End If
End Sub
Ani tato verze není dokonalá, je to jen ukázka, jakou cestou můžete jít. Je zde mnoho neošetřených chyb. Třeba to, že vložené heslo by mělo být pouze numerické, pokud ale chcete jiné heslo, proč ne, pusťte se do práce :).
Nyní se tedy dostáváme k operátoru XOR. Teď ale budeme šifrovat a dešifrovat soubory, a to následujícím kódem. Kód je opět neošetřený, takže s ním manipulujte opatrně a pokud se vám bude chtít, můžete jej vyléčit od všech možných chyb.
Dim Retezec As String
Dim Pismeno As String
Dim Cislo As Long
Dim DelkaRetezce As Long
Dim Heslo As Long
Private Sub Command1_Click()
CommonDialog1.ShowSave
Heslo = InputBox("Vložte heslo")
Retezec = Text1.Text
DelkaRetezce = Len(Retezec)
Open CommonDialog1.FileName For Output As #1
For i = 1 To DelkaRetezce
Pismeno = Mid(Retezec, i, 1)
Print #1, Asc(Pismeno) Xor Heslo
Next i
Close #1
End Sub
Private Sub Command2_Click()
CommonDialog1.ShowOpen
Heslo = InputBox("Vložte heslo")
Open CommonDialog1.FileName For Input As #1
Retezec = ""
Do Until EOF(1)
Input #1, Cislo
Retezec = Retezec & Chr$(Cislo Xor Heslo)
Loop
Text1.Text = Retezec
Close #1
End Sub
Toto pro změnu funguje tak, že se každý znak po převedení do číselné podoby pomocí operátoru XOR uloží do souboru na nový řádek. Při čtení se postupuje tak, že se čte každý řádek zvlášť a převádí se zpátky na znak. To zajišťuje Do until EOF(1).
Všechno tohle navíc můžete skombinovat a pohrát si s tím. Vše už je jen na vás.
Ještě vám ukážu něco ohledně funkce XOR.
Print 465 Xor 85
Print (465 Xor 85) Xor 85
Print (((465 Xor 85) Xor 22) Xor 22) Xor 85
Vyzkoušejte si co z toho vznikne.
Pokud s tímto operátorem chcete pracovat v programu a ukládat šifrované hodnoty třeba do proměnných a zpátky je dešifrovat, je potřeba pro oddělení využít nějaké oddělovací značky. Stačí třeba obyčejný mezerník, který bude vložen mezi čísla.
20.3 Domácí Úkol
Za domácí úkol bude uložit šifrovaná data o programu do souboru .ini. a opět je načíst a rozšifrovat.
20.4 V další lekci
V další lekci se podíváme na některé věci, které se mi vytratily nebo nebyly potřeba či se prostě nikam jinam nehodily. Prostě by se celá příští kapitola dala pojmenovat různé či ostatní.