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
Hienosti 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.