Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: swsooue - 24 Luglio 2010, 14:41:13

Titolo: [RISOLTO] SHA-256
Inserito da: swsooue - 24 Luglio 2010, 14:41:13
Ciao,
sto usando Ubuntu da poco tempo e oggi ho installato GAMBAS 2.19 e inizio ora a fare in primi passi.

Ho notevole esperienza in Visual Basic 6 per cui non sono proprio alle prime armi con il linguaggio BASIC.

Volevo per prima cosa scrivere un piccolo programmino per il calcolo del SHA-256 e mi stavo chiedendo dove posso trovare infomrazioni su come implementare SHA-256 nel mio programma.

In VB6 usavo delle DLL esterne o dei OCX (oppure si trovavano sorgenti in VB6) per implementare queste cosa, ma per GAMBAS come posso fare ??

Ho vercato su Google con le parole "SHA-256 GAMBAS" ma non ha trovato niente di interessante.

Grazie per l'aiuto
Gigi
Titolo: Re: SHA-256
Inserito da: ealmuno - 24 Luglio 2010, 20:27:05
da quello che ho trovato in internet è un metodo di crittografia. Non credo esista già, ma qui nel forum abbiamo un esperto di crittografia, lascio rispondere al lui.
Titolo: Re: SHA-256
Inserito da: Ceskho - 24 Luglio 2010, 20:44:13

Ciao,
sto usando Ubuntu da poco tempo e oggi ho installato GAMBAS 2.19 e inizio ora a fare in primi passi.

Ho notevole esperienza in Visual Basic 6 per cui non sono proprio alle prime armi con il linguaggio BASIC.

Volevo per prima cosa scrivere un piccolo programmino per il calcolo del SHA-256 e mi stavo chiedendo dove posso trovare infomrazioni su come implementare SHA-256 nel mio programma.

In VB6 usavo delle DLL esterne o dei OCX (oppure si trovavano sorgenti in VB6) per implementare queste cosa, ma per GAMBAS come posso fare ??

Ho vercato su Google con le parole "SHA-256 GAMBAS" ma non ha trovato niente di interessante.

Grazie per l'aiuto
Gigi


Se esiste una libreria gestibile da linea di comando del terminale allora puoi usare l'istruzione SHELL....se esiste una libreria implimentabile in qualche altro linguaggio allora devi includerla con EXTERN.
Titolo: Re: SHA-256
Inserito da: md9327 - 26 Luglio 2010, 10:15:56
...questo per dire che puoi chiamare funzioni o eseguibili del sistema operativo...

A meno che tu non voglia creare ex-novo un'apposita libreria a scopo didattico, penso sia inutile che ti uccidi visto che esistono già gli strumenti nel tuo s.o., basta solo chiamarli con gli opportuni criteri, e leggere i valori di ritorno da Gambas.

A "ceskoooooo", ma te voi spiega mejo ?
Titolo: Re: SHA-256
Inserito da: swsooue - 27 Luglio 2010, 08:44:28
...questo per dire che puoi chiamare funzioni o eseguibili del sistema operativo...

A meno che tu non voglia creare ex-novo un'apposita libreria a scopo didattico, penso sia inutile che ti uccidi visto che esistono già gli strumenti nel tuo s.o., basta solo chiamarli con gli opportuni criteri, e leggere i valori di ritorno da Gambas.

A "ceskoooooo", ma te voi spiega mejo ?

Quindi mi stai dicendo che la SHA-256 la posso calcolare usando direttamente una funzione del SO ??

Interessante.

Spiega spiega, oppure dammi dei link dove trovare queste informazioni

Grazie milleeeeeeeeeeeee   8)
Gigi
Titolo: Re: SHA-256
Inserito da: Ceskho - 27 Luglio 2010, 09:11:25
...questo per dire che puoi chiamare funzioni o eseguibili del sistema operativo...

A meno che tu non voglia creare ex-novo un'apposita libreria a scopo didattico, penso sia inutile che ti uccidi visto che esistono già gli strumenti nel tuo s.o., basta solo chiamarli con gli opportuni criteri, e leggere i valori di ritorno da Gambas.

A "ceskoooooo", ma te voi spiega mejo ?

Quindi mi stai dicendo che la SHA-256 la posso calcolare usando direttamente una funzione del SO ??

Interessante.

Spiega spiega, oppure dammi dei link dove trovare queste informazioni

Grazie milleeeeeeeeeeeee   8)
Gigi


Se il sistema lo prevede puoi farlo. Devi utilizzare l'istruzione SHELL. Ti invito a cercare nel forum argomenti circa tale istruzione (ampiamente e abbondantemente trattata) e di tornare qui qualora tu abbia dubbi.
Titolo: Re: SHA-256
Inserito da: swsooue - 27 Luglio 2010, 12:20:26
Se il sistema lo prevede puoi farlo. Devi utilizzare l'istruzione SHELL. Ti invito a cercare nel forum argomenti circa tale istruzione (ampiamente e abbondantemente trattata) e di tornare qui qualora tu abbia dubbi.

Ciao Ceskho e grazie degli aiuti.

L'istruzione SHELL penso sia come quella su Visual Basic (linguaggio che conosco molto bene) e che mi permette di eseguire dei programmi esterni, da dato che md9327 mi dice che la funzione SHA-256 esiste già nel sistema operativo, credo sia sufficiente dichiararla con un bel PUBLIC FUNCTION LIB...... come facevo in Visual Basic e chiamare direttamente l'API voluta.
Mi sembrava di capire che anche in GAMBAS2 è possibile fare questa cosa, ma il problema, per uno all'inizio come me, è spulciare tra le infinite routine delle API e trovare quella giusta.
C'è un sito con la documentazione delle API di Ubuntu ??

Titolo: Re: SHA-256
Inserito da: Ceskho - 27 Luglio 2010, 12:29:54
Come ho già detto l'istruzione che ti serve potrebbe essere SHELL...ti ho indicato di cercare nel forum perchè è un argomento trattatissimo. SHELL ti permette di eseguire all'interno di Gambas delle istruzione come se tu le scrivessi ed eseguissi nel terminale. Hai provato e cercato come ti avevo detto?
Titolo: Re: SHA-256
Inserito da: md9327 - 27 Luglio 2010, 12:58:52
Nei s.o. Linux di solito vengono installati md5sum e sha1sum per, appunto, calcolare le checksum di file e dischi (es. un cd).

Di solito, a riga dicomando, basta dare un "sha1sum <file>", e il ritorno è il valore calcolato.

Se è questo quello che devi fare, basta chiamare lo script da Gambas e leggere il valore di ritorno. Questo appunto con l'istruzione SHELL di Gambas.

Sul come funziona SHELL, e come gestire il collegamento, nel forum c'è già parecchia roba utile, come accennato anche da Cesko.

Come ultimo, domanda su quello che non comprendi...

Bye
Titolo: Re: SHA-256
Inserito da: swsooue - 27 Luglio 2010, 13:18:13
Nei s.o. Linux di solito vengono installati md5sum e sha1sum per, appunto, calcolare le checksum di file e dischi (es. un cd).

Di solito, a riga dicomando, basta dare un "sha1sum <file>", e il ritorno è il valore calcolato.

Se è questo quello che devi fare, basta chiamare lo script da Gambas e leggere il valore di ritorno. Questo appunto con l'istruzione SHELL di Gambas.

Sul come funziona SHELL, e come gestire il collegamento, nel forum c'è già parecchia roba utile, come accennato anche da Cesko.

Come ultimo, domanda su quello che non comprendi...

Bye

Ora ho capito, grazie, pensavo che SHA-256 era un'API e invece è da riga di comando.

Un ringraziamento anche a Ceskho, anche se è sempre un po' criptyco quando spiega   ;D  ;D

Gigi
Titolo: Re: SHA-256
Inserito da: Ceskho - 27 Luglio 2010, 13:21:47
Nei s.o. Linux di solito vengono installati md5sum e sha1sum per, appunto, calcolare le checksum di file e dischi (es. un cd).

Di solito, a riga dicomando, basta dare un "sha1sum <file>", e il ritorno è il valore calcolato.

Se è questo quello che devi fare, basta chiamare lo script da Gambas e leggere il valore di ritorno. Questo appunto con l'istruzione SHELL di Gambas.

Sul come funziona SHELL, e come gestire il collegamento, nel forum c'è già parecchia roba utile, come accennato anche da Cesko.

Come ultimo, domanda su quello che non comprendi...

Bye

Un ringraziamento anche a Ceskho, anche se è sempre un po' criptyco quando spiega   ;D  ;D


Tieni presente che devo leggermi tutti i post che vengono pubblicati...se dovessi riscrivere delle cose che comunque sono già state ampiamente trattate finirei con il passare le giornate sul forum.... ;)
Titolo: [Risolto] Re: SHA-256
Inserito da: swsooue - 27 Luglio 2010, 14:00:57
Tieni presente che devo leggermi tutti i post che vengono pubblicati...se dovessi riscrivere delle cose che comunque sono già state ampiamente trattate finirei con il passare le giornate sul forum.... ;)

Me lo immagino, ma non preoccuparti, non era una critica  :P

Comunque ci sono arrivato !!  :)

Ecco qui:

DIM Vs AS String

SHELL "echo -n '\x61\x62\x63'|sha256sum" WAIT TO Vs

Grazie mille a tutti
Gigi


P.S. una volta risolto il problema coma faccio per far apparire [Risolto] davanti al topic ??

Titolo: Re: SHA-256
Inserito da: swsooue - 27 Luglio 2010, 14:20:09

Non volevo usare SHELL e adesso ho anche avuto la conferma  :'(

Per calcolare 100.000 hash usando SHA-256 in un programma che avevo fatto in Visual Basic su Windows, utilizzando la SHA-256.DLL ci impiegava circa 10 secondi, su Gambas dopo 40 secondi era arrivato a 30.000 hash calcolati e quindi l'ho fermato.

Penso che la SHELL vada bene per tantissime cose ma in fatto di velocità ho avuto conferma che non è buona.

Volevo anche capire se la lentezza è solo data dalla SHELL o se è anche Gambas lento.
Su Windows il Visual Basic non è il massimo della velocità, anzi è uno tra i linguaggi più lenti, ma Gambas è definito un linguaggio abbastanza veloce oppure lento come il Visual Basic ??
Chiaro che se programmo in C++ la velocità è (penso) molto più alta, ma vorrei capire un paragone con Gambas, se mi conviene iniziare a studiarmelo o se mi conviene direttamente studiarmi il C++.

Grazie ancora per la vostra pazienza,
Gigi
Titolo: Re: SHA-256
Inserito da: Ceskho - 27 Luglio 2010, 14:34:33
Andiamo per gradi e cerchiamo di fare ordine.

Chiamare un comando shell all'interno di gambas significa aggiungere al normale svolgimento del programma una serie di "passi" o step che richiedono comunque un certo tempo. Se ovviamente metti a paragone una stessa funzione interna di gambas ed una eseguita da shell all'interno dello stesso vedrai che la seconda è molto più lenta anche se svolgono lo stesso lavoro poichè richiede dei passaggi in più.

Questa lentezza non è intrinseca ed imputabile a gambas ma è dovuta al metodo che tu stai usando per raggiungere il tuo scopo. La lentezza è dovuta al fatto che Gambas deve interrogare la shell, attendere che finisca e poi proseguire fino al passo successivo. Capirai benissimo che ciò richiede del tempo.

Gambas è un linguaggio interpretato e pecca in velocità tanto quanto gli altri linguaggi interpretati. Passare per l'interprete significa "strozzare" la velocità del codice.

Non si possono paragonare C++ e Gambas poichè sono due cose diverse. E' ovvio che il primo sarà sensibilmente più veloce ma ti sfido a interrogare un database o creare un hello world con GTK con la stessa semplicità che offre il gambero.
Insomma sarebbe come paragonare un camper e una ferrari durante il viaggio. Il primo sarà più comodo ma sarà lento mentre la seconda ti porta subito a destinazione ma starai scomodo.
Titolo: Re: SHA-256
Inserito da: md9327 - 29 Luglio 2010, 12:13:40
Come ha accennato Cesko, la lentezza dipende da molti fattori.
Riguardo la shell, in teoria sarebbe solo una chiamata al so, per cui i tempi sono quelli relativi ai sistemi di accesso e alle librerie su cui si basa Gambas.
Però, una volta che sei dentro la shell, la velocità è quella del so, e Gambas entra solo per quanto riguarda il ritorno.
Se, e dico se, fai un loop di chiamate al so tramite shell, ovviamente i tempi di elaborazione si sommano ai tempi di accesso al so, e per lunghe procedure questo diventa più che tangibile.
Ora, non sò come tu abbia costruito la funzione, ma credo tu debba pensarla in modo da ridurre i vari colli di bottiglia.
Infine, fare paragoni con altri linguaggi, seppur simili, credo sia fuorviante, perchè gli approcci possono essere completamente diversi, anche se all'apparenza simili.
Riguardo ai linguaggi interpretati, il discorso varia molto dalla struttura sui cui si poggiano. Per dirla breve, Gambas si appoggia su librerie consolidate, ma che sono completamente slegate dal questo linguaggio (vedi ad esempio le lib grafiche kde e gtk), mentre altri linguaggi sempre interpretati hanno un substrato costruito ad-hoc, per cui il passaggio è più diretto alle funzioni di accesso al sistema. I vari strati, e il loro numero, determinano la risposta in termini di velocità del prodotto finale. Un esempio: Java, linguaggio indipedente dal so, ma costruito su un suo proprio substrato di libreria C/Asm, che sono a loro volta legate e diverse per tipo di sistema.

Spero di aver chiarito i concetti...

Bye
Titolo: Re: SHA-256
Inserito da: swsooue - 30 Luglio 2010, 09:56:53

Grazie a tutti per le risposte, siete stati chiarissimi, e avete confermato le idee che mi ero fatto in proposito.

L'idea di usare la SHELL non mi era piaciuta fin dall'inizio, proprio perchè pensavo potesse avere gli stessi problemi della SHELL di Visual Basic (VB).

Nel mio programma in VB ho dovuto scrivere una DLL in C++ proprio per poter fare il calcolo della SHA in modo veloce, dato che il sorgente in VB che avevo trovato per calcolare la SHA256 non offriva grosse prestazioni.

Dato che ho il sorgente della libreria DLL scritta in C++ (anzi a dire la verità è codice C puro) sarebbe possibile compilarlo con CodeBlocks in ambiente Linux (io uso Ubuntu) e poi chiamarlo direttamente tramite Gambas ??

In questo modo in teoria farei la stessa cosa che ho fatto in VB, per cui le prestazioni dovrebbero essere molto migliori.

Essendo proprio a digiuno di Linux, chiedo come si chiama una libreria (non credo che la libreria si chiami DLL).

Su Gambas poi penso sia sufficiente dichiararla come funzione esterna e chiamarla direttamente come un semplice SUB, giusto ??

Grazie
Gigi

Titolo: Re: SHA-256
Inserito da: md9327 - 30 Luglio 2010, 12:21:22
Non credo si possa agire su un programma esterno con Gambas, se questo non è costruito secondo le regole definite dal creatore del linguaggio.
Al più, puoi chiamarla sempre tramite SHELL, passandogli facilmente tutti i parametri che desideri, e il ritorno idem come sopra.

Non sò cosa vuoi fare, però una chiamata ad una DLL, piuttosto che al s.o., come tempi siamo allo stesso livello. L'unico collo di bottiglia sarebbe una serie di chiamate continue alla funzione esterna, che una DLL, in quanto già caricata in memoria alla prima chiamata, risponderebbe in modo più veloce.
Le possibilità per ovviare a questo sarebbero numerose, ma dipende da cosa vuoi fare.
Tanto per fare degli esempi:
- se devi codificare più stringhe nello stesso tempo, forse ti converrebbe costruirti uno scriptino esterno, anche tramite gambas (cosa abbastanza semplice da fare), che raccolga tutte queste stringhe e le passasse alla routine esterna tramite un loop (sempre nello script)
- alternativa potrebbe essere quella che il programma esterno (in C o altro linguaggio), si occupasse di leggere e codificare in loop tutte le stringhe, magari lette in blocco da un file di testo (sempre scritto da gambas).
- altre...

Titolo: Re: SHA-256
Inserito da: swsooue - 30 Luglio 2010, 21:14:59

RISOLTO !!!!

Ho realizzato una libreria in C++, e da Gambas basta chiamarla usando prima la definizione EXTERN e poi viene chiamata semplicemente usando il nome della funzione.

Era proprio quello che cercavo.

Ciao e grazie a tutti dell'aiuto

Gigi
Titolo: Re: SHA-256
Inserito da: ealmuno - 30 Luglio 2010, 21:27:16
bene, metti risolto nel titolo del primo post
Titolo: Re: SHA-256
Inserito da: Ceskho - 31 Luglio 2010, 13:02:09

RISOLTO !!!!

Ho realizzato una libreria in C++, e da Gambas basta chiamarla usando prima la definizione EXTERN e poi viene chiamata semplicemente usando il nome della funzione.

Era proprio quello che cercavo.

Ciao e grazie a tutti dell'aiuto

Gigi


Siccome Extern pecca di guide e manuali, ti andrebbe di scrivere qualcosa a riguardo nel wiki per altri che si imbattono nel tuo stesso problema?
Titolo: Re: SHA-256
Inserito da: swsooue - 31 Luglio 2010, 18:41:26
Siccome Extern pecca di guide e manuali, ti andrebbe di scrivere qualcosa a riguardo nel wiki per altri che si imbattono nel tuo stesso problema?

Se è da dare una mano lo faccio volentieri, ma non ho idea di cosa potrei fare.
Posso eventualmente tradurre la pagina in inglese e metterci qualcosa di mio ??

Gigi
Titolo: Re: SHA-256
Inserito da: Ceskho - 31 Luglio 2010, 18:47:38
Siccome Extern pecca di guide e manuali, ti andrebbe di scrivere qualcosa a riguardo nel wiki per altri che si imbattono nel tuo stesso problema?

Se è da dare una mano lo faccio volentieri, ma non ho idea di cosa potrei fare.
Posso eventualmente tradurre la pagina in inglese e metterci qualcosa di mio ??

Gigi


Si certo....possibilmente inserisci qualche esempio poichè così è più utile per i nuovi utenti.....registrati al wiki (http://www.gambas-it.org/wiki/index.php/Pagina_principale) e crea la pagina....

Se non sai dove creare la pagina dimmelo via pm che la creo io e poi tu la riempi....
Titolo: Re: [RISOLTO] SHA-256
Inserito da: leo72 - 01 Agosto 2010, 10:27:10
Scusatemi se rispondo solo adesso ma sono stato in ferie.
Dunque, io ho realizzato un programma di cifratura che utilizza vari algoritmi crittografici e di hash che ho convertito personalmente da C/C++ o da VB6 in Gambas. E' stato un lavoraccio ed, ovviamente, la velocità rispetto ad un'implementazione pura in C è notevomente minore, ma l'ho fatto per pura sfida personale e per provare che con Gambas si possono affrontare anche certi progetti.


Nello specifico, la classe che allego è quella per il calcolo degli hash SHA256. E' adatta per lavorare con il mio programma per cui va "depurata" nella sua funzione pubblica SHA256 dalla parte di codice che gestisce la finestrina di popup che mostra l'avanzamento del processo di calcolo e va poi adattata per poter gestire anche stringhe dato che ora accetta in input un file. Ma sono tutte cose relativamente facili da fare.
Titolo: Re:[RISOLTO] SHA-256
Inserito da: vuott - 03 Dicembre 2022, 22:33:07
Poiché avevo segnalato questo post di Leo72 in una discussione nel forum spagnolo:
https://gambas-es.org/showthread.php?tid=998
ho domandato a Leo72, su richiesta di un membro di quel forum, alcune informazioni circa l'uso della funzione:
Codice: [Seleziona]
ProcessHC256(InputData As Byte[], count2048 As Integer, Pp As Integer[], Qq As Integer[]) As Byte[]
presente nella Classe "clsHC256.class" da lui creata.
In particolare domanda cosa rappresentano e come e da dove si ottengono il 2°, il 3° e il 4° parametro, affinché possano essere passati appunto a questa funzione.
Leo mi ha risposto come segue:
« Per capire come funziona quella... funzione e perché si chiama in quel modo bisogna prima sapere come opera l'algoritmo in questione. L'HC256 è un cifrario a flusso (stream-cipher) che opera creando un flusso continuo di byte pseudo-casuali con il quale viene cifrato il messaggio originale.
Tecnicamente, l'HC-256 lavora con una chiave a 256 bit e con un IV (initialization vector) sempre a 256 bit. Internamente, consiste di 2 tabelle segrete P e Q generate a partire dalla chiave immessa dall'utente e composte ognuna da 1024 numeri interi a 32 bit. Ad ogni iterazione viene aggiornato 1 numero di ogni tabella: dopo 2048 iterazioni, tutti i numeri delle 2 tabelle sono stati aggiornati. Per tenere il punto uso una variabile contatore. La codifica e decofica si basano sullo stesso codice: viene generato un intero a 32 bit utilizzando una funzione di mappatura a 32 bit simile alla funzione di output del Blowfish. Alla fine del processo viene generata una funzione lineare di mascheramento a bit che è applicata per generare un intero a 32 bit di output. Utilizza anche 2 funzioni dell'SHA-256 ma sempre in abbinamento alle tabelle P e Q come fossero S-Box.

Quindi, istanziata la classe:


Codice: [Seleziona]
Dim cHC256 As New ClsHC256

Si dichiarano le variabili:

Codice: [Seleziona]
Dim KeyHC256 As New Integer[]

Dim IV As New Byte[]

Dim chiave As String Dim P As Integer[1024] Dim Q As Integer[1024]

Dim Counter2048 As Integer
bisogna inizializzare lo stato interno dell'algoritmo:

Codice: [Seleziona]
keyHC256 = cHC256.KeySetup(cv_String2Bytes(chiave), lunchiave, 256) iv.Resize(256 / 8) cHC256.IVsetup(keyhc256, iv, 256, p, q, Counter2048)
lunchiave è la lunghezza in bit (si ottiene moltiplicando la lunghezza della stringa chiave per 8 )

String2bytes sono 2 funzioncine che servono a trasformare la stringa di testo da cifrare o la chiave in un array di byte (da $00 a $ff).

Una volta fatto questo si può passare a codificare i dati:


Codice: [Seleziona]
String temp = cv_Bytes2String(cHC256.ProcessHC256(cv_String2Bytes(stringa_temp), Counter2048, p, q))

Anche quim bytes2string è una funzioncina che ritrasforma l'array di byte in una stringa. »