Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: Vigenèren salaus

hunajavohveli [23.06.2004 12:36:59]

#

Vigenèren salauksen toimintaperiaate on varsin yksinkertainen. On 29*29 taulukko, johon on laitettu siis kaikki suomalaisen aakkoston kirjaimet 29 kertaa. Ne eivät kuitenkaan ole taulukossa sekaisin, vaan niillä on tietty järjestys (en osaa kuvailla sitä, mutta ohjelma piirtää taulukon, josta se käy ilmi)
Kun salataan, käydään läpi jokainen merkki salattavasta tekstistä, ja otetaan sen pariksi vastaava merkki avaimesta. (kuin kaikki avaimen merkit on käyty loppuun, aloitetaan jälleen avaimen ensimmäisestä merkistä)
Tämä kirjainpari määrää, mikä kirjain salatekstiin tulee. Avaimen kirjain määrä taulukosta rivin ja salattavan tekstin kirjain määrä taulukosta sarakkeen. Sitten vain katsotaan, mikä kirjain taulukossa on sillä kohdalla, ja lisätään se salatekstiin. Kun kaikki kirjaimet on käyty läpi, salateksti on valmis.

Luo formille yksi CommandButton ja kolme TextBoxia. (Kolmannen näistä (Text3:n) MultiLine pitää olla True)

Huom:
AutoReDraw pitää olla True jotta taulukko näkyy!
Salattavassa tekstissä saa olla vain suomalaisen aakkoston kirjaimia ja välilyöntejä. Muuten salaus bugittaa ja jokaisen väärän merkin tilalle tulee luultavasti a.

Private Sub Form_Load()

'pistetään kaikki paikoilleen
Form1.Width = 13000: Form1.Height = 9000: Form1.ScaleMode = 3
Text1.Text = "salattava teksti": Text1.Left = 600: Text1.Top = 100: Text1.Width = 220: Text1.Height = 20
Text2.Text = "avain": Text2.Left = 600: Text2.Top = 120: Text2.Width = 220: Text2.Height = 20
Command1.Caption = "Salaa": Command1.Left = 600: Command1.Top = 150: Command1.Width = 220: Command1.Height = 60
Text3.Text = "": Text3.Left = 600: Text3.Top = 220: Text3.Width = 220: Text3.Height = 100

PiirräTaulukko   'nimi kertoo kaiken

End Sub
Private Sub Command1_Click()

Static Selko As String
Static Sifferi As String
Static Avain As String
Static AvainPituus As Byte
Static Merkki As Byte
Static MKAvain As Byte

Selko = LCase(Text1.Text)   'vain pienet kirjaimet
Avain = LCase(Text2.Text)
AvainPituus = Len(Avain)

Sifferi = ""
Text3.Text = ""

'käydään selkoteksti läpi merkki merkiltä
For a = 1 To Len(Selko)
  If Mid(Selko, a, 1) <> " " Then   'jos ei ole välilyönti
    Merkki = Num(Mid(Selko, a, 1))
    MKAvain = Num(Mid(Avain, ((a - 1) Mod AvainPituus) + 1, 1))   'valitaan avaimesta oikea salausmerkki
    Sifferi = Sifferi + Char((Merkki + MKAvain) Mod 29)     'kryptaus
  Else
    Sifferi = Sifferi + " "    'jos on välilyönti
  End If
Next a

Text3.Text = Sifferi    'näytetään sifferiteksti TextBoxissa

End Sub
Function Char(ByVal Index As Integer) As String

'QB:n HoneyLibistä (oma kirjastoni) lainattu funktio
'palauttaa kirjaimen a-ö argumenteilla 0-28

Select Case Index
Case 0 To 25
  Char = Chr(Index + 97)
Case 26
  Char = "å"
Case 27
  Char = "ä"
Case 28
  Char = "ö"
End Select

End Function

Function Num(Char As String) As Byte

'HoneyLibistä tämäkin
'Char-funktion käänteisfunktio
'palauttaa indeksin 0-28 argumentiksi saadusta kirjaimesta a-ö
'ASCII-koodi ei käynyt, koska ääkköset eivät ole a-z perässä

Select Case Asc(Char)
Case 97 To 122
  Num = Asc(Char) - 97
Case 228
  Num = 27
Case 229
  Num = 26
Case 246
  Num = 28
End Select

End Function
Sub PiirräTaulukko()

Form1.ScaleMode = 3   'pikselit käyttöön

Size = 29   'taulukon koko

'taulukon piirtorutiini
For a = 0 To Size
  Line (80, a * 15 + 80)-(80 + Size * 15, a * 15 + 80)
  Line (a * 15 + 80, 80)-(a * 15 + 80, 80 + Size * 15 + 1)
Next a

Form1.ScaleMode = 4   'merkit käyttöön

Form1.CurrentX = 31
Form1.CurrentY = 2
Print "Vigenèren taulukko"

'lisätään kirjaimet taulukkoon
For b = 0 To 28
For a = 0 To 28
  Form1.CurrentX = a * 1.88 + 10.5
  Form1.CurrentY = b * 0.938 + 5.05
  Print Char((a + b) Mod 29)
Next a
Next b

'ja reunoille
For b = 0 To 28
  Form1.CurrentX = -1 * 1.88 + 10.5
  Form1.CurrentY = b * 0.938 + 5.05
  Print Char(b)
Next b

For a = 0 To 28
  Form1.CurrentX = a * 1.88 + 10.5
  Form1.CurrentY = -1 * 0.938 + 5.05
  Print Char(a)
Next a

End Sub

tnb [24.06.2004 16:40:39]

#

Viitsisikö joku tehdä intin "matolaatikkosalauksen" VB:llä. Oli käytössä sotien aikana ja vielä 80-luvulla aina Sanlan tuloon asti.

hunajavohveli [24.06.2004 16:44:02]

#

Jos saisi jostain tietää, miten sellainen toimii, niin voisinpa jossain välissä ehkä koodatakin sellaisen.

peki [24.06.2004 20:50:18]

#

Google kirjoitti:

Mikä sitten olikaan otsikon "matolaatikko"? Se on puulaatikko, jonka päällä on siirrettävät, kohtisuoraan toisiaan vastaan olevat viivaimet. Laatikon pohjalle asetetaan koodiavaimen sisältävä paperiruudukko, ja koodausta muutetaan päivittäin. Menetelmä on hidas, mutta tehokas, sillä se perustuu sattumaan. Suomalaiset käyttivät "matolaatikkoa" talvi- ja jatkosodan aikana menestyksekkäästi. Se oli niitä harvoja kryptausmenetelmiä, joita ei onnistuttu murtamaan. Niinpä Suomen rauhanehtoihin kirjattiin, että tämä Enigman voittanut salakirjoitusmenetelmä oli paljastettava.

miiro [05.01.2005 12:48:24]

#

tätähän ei voi dekoodata?

hunajavohveli [20.02.2005 13:54:51]

#

Voi kyllä, ja siinä oppaasta, mistä tuon periaatteen luin, oli myös ohjeet purkamiseen. En nyt vain tarkalleen muista, mitä kaikkea siinä piti tehdä. Kirjainten esiintymistiheydellä taisi olla kuitenkin jotain merkitystä.

miiro [14.05.2005 11:44:06]

#

Ai niin, tämähän on symmetrinen salausmenetelmä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta