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 ClassHienosti toimii. Ja vielä heksadesimaalitkin. :)
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).
Heksaa voi konvertoida desimaaliksi ihan suoraan kun tökkää heksa-arvon eteen "&H" ja käyttää Val-funktiota.
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 :)
Kiva kun .net toimii vähintään 2k:ssa :(
Koodin laajuus johtuu GUI:sta, säikeistyksestä ja tiedoston avaamisesta.
Tämä oli alkuperäisesti lyhytaikainen parin päivän projekti.
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.
Siis kryptatusta tiedostosta arvaa.
Siitä johtuen, että jos salattava merkki on sama kuin avaimen merkki, niin silloin ascii koodiksi tulee 0.
Silloin loopin suoritus pysähtyy siihen...
Aihe on jo aika vanha, joten et voi enää vastata siihen.