Helaas, ondertussen verdwenen ..
“Video niet beschikbaar”
Als ik een tabel op het scherm zet (in de vorm van gridview, tableview, ..) ga ik ze meestal eerst initialiseren.
Bij het openen van het scherm Form_Open() roep ik de initialisatieprocedures aan, wat overzichtelijk is:
Public Sub Form_Open()
'
initGridImport()
init...
'
End
En als je later in je toepassing nieuwe inhoud moet weergeven kan je de init terug aanroepen om zeker te zijn dat alle vorige weergave weg is en de tabel terug goedstaat.
Ook de naamgeving van de kolomtitels of hoofden kan je in die init doen, dan vind je ze ook gemakkelijk terug. Ik ben onlangs begonnen met de kolomtitels omgekeerd te vullen zodat
– het aantal kolommen en de invulling ervan op een overzichtelijke manier aftelt; een anomalie valt sneller op.
– het gemakkelijker is er één toe te voegen nadien; bovenaan waar je het aantal wijzigt heb je onmiddellijk eronder de nieuwe kolomtitel.
Public Sub initGridImport()
' shows imported record id's and values
grvwImported.Header = GridView.Horizontal
grvwImported.Columns.Count = 4
grvwImported.Columns[3].Text = "values"
grvwImported.Columns[2].Text = "col-id"
grvwImported.Columns[1].Text = "ref-id"
grvwImported.Columns[0].Text = "id"
'
End
En onmiddellijk de kolombreedte is handig omdat je daar weet over welke kolommen het gaat:
grvwImported.Columns[3].Text = "values"
grvwImported.Columns[3].Width = 120
Het instellen van het aantal rijen kan je er ook doen, maar dikwijls zal je dat herhalen bij het hervullen, wat niet moet voor bv de kolomtitels.
grvwImported.Rows.Count = 0
' etc...
Misschien maak je een resetGridImport() waar dat inkomt.
In Gambas3 is een rapportgenerator of “reportdesigner” beschikbaar, waarmee je snel een af te drukken rapport (één of meer blz) mee kan maken, en eerst in preview kan bekijken.
(zie ook “Rapportgenerator 2 : Rapport met velden uit een databank“)
De component
Menu project, properties, Components: gb.report2
(ik heb hier in mijn omstandigheden ook gb.form, gb.gui en gb.image aangevinkt staan)
Gevolg hiervan is dat je een extra menu-item krijgt bij het aanmaken van een nieuw “source” object naast Module, Class en Form. In de linkse kolom bij je project bestanden-overzicht klik je rechts (bv op sources), en je ziet onderaan nu een nieuw item “Report” met printericoon. Als je dat aanklikt krijg je een “New File” met te kiezen/in te vullen naam (standaard “Report1”).
Je krijgt dan een tab met Report1.report.
Rapport vullen
Je kan op de rapport-layout elementen zetten die je kiest onderaan uit een menu: bv ReportLabel, ReportTextLabel, ReportLine, ReportImage, ReportSVGImage, ReportDrawingArea, enz. Je kan ze vullen met inhoud (tekst, beeld), en de eigenschappen wijzigen zoals een rand eromheen, schaduw, achtergrondkleur, je kan afgeronde hoeken maken, enz.
Voor de plaatsing op het scherm moet je bij elk object zelf de eigenschap van marges invullen. Een object dat in het midden staat kan je laten uitdijen om het blad te vullen door de eigenschap “Expand” op TRUE te zetten; het duwt dan de acherliggende objecten naar beneden.
Run
Normaal heb je een klasse “FMain”, de Form die standaard gestart wordt; je kan daar in de broncode zetten:
Public Sub Form_Open()
Report1.Preview()
End
Bekijken
Als je links op je Source “Report1” rechtslikt, kan je “run that class” kiezen, waarna je een voorbeeld krijgt van hoe het rapport eruitziet, zonder je hele programma te starten. Deze Report Preview laat nog toe zaken te kiezen als de printer waar het naartoe moet, de orientatie, formaat, enz.
Ook of het in grijswaarden gedrukt wordt of in kleur (Grayscale afvinken). En het aantal kopies. Om effectief iets te laten gebeuren als je op de onderste “Print” knop duwt, moet je ook het bereik (“Range”) op minstens 1 zetten.
Extra knop
Aangezien je tijdens het maken van zo’n print-layout waarschijnlijk dikwijls gaat kijken naar het voorbeeld, is het handig om de “run that class” onder een knop te hebben in de report designer. Dat kan; rechtsklik op de knoppenbalk van de reportdesigner en kies “Configure”; Je krijgt de “form toolbar configuration” en daar sleep je de “Run that class” knop naar de knoppenbalk; hij krijgt een “run” achtig icoon.
Bestand
In datzelfde preview scherm kan je ook bovenaan het tabblad veranderen van “Printer” naar “File”, waarmee de bestandsnaamkeuze zichtbaar wordt, en het bij “Print” als pdf bestand bewaard wordt.
Demo
Als je dit alles in sneltreinvaart wil zien demonstreren, kijk dan naar dit filmpje van Fabien Bodard: (muiscursor op de pauzeknop klaarhouden …)
https://www.youtube.com/watch?v=h1yUhcoErjs
Na een update van een record in de databank via Gambas3 code, krijg ik in een aantal velden getallen als 101, 102, 103, 104.
Het is me niet duidelijk waar de ingevulde getallen vandaan komen, maar ze hebben wel exact hetzelfde begin als de toegekende id!
Bv
id is 9 –> velden worden 90, 91, 92, …
id is 10 –> velden worden 100, 101, 102, …
De id wordt gebruikt in het statement dat de update doet.
Het lijkt alsof in de sequentie ” veldG=&10, veldH=&11, veldI=&12 ” de &1 onmiddellijk ingevuld wordt (en daarin wordt net die id gegeven), en de rest van het getal er gewoon aangeplakt wordt.
In mijn geval werd in &1 de record id gegeven waarop het record geselecteerd wordt:
… WHERE id =&1
Oplossing:
In de reeks “it’s not a bug, it’s a feature”:
http://gambaswiki.org/wiki/doc/gb2togb3
Blijkbkaar is het vanaf Gambas versie 3 nodig om de parameters boven 9 tussen accolades te zetten:
SQL errors with database methods Arguments of DB.Exec() and DB.Subst() above nine now must be enclosed with {} now.
Dus de parameters boven 9 moeten speciaal aangeduid worden:
veldG=&{10}, veldH=&{11}, veldI=&{12}
Of zoals in de wiki:
MyConnection.Exec("UPDATE devices "
"SET name = &1, module = &2, "
"interface = &3, address = &4, "
"location = &5, label = &6, "
"label2 = &7, label3 = &8, "
"value = &9, officon = &{10}, "
"onicon = &{11}")
Zie ook linuxuser.copyleft.be (Reeks Git – handboek (nl) – commando’s vb – branch, merge – GitLab vb – git en gambas)
Hoe Git gebruiken met Gambas?
Een nieuw project “ProjectToTrack” is net aangemaakt. We weten dat de broncode in .src/ zit (source). Verder heeft het project een directory die er – verborgen bestanden inbegrepen- zo uitziet:
copyleft@linuxbox:~/Test/MyProjectToTrack/ProjectToTrack> ls -lFA
total 28
drwxr-xr-x 2 copyleft users 6 Jun 6 16:10 .action/
-rw-r--r-- 1 copyleft users 33 Jun 6 16:10 .directory
drwxr-xr-x 2 copyleft users 19 Jun 6 16:11 .gambas/
-rw-r--r-- 1 copyleft users 123 Jun 6 16:10 .gitignore
drwxr-xr-x 2 copyleft users 6 Jun 6 16:10 .hidden/
-rw-r--r-- 1 copyleft users 10680 Jun 6 16:10 .icon.png
drwxr-xr-x 2 copyleft users 6 Jun 6 16:11 .lang/
-rw-r--r-- 1 copyleft users 0 Jun 6 16:10 .lock
-rw-r--r-- 1 copyleft users 165 Jun 6 16:10 .project
drwxr-xr-x 2 copyleft users 63 Jun 6 16:11 .src/
-rw-r--r-- 1 copyleft users 57 Jun 6 16:11 .startup
Gambas maakt een (onzichtbaar) bestand aan “.gitignore”
Daarin staat:
#---- Gambas files to ignore (v1)
*.gambas
.lock
*~
core
core.*
vgcore
vgcore.*
.kdbg*
.*.prof
.lang/*.pot
.gambas/*
.settings
#----
Dat moet er voor zorgen dat bij gebruik van git deze bestanden niet meer opgenomen worden.
Update 30/10/2018: Settings
Ik merk dat één van de bestanden die mee wijzigt na het gebruiken van de Gambas IDE er eigenlijk ook uit mag:
.settings
Dat bevat lokale tellers, gegevens over de bestanden die open stonden, locatie van vensters en de plaats waar het uitvoerbare bestand naar toe moet (.gambas).
Update: Gambas en git
Ik heb me lang afgevraagd hoe ik een HSplit container juist moest gebruiken.
De eerste stap is eenvoudig: je tekent een rechthoek met de HSplit tool.
Daarin zet je bv twee TableViews. Je kan ze dan met een vertikale balk groter en kleiner maken, waarbij de andere omgekeerd de resterende ruimte vult.
Hier de hiërarchie van kadertjes:
FMain: Arrangement = vertical
– HBox1: Expand = true
– – HSplit2: Expand = true
– – – TableView1: Expand = true, Autoresize = true
– – – TableView2: Expand = true, Autoresize = false
Ik wil TableView2 kleiner hebben, smaller eigenlijk, dan TableView1.
Maar ik vind nergens in de eigenschappen van de HSplit hoe ik dat kan instellen, bv in %, of op een vaste beginlijn.
Bij het openen van het scherm is de HSplit mooi in het midden ingesteld, hoewel in het ontwerpscherm TableView1 veel groter is dan TableView2.
In een gambas mailinglist vond ik een verwijzing naar de “layout”, die geen zichtbare eigenschap is in de IDE.
Nu heb ik in Form_Open() de volgende lijn achteraan staan:
HSplit2.Layout = [3, 1]
Dit geeft het effect van 3/4 TableView1 en 1/4 TableView2.
De instelling van de HSplit wordt niet mee bewaard met Settings.Write(Me) van een Form.
Bij het updaten van een record krijg ik een eigenaardige foutmelding dat ik een verkeerde waarde “11” probeer in te vullen in een datumveld “dateout”.
Een ander veld met datum werkt wel goed, maar dat wordt dan ook wel van gegevens voorzien, namelijk de huidige datum van de update.
Public Sub updateProduct(id As Long, longname As String, shortname As String, ourname As String, purpose As String, remark As String, sup_id As Integer, sup_nick As String, sup_qty As Float, sup_qtypack As String, datein As Date, dateout As Date, sdsdate As Date, sdsfile As String, sdsok As Integer, active As Integer) As Boolean Dim sSql As String Dim myResult As Result sSql = "UPDATE product SET " sSql &= "name=&2" ... sSql &= ", sup_qty=&9" sSql &= ", sup_qtypack=&10" sSql &= ", dateout=&11" ... sSql &= ", active=&16" sSql &= ", updat=NOW()" sSql &= ", updby=&17" sSql &= " WHERE id =&1 " If goConnect() Try $hconData.Exec(sSql, id, name, ..., sup_qty, sup_qtypack, dateout, ...., active, System.User.Name) Else ... Endif
Het enige wat ik met wat opzoekwerk kan vaststellen is dat die 11 niet de waarde is die ik stuur naar de databank, maar wel het volgnummer van de parameter in de parameterlijst die naar het commando wordt gegeven; zoals in:
hConData.Exec(sSql, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12)
Ik stuur bij de update inderdaad alle velden naar de mysql-verwerker, zodat ik maar 1 update procedure moet maken.
Voor tekstvelden is het niet erg om een lege string “” te sturen, dat werkt.
Maar bij een datum? Wat moet je daar sturen? Null? NULL? “NULL”?
Na een paar pogingen werkt het terug als ik de datumvelden niet stuur met parameters, maar vervang door de tekst veld=NULL, als in:
Dim sSql As String Dim myResult As Result sSql = "UPDATE product SET " sSql &= "name=&2" ... sSql &= ", sup_qty=&9" sSql &= ", sup_qtypack=&10" If dateout = Null sSql &= ", dateout=NULL" Else sSql &= ", dateout=&11" Endif ... sSql &= ", active=&16" sSql &= ", updat=NOW()" sSql &= ", updby=&17" sSql &= " WHERE id =&1 " If goConnect() Try $hconData.Exec(sSql, id, name, ..., sup_qty, sup_qtypack, dateout, ...., active, System.User.Name) Else ... Endif
Kleine worsteling met de lettergrootte in Gambas3 applicatie: in principe kan je in code de lettergrootte vergroten/verkleinen met
inc object.font.size
dec object.font.size
Toegepast in FMain():
DEC ME.Font.Size
… heeft als gevolg dat de letters van het menu kleiner worden, de rest van het aktieve venster niet!
Hetzelfde daar met:
DEC Application.Font.Size
In FMain heb ik een splitview HSplit1, waarbinnen al mijn andere schermelementen zitten.
Pas ik de font-aanpassing toe op die split, dan veranderen alle “onderliggende” fonts mee:
Inc HSplit1.Font.Size
Dec HSplit1.Font.Size
Voor mij is dit prima. Het menu verandert niet mee, maar dan blijft het zeker leesbaar.
(ik verander de fontgrootte vanuit een menu-item).
Public Sub mniFontInc_Click() Inc HSplit1.Font.Size End
De volgende stap bij het maken van een tabel met gegevens (TableView) is bepalen welke cel wel of niet mag gewijzigd worden. In dit artikel Hoe data in een cel steken van een TableView werd de tabel gecreëerd, en werd bij een klik de cel wijzigbaar met “.Edit”.
Vanaf je op een cel klikt, is die op het scherm wijzigbaar. De gegevens echt bewaren moet je verder zelf doen, maar misschien wil je al beperken welke cellen gewijzigd kunnen worden. Voorbeeld is een tabel die een record uit de databank weergeeft:
Kolom recordnummer, kolom veldnaam, kolom waarde in het veld. Die laatse willen we wijzigen.
Ik verkies een extra kolom voor de nieuwe waarde, waarbij de gebruiker nog kan zien wat er voordien stond.
Kolomtitels: “fieldname”, “current value”, “new value”
Kolom index 0, 1, 2; kolom 2 moet wijzigbaar zijn. (definieer bovenaan een constante voor deze kolom)
Public Const iColNewVal As Integer = 2
De rijen zijn de velden: rij 1 is id, tweede, derde enz zijn de andere velden van je record.
Je wil meestal niet dat het veld van de id kan gewijzigd worden.
Achteraan zit misschien nog een veld met de datum van aanmaak van het record, die moet ook hetzelfde blijven.
We maken een array om alle kolommen die wijzigbaar zijn in bij te houden:
Private arrEditMask As New Integer[]
Als Array.Find (van een rijwaarde) als resultaat -1 geeft komt ze niet voor.
Zet elke kolom erin die je nodig hebt:
arrEditMask.Add(i)
We reageren in de tabel op een klik als het een “wijzigbaar” veld is:
Public Sub TableView1_Click()
Debug "Is current row ? = " & TableView1.Row
Debug " is current column ? = " & TableView1.Column
If TableView1.Column = iColNewVal
If arrEditMask.Find(TableView1.Row) > -1
TableView1.Edit()
Endif
Endif
End
En om de waarde te bewaren in de tabel (zichtbaar te maken na verlaten van het veld) moet je:
Public Sub TableView1_Save(x As Integer, y As Integer, sText As String)
TableView1[x, y].Text = sText
End
Om de waarde te bewaren in het record in de databank moet je zelf verder uitwerken.
Er bestaat een Gambas bibliotheek (component) voor wachtwoord versleuteling en checken van een wachtwoord:
Crypt
De Crypt klasse levert : Check DES MD5 SHA256 SHA512
Hiermee kan je een wachtwoord versleutelen met DES of MD5, algoritmes uit de GNU libc bibliotheek.
ps: Zoals in Linux gebruikt, op de commandolijn met md5sum abc.txt om de checksum van (download) bestand abc.txt te krijgen.
Je kan ook de checksum van een gegeven wachtwoord vergelijken met de opgeslagen checksum van een eerder gegeven wachtwoord (waarbij je dat origineel wachtwoord niet opslaat, maar enkel de checksum); als die klopt is het gegeven wachtwoord juist.
Er is ook een bibliotheek die toelaat tekst te versleutelen en ontsleutelen (IDE-menu Project, Properties, Components): gb.openssl
OpenSSL levert:
Cipher de cipher (block en stream) algoritmes van OpenSSL. Wikipedia: Ciphers.CipherTextDigest de hash algoritmes van het OpenSSL project. Wikipedia: Cryptographic hash functionHMac op hash gebaseerde berichten-toegangscodering (HMAC). Wikipedia: HMACEr bestaan verschillende versleutelalgoritmes (en “operation modes”), en je kan die na het kiezen van de openssl library ook opvragen.
Maak een nieuw leeg project in Gambas3 (misschien werkt het ook in 2), en in de MMain vul je onderstaande code in.
Die toont op de commandolijn alle aanwezige algoritmes, en bewaart ze ook in een bestand (~/.config/gambas3/CipherList.conf)
CipherList
Private sName As String
Private icount As Integer
Public Sub Main()
Settings["Cipher/date"] = Str$(Now())
For Each sname In Cipher.List.Sort()
Print sName; "\n";
Settings["Cipher/" & Str$(icount)] = sName
Inc icount
Next
End
Je krijgt een lijst van bv 89 mogelijkheden (zie lijst onderaan); ze bestaan uit de encryptiemethode (plus bit-sterkte) en een “mode”, bv CBC staat voor Cipher Block Chaining (zie hieronder “operation mode” *).
Enkele algoritmen uit de lijst:
AES-128-CBC staat eerste in de lijst, gebruikt in dit vb.Je hebt de letterlijke tekstwaarde van de gekozen methode nodig om het algoritme op te roepen in je programma.
* Operation mode
Bepaalt op welke manier het oorspronkelijk te versleutelen bericht benaderd wordt voor versleuteling.
De “mode” wordt aangegeven door de extra lettercombinatie achteraan:
- ECB=Electronic CodeBook: bericht wordt in stukjes gekapt, elk stuk versleuteld. Zwakte: patronen worden zichtbaar! (vgl elke letter apart versleutelen; patroon van de “e” wordt zichtbaar)
- * CBC=Cipher Block Chaining: er wordt op iedere blok een bewerking gedaan tov het vorige blok, en een initialisatie vector moet gebruikt worden voor het eerste blok. De-cryptie kan parrallel, en Random Read Acces is mogelijk.
- * CTR=CounTeR of ICM=Integer Counter Mode of SIC=Segmented Integer Counter: maakt van een block cipher een stream cipher. En+De-cryptie kan parrallel, en Random Read Acces is mogelijk.
- PCBC=Propagating Cipher Block Chaining: gebruikt ook initialisatievector.
- CFB=Cipher Feedback
* aanbevolen methode door o.a. Bruce Schneier (van Schneier on Security)
Meer info zie wikipedia Block_cipher_mode_of_operation
Het volgende stukje programma kan je toevoegen aan het vorige, het geeft een encryptie en decryptie van “Geheim”:
Print Cipher["AES-128-CBC"].Encrypt("Geheim")
Print Cipher["AES-128-CBC"].Decrypt(Cipher["AES-128-CBC"].Encrypt("Geheim"))
Het resultaat:
(CipherText 0x1ce7cf8)
Geheim
Meestal zal je de encrypt en decrypt niet in één regel gebruiken, en gebruik je een variabele, en dat is hier geen eenvoudige tekst (string).
Om die te declareren heb je de speciale variabele uit Cipher nodig:
Private hEncrypted As CipherText
En de code met encrypt naar variabele, en apart decrypt:
hEncrypted = Cipher["AES-128-CBC"].Encrypt("Geheim")
Print hEncrypted
Print Cipher["AES-128-CBC"].Decrypt(hEncrypted)
De encryptie-methode steek je in een constante, bv PRIVATE Const sEncryptmethod AS String = “AES-128-CBC”.
In de code hier net boven ontbreken trouwens nog de Key en de InitVector.
In het geval dat de versleutelde tekst in een bestand zit, en daarnaar geschreven + daaruit gelezen moet worden, kan het hetvolgende programma gebruiken:
' Gambas module file
Private hEncrypted As CipherText
Private sLine As String
Private sCryptedFile As String
Private Const sAlgorithm As String = "AES-128-CBC"
Private sKey As String ' 32 ??
Private sInitVector As String ' 16
Public Sub Main()
Print "Hello cipher world 2" '
sCryptedFile = User.Home &/ "cipher.bin"
hEncrypted = Null
' can be asked from user:
sKey = "123456789012345678901234567890123"
sInitVector = "1234567890123ABC"
Print "Geef een woord of tekst (einde met enter):"
Line Input sLine
Try hEncrypted = Cipher[sAlgorithm].Encrypt(sLine, sKey, sInitVector)
If Error
Print Error.Text & " with key " & sKey
TestKeyLength()
Endif
File.Save(sCryptedFile, hEncrypted.Cipher)
Print Base64$(File.Load(sCryptedFile))
sLine = ""
Print "I Decrypt " & sCryptedFile & " as : "
' sLine = Cipher["AES-128-CBC"].Decrypt(File.Load(sCryptedFile))
' TYPE Mismatch, wanted CipherText, got String instead
' split up:
hEncrypted = New CipherText(File.Load(sCryptedFile), sKey, sInitVector)
' now it seems we have to use the key and initvector, even if not required to encrypt ...
sLine = Cipher[sAlgorithm].Decrypt(hEncrypted)
Print sLine
End
Print Base64$ maakt het een beetje leesbaar op de console zonder dat er rare dingen gebeuren; je kan ook het bestand gaan bekijken met bv kwrite, en daar zal het er helemaal anders uitzien…
ÍÿÆ&ÜáÒ²ÆÀ9ÿáUÿ2úKüÛ
Het volgende probleem is: hoe bepaal je de key? Hoe lang moet die zijn? Theorie buiten beschouwing gelaten kan je het zelf uitzoeken op jouw systeem met deze proefondervindelijke methode:
Public Sub TestKeyLength()
Dim sKeyShorter As String
sKeyShorter = "123456789012345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
While (Len(sKeyShorter) > 1)
sKeyShorter = Left(sKeyShorter, -1)
Try hEncrypted = Cipher[sAlgorithm].Encrypt(sLine, sKeyShorter, sInitVector)
If Not Error
Print "no error at keylength: " & Str(Len(sKeyShorter))
Exit
Else
Print "Err with: " & sKeyShorter & " " & Len(sKeyShorter)
Endif
Wend
End
Het resultaat in mijn console:
Hello cipher world 2 Geef een woord of tekst (einde met enter): Gambas3 really rocks! Key length does not match method with key 1234567890123456789012345 67890123 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXY 5 5 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRSTUVWX 54 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRSTUVW 53 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRSTUV 52 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRSTU 51 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRST 50 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQRS 49 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQR 48 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOPQ 47 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNOP 46 Err with: 123456789012345678901234567890ABCDEFGHIJKLMNO 45 Err with: 123456789012345678901234567890ABCDEFGHIJKLMN 44 Err with: 123456789012345678901234567890ABCDEFGHIJKLM 43 Err with: 123456789012345678901234567890ABCDEFGHIJKL 42 Err with: 123456789012345678901234567890ABCDEFGHIJK 41 Err with: 123456789012345678901234567890ABCDEFGHIJ 40 Err with: 123456789012345678901234567890ABCDEFGHI 39 Err with: 123456789012345678901234567890ABCDEFGH 38 Err with: 123456789012345678901234567890ABCDEFG 37 Err with: 123456789012345678901234567890ABCDEF 36 Err with: 123456789012345678901234567890ABCDE 35 Err with: 123456789012345678901234567890ABCD 34 Err with: 123456789012345678901234567890ABC 33 Err with: 123456789012345678901234567890AB 32 Err with: 123456789012345678901234567890A 31 Err with: 123456789012345678901234567890 30 Err with: 12345678901234567890123456789 29 Err with: 1234567890123456789012345678 28 Err with: 123456789012345678901234567 27 Err with: 12345678901234567890123456 26 Err with: 1234567890123456789012345 25 Err with: 123456789012345678901234 24 Err with: 12345678901234567890123 23 Err with: 1234567890123456789012 22 Err with: 123456789012345678901 21 Err with: 12345678901234567890 20 Err with: 1234567890123456789 19 Err with: 123456789012345678 18 Err with: 12345678901234567 17 no error at keylength: 16 gM3/gsYm3OEC0g+ygcaKwDn/4VX/Mg6GjPqQS/zblgo= I Decrypt /home/cybr/cipher.bin as : Gambas3 really rocks!
Dus in plaats van de 32 tekens voor de key, elders vermeld in literatuur, heb ik hier 16 nodig.
Ik kan aan mijn programma’s een tekstbestand leveren met een versleutelde toegangscode voor de databank.
Wie het bestand leest kan er niets mee. Wie het programma ontleedt wel als de sleutel en initvector (of salt) vast in de broncode staan.
De hele lijst van mogelijke algoritmes:
Continue reading