Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB.NET: Xor kryptaaja

Sivun loppuun

peki [23.06.2004 17:10:20]

#

Tämä vinkki on siis xor kryptaaja.
Se kryptaa xor algoritmillä tekstin.
Vinkki sisältää nopean tiedoston luvun ja säikeistyksen.
Se xoraa tekstin, jonka jälkeen muuttaa koodatun merkin 2 merkkiseksi heksakoodiksi.
Koodi on (vaihteeksi) hyvin kommentoitua, joten tässä en ala sitä tämän enempää selittämään.

Edit: Exe löytyy: http://koti.mbnet.fi/peku1/Salaaja.exe

Public Class frmSalaaja
    Inherits System.Windows.Forms.Form

    Dim operaatio As Threading.Thread

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.
    'Do not modify it using the code editor.
    Friend WithEvents txtSalattava As System.Windows.Forms.TextBox
    Friend WithEvents txtAvain As System.Windows.Forms.TextBox
    Friend WithEvents cmdSalaa As System.Windows.Forms.Button
    Friend WithEvents rbSalaa As System.Windows.Forms.RadioButton
    Friend WithEvents rbPura As System.Windows.Forms.RadioButton
    Friend WithEvents prgBar As System.Windows.Forms.ProgressBar
    Friend WithEvents lblAvain As System.Windows.Forms.Label
    Friend WithEvents mnuMenu As System.Windows.Forms.MainMenu
    Friend WithEvents mnuItemTiedosto As System.Windows.Forms.MenuItem
    Friend WithEvents mnuItemOpen As System.Windows.Forms.MenuItem
    Friend WithEvents mnuItemSave As System.Windows.Forms.MenuItem
    Friend WithEvents MnuSeparator1 As System.Windows.Forms.MenuItem
    Friend WithEvents mnuItemEnd As System.Windows.Forms.MenuItem
    Friend WithEvents OFD As System.Windows.Forms.OpenFileDialog
    Friend WithEvents SFD As System.Windows.Forms.SaveFileDialog
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.txtSalattava = New System.Windows.Forms.TextBox()
        Me.txtAvain = New System.Windows.Forms.TextBox()
        Me.cmdSalaa = New System.Windows.Forms.Button()
        Me.rbSalaa = New System.Windows.Forms.RadioButton()
        Me.rbPura = New System.Windows.Forms.RadioButton()
        Me.lblAvain = New System.Windows.Forms.Label()
        Me.prgBar = New System.Windows.Forms.ProgressBar()
        Me.mnuMenu = New System.Windows.Forms.MainMenu()
        Me.mnuItemTiedosto = New System.Windows.Forms.MenuItem()
        Me.mnuItemOpen = New System.Windows.Forms.MenuItem()
        Me.mnuItemSave = New System.Windows.Forms.MenuItem()
        Me.MnuSeparator1 = New System.Windows.Forms.MenuItem()
        Me.mnuItemEnd = New System.Windows.Forms.MenuItem()
        Me.OFD = New System.Windows.Forms.OpenFileDialog()
        Me.SFD = New System.Windows.Forms.SaveFileDialog()
        Me.SuspendLayout()
        '
        'txtSalattava
        '
        Me.txtSalattava.Multiline = True
        Me.txtSalattava.Name = "txtSalattava"
        Me.txtSalattava.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
        Me.txtSalattava.Size = New System.Drawing.Size(592, 424)
        Me.txtSalattava.TabIndex = 0
        Me.txtSalattava.Text = ""
        '
        'txtAvain
        '
        Me.txtAvain.Location = New System.Drawing.Point(64, 432)
        Me.txtAvain.Name = "txtAvain"
        Me.txtAvain.Size = New System.Drawing.Size(328, 20)
        Me.txtAvain.TabIndex = 1
        Me.txtAvain.Text = ""
        '
        'cmdSalaa
        '
        Me.cmdSalaa.Location = New System.Drawing.Point(400, 432)
        Me.cmdSalaa.Name = "cmdSalaa"
        Me.cmdSalaa.Size = New System.Drawing.Size(64, 24)
        Me.cmdSalaa.TabIndex = 2
        Me.cmdSalaa.Text = "Aloita"
        '
        'rbSalaa
        '
        Me.rbSalaa.Checked = True
        Me.rbSalaa.Location = New System.Drawing.Point(472, 432)
        Me.rbSalaa.Name = "rbSalaa"
        Me.rbSalaa.Size = New System.Drawing.Size(104, 16)
        Me.rbSalaa.TabIndex = 3
        Me.rbSalaa.TabStop = True
        Me.rbSalaa.Text = "Salaa"
        '
        'rbPura
        '
        Me.rbPura.Location = New System.Drawing.Point(472, 456)
        Me.rbPura.Name = "rbPura"
        Me.rbPura.Size = New System.Drawing.Size(104, 16)
        Me.rbPura.TabIndex = 4
        Me.rbPura.Text = "Pura"
        '
        'lblAvain
        '
        Me.lblAvain.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.lblAvain.Location = New System.Drawing.Point(8, 432)
        Me.lblAvain.Name = "lblAvain"
        Me.lblAvain.Size = New System.Drawing.Size(56, 24)
        Me.lblAvain.TabIndex = 5
        Me.lblAvain.Text = "Avain:"
        '
        'prgBar
        '
        Me.prgBar.Location = New System.Drawing.Point(8, 464)
        Me.prgBar.Name = "prgBar"
        Me.prgBar.Size = New System.Drawing.Size(440, 16)
        Me.prgBar.TabIndex = 6
        '
        'mnuMenu
        '
        Me.mnuMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuItemTiedosto})
        '
        'mnuItemTiedosto
        '
        Me.mnuItemTiedosto.Index = 0
        Me.mnuItemTiedosto.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuItemOpen, Me.mnuItemSave, Me.MnuSeparator1, Me.mnuItemEnd})
        Me.mnuItemTiedosto.Text = "&Tiedosto"
        '
        'mnuItemOpen
        '
        Me.mnuItemOpen.Index = 0
        Me.mnuItemOpen.Text = "&Avaa"
        '
        'mnuItemSave
        '
        Me.mnuItemSave.Index = 1
        Me.mnuItemSave.Text = "&Tallenna"
        '
        'MnuSeparator1
        '
        Me.MnuSeparator1.Index = 2
        Me.MnuSeparator1.Text = "-"
        '
        'mnuItemEnd
        '
        Me.mnuItemEnd.Index = 3
        Me.mnuItemEnd.Text = "Lopeta"
        '
        'OFD
        '
        Me.OFD.Filter = "All Files|*.*"
        '
        'SFD
        '
        Me.SFD.FileName = "doc1"
        Me.SFD.Filter = "All Files|*.*"
        '
        'frmSalaaja
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(592, 489)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.prgBar, Me.lblAvain, Me.rbPura, Me.rbSalaa, Me.cmdSalaa, Me.txtAvain, Me.txtSalattava})
        Me.Menu = Me.mnuMenu
        Me.Name = "frmSalaaja"
        Me.Text = "Salaaja"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub cmdSalaa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSalaa.Click
        If cmdSalaa.Text = "Pysäytä" Then
            ' jos nappi on pysäytä...
            ' ...pysäytetään
            ' Tappo käsittelijässä valmina napin tekstin vaihto
            operaatio.Abort()
        ElseIf cmdSalaa.Text = "Aloita" Then
            ' tekstinä oli aloita. Aloitetaan siis :)
            ' vrmistetaan, että säie on tapettu
            operaatio.Abort()
            ' uusi säie
            operaatio = New Threading.Thread(AddressOf Operoi)
            'alotetaan se
            operaatio.Start()
            ' laitetaan "pysäytä" napin tekstiksi
            cmdSalaa.Text = "Pysäytä"
        End If
    End Sub

    Private Sub mnuItemEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemEnd.Click
        End ' lopetus (turha kommenteeraus)
    End Sub

    Private Sub mnuItemOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemOpen.Click
        ' bufferi, jonne tungetaan merkit
        Dim buf() As Char
        ' filu
        Dim f As System.IO.File

        ' jos halutaan avata filu
        If OFD.ShowDialog() = DialogResult.OK Then
            ' varmuuden vuoksi
            If f.Exists(OFD.FileName) = False Then
                MsgBox("Tiedostoa ei ole olemassa.", MsgBoxStyle.Critical, "Virhe!")
                Exit Sub
            End If
            ' virran lukija
            Dim mystream As System.IO.StreamReader
            Try
                ' Avataan uusi tiedostovirta
                Dim fs As System.IO.FileStream = New System.IO.FileStream(OFD.FileName, IO.FileMode.Open)
                mystream = New System.IO.StreamReader(fs)
                ' luetaan filu
                ReDim buf(fs.Length)
                mystream.Read(buf, 0, fs.Length) ' nopein lukufunktio
            Catch IOExcep As IO.IOException
                ' Joku io virhe...
                MsgBox(IOExcep.Message)
            Finally
                mystream.Close() ' suljetaan filu
            End Try
            ' laitetaan filun teksti ruudulle
            txtSalattava.Text = buf
        End If
    End Sub

    Private Sub mnuItemSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItemSave.Click
        Dim f As System.IO.File

        If SFD.ShowDialog() = DialogResult.OK Then
            Dim mystream As System.IO.StreamWriter
            Try
                mystream = f.AppendText(SFD.FileName) ' uusi virta
                'kirjotetaan
                mystream.Write(txtSalattava.Text)
            Catch IOExcep As IO.IOException
                ' Joku io virhe...
                MsgBox(IOExcep.Message)
            Finally
                mystream.Close() ' suljetaan filu
            End Try
        End If
    End Sub

    Private Sub Operoi()
        ' virheen käsittelijä, pakko olla, jotta voitaisiin tehdä tarvittavat toimenpiteet, kun säie tapetaan
        Try
            ' ettei paikat tyhjinä
            If txtAvain.Text <> "" And txtSalattava.Text <> "" Then
                Dim i, j As Long
                Dim salattu As String
                Dim prg As Double
                Dim z As Long
                ' jos salataan...
                If rbSalaa.Checked = True Then
                    ' kelataan koko teksti läpi ja stepataan aina avaimen pituinen matka
                    For i = 0 To txtSalattava.TextLength - 1 Step txtAvain.TextLength
                        ' kelataan läpi tekstin pätkä avaimella
                        For j = 0 To txtAvain.TextLength - 1
                            ' jos ylittää, niin lopetetaan
                            If i + j > txtSalattava.TextLength - 1 Then GoTo loppu

                            Dim a, b, c As Byte
                            ' salattava kirjain
                            a = Asc(txtSalattava.Text.Substring(i + j, 1))
                            ' koodi
                            b = Asc(txtAvain.Text.Substring(j, 1))
                            ' salaus
                            c = a Xor b

                            ' hexataan se 2 merkkiseksi pätkäksi :P
                            If c < 16 Then
                                salattu &= "0" & Hex(c)
                            Else
                                salattu &= Hex(c)
                            End If

                            ' päivitetään progressbaaria
                            z += 1
                            prg = z / txtSalattava.TextLength * 100
                            prgBar.Value = CInt(prg)
                        Next
                    Next
                Else
                    ' avataan
                    ' stepataan taas avaimen pituus
                    For i = 0 To txtSalattava.TextLength - 1 Step txtAvain.TextLength
                        ' kelataan pätkä läpi
                        For j = 0 To txtAvain.TextLength - 1

                            ' tsekataan, ettei mennä yli tekstin
                            If i * 2 + j * 2 > txtSalattava.TextLength - 2 Then GoTo loppu

                            Dim a, b, c As Integer
                            ' napataan ja dekoodataan desimaaleiksi 2 merkkinen heksapätkä
                            a = Hex2Dec(txtSalattava.Text.Substring(i * 2 + j * 2, 2))
                            ' napataan avainmerkki
                            b = Asc(txtAvain.Text.Substring(j, 1))
                            ' dekoodaus
                            c = a Xor b

                            ' lisätään stringiin merkki, jonka ascii on c
                            salattu &= Chr(c)

                            ' päivitetään progressi
                            z += 2
                            prg = z / txtSalattava.TextLength * 100
                            prgBar.Value = CInt(prg)
                        Next
                    Next
                    ' sori gotoa.
Loppu:
                    txtSalattava.Text = salattu
                End If
            Else
                MsgBox("Ei tyhjiä kenttiä. Kiitos!", MsgBoxStyle.Exclamation, "Virhe!")
            End If
            ' nollataan progressi ja säädetään tekstiksi aloita
            prgBar.Value = 0
            cmdSalaa.Text = "Aloita"
        Catch ex As Threading.ThreadAbortException
            ' Älä tee muuta, kuin nollaa progress baari. Säie vaan tapettiin
            prgBar.Value = 0
            cmdSalaa.Text = "Aloita"
        Catch
            ' joku virhe. Ihan sama mikä.
            MsgBox("Virhe havaittu!", MsgBoxStyle.Critical, "Virhe!")
        End Try
    End Sub

    ' tämä on sellaista purkkaa, ettei kannata lukea.
    ' tätä koodia varten räätälöity suht nopea hexa konvertteri
    Private Function Hex2Dec(ByVal hex As String) As Integer
        ' tarvitaan vain 2 merkkisiä lukuja
        Dim osa As Char
        Dim luku As Integer
        osa = hex.Chars(0)
        Select Case osa
            Case "0" To "9"
                luku = Val(osa) * 16
            Case "A"
                luku = 10 * 16
            Case "B"
                luku = 11 * 16
            Case "C"
                luku = 12 * 16
            Case "D"
                luku = 13 * 16
            Case "E"
                luku = 14 * 16
            Case "F"
                luku = 15 * 16
        End Select
        osa = hex.Chars(1)
        Select Case osa
            Case "0" To "9"
                luku += Val(osa)
            Case "A"
                luku += 10
            Case "B"
                luku += 11
            Case "C"
                luku += 12
            Case "D"
                luku += 13
            Case "E"
                luku += 14
            Case "F"
                luku += 15
        End Select

        Return luku
    End Function
End Class

hunajavohveli [23.06.2004 19:03:41]

#

Hienosti toimii. Ja vielä heksadesimaalitkin. :)

tsuriga [23.06.2004 20:43:45]

#

Harmi vain, että itse salaus pitää kaivaa GUIn ja muun säädön joukosta (mutta niinhän se yleensä on jos halutaan jotain suoraan toimivaa).

thefox [23.06.2004 23:09:55]

#

Heksaa voi konvertoida desimaaliksi ihan suoraan kun tökkää heksa-arvon eteen "&H" ja käyttää Val-funktiota.

nomic [25.06.2004 03:18:37]

#

näyttää kivalta, kunpa itelläkin olisi tuo .net jo, pitäisi tilata se heti kun taas rahaa joku taikoisi mulle

ihmettelin vain koodin pituutta, muistaakseni olin näkevinäni täällä jossain "normi" vb:lle xor-kryptauksen joka oli kummiskin pelkkä funktio, mutta vie verrattavissa reilusti vähemmän tilaa, en sitten tiedä pohjautuuko tämä koodin laajentuminen .net:istä vaiko tavastasi koodata, mutta kryptays-leluja on aina mukava tutkia, lisää vain, kunpa tämän saisi jotenkin vb:lle niin voisin itsekin kommentoida itse ohjelmaa :)

sooda [25.06.2004 13:04:24]

#

Kiva kun .net toimii vähintään 2k:ssa :(

peki [25.06.2004 13:04:30]

#

Koodin laajuus johtuu GUI:sta, säikeistyksestä ja tiedoston avaamisesta.
Tämä oli alkuperäisesti lyhytaikainen parin päivän projekti.

water flea [26.06.2004 20:03:40]

#

Miksi noi laitetaan hexana kun kerran kaksimerkkinen hexaluku vastaa yhtä merkkiä?
Toi aiheuttaa ainoastaan sen että tiedostosta arvaa että se on kryptattu kun sitä lukee.

water flea [26.06.2004 20:04:47]

#

Siis kryptatusta tiedostosta arvaa.

peki [26.06.2004 22:25:11]

#

Siitä johtuen, että jos salattava merkki on sama kuin avaimen merkki, niin silloin ascii koodiksi tulee 0.
Silloin loopin suoritus pysähtyy siihen...


Sivun alkuun

Vastaus

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

Tietoa sivustosta