* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 01, 2024, 03:33:31 am

Inserisci il nome utente, la password e la durata della sessione.

69 Visitatori, 0 Utenti

Autore Topic: Criptare TMemo su file  (Letto 5022 volte)

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Criptare TMemo su file
« il: Marzo 16, 2015, 10:02:58 am »
Ciao a tutti,

ho la necessità di criptare il contenuto di un TMemo (o un componente più evoluto se me lo consigliate). Sbirciando sul web ho trovato molto codice che fa uso della unit blowfish ed è questo algoritmo di criptazione che vorrei usare.
Riesco a criptare e decriptare senza problemi, così come riesco a scrivere il contenuto della proprietà Lines di tipo TStrings su file e a rileggerne il contenuto facendo uso della proprietà Lines.Text che mi restituisce un'intera stringa da riassegnare sempre alla Linex.Text usando TFileStream.

Ciò che mi sta dando delle difficoltà  è salvare il contenuto criptato su file, rileggerlo e decriptarlo. Nella scrittura sembra non ci siano problemi, il contenuto viene criptato. Ma nella lettura ho idea che ci sia qualcosa che non quadra. L'errore restituito è Exception class External SIGSEGV

Di seguito un codice demo (ignorate il fatto che non ci siano try-finally, try-except ecc.. è solo codice di test):

Grazie per ogni eventuale aiuto/suggerimento

Codice: [Seleziona]
// Salvo criptato
procedure TForm1.Button1Click(Sender: TObject);
var fs: TFileStream;
  tfOut: TextFile;
begin
  fs := TFileStream.Create('textfile.txt', fmCreate);
  fs.Seek(0,soBeginning);
  { 1 }
   key := 'testkey';
   { 2 }
   s1 := TStringStream.Create('');
   en := TBlowFishEncryptStream.Create(key,s1);
   { 3 }
   en.WriteAnsiString(Memo1.Lines.Text);
   fs.WriteBuffer(Pointer(s1.DataString)^, length(s1.DataString));
   en.Free;

//  Memo1.Lines.SaveToStream(fs);
  fs.Free;
end;                 

Codice: [Seleziona]
 Leggo criptato
procedure TForm1.Button2Click(Sender: TObject);
var
tr : string;
fs : TFileStream;
tfOut: TextFile;
Begin
   Fs := TFileStream.Create('textfile.txt', fmOpenRead or fmShareDenyNone);
   SetLength(tr, Fs.Size);
   Fs.ReadBuffer(tr, Fs.Size);

  s2 := TStringStream.Create(tr); //l'errore viene dato qui dal debugger ma probabilmente è la stringa tr ad avere dei problemi.
  s1.Free;

  de := TBlowFishDeCryptStream.Create(key,s2);

  temp := de.ReadAnsiString;
  WriteLn('decrypted: ' + temp);
  Memo1.Lines.Text := temp;

  de.Free;
  s2.Free;

end;               

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2917
  • Karma: +20/-4
Re:Criptare TMemo su file
« Risposta #1 il: Marzo 16, 2015, 11:14:13 am »
ciao
hai dato un'occhiata a questa guida?

http://www.lazaruspascal.it/index.php?page=135
Imagination is more important than knowledge (A.Einstein)

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Criptare TMemo su file
« Risposta #2 il: Marzo 16, 2015, 11:22:58 am »
Sì, avevo scorso la guida. A parte il metodo copyfrom che non conosco mi sembra pressoché simile alle altre trovate sulla rete. Come dicevo nel primo post non ho problemi a criptare e decriptare al volo i dati nel TMemo, così come non ho problemi a scrivere su file e poi a leggere in chiaro lo stesso contenuto. Il mio problema è criptare -> scrivere su file il testo criptato (e fino qui sembra tutto regolare) -> leggere dal file -> decriptare -> depositare di nuovo il contenuto in TMemo. E' questa seconda parte che mi dà problemi, ovvero leggere dal file di testo il contenuto criptato e poi decriptarlo.

Grazie

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2917
  • Karma: +20/-4
Re:Criptare TMemo su file
« Risposta #3 il: Marzo 16, 2015, 12:26:06 pm »
prova a mettere un breakpoint su questa riga:

Codice: [Seleziona]
s2 := TStringStream.Create(tr); //l'errore viene dato qui dal debugger ma probabilmente è la stringa tr ad avere dei problemi.

quando l'esecuzione si interrompe, vedi cosa c'è nella stringa

Edit:
prova a cambiare la readbuffer immediatamente sopra come segue
Codice: [Seleziona]
Fs.ReadBuffer(tr[1], Fs.Size);
« Ultima modifica: Marzo 16, 2015, 12:30:34 pm da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Criptare TMemo su file
« Risposta #4 il: Marzo 16, 2015, 05:17:30 pm »
Grazie per la risposta. Ho modificato la ReadBuffer come mi hai detto e il software va avanti. Ottengo un'eccezione EReadError with message Stream Read Error con  esattamente qui:

Codice: [Seleziona]
 temp := de.ReadAnsiString;

la s2.datastring mi sembra restituire una stringa criptata o meglio non è intellegibile. Tuttavia, quando tento di usare la ReadAnsistring dell'oggetto de lo stream va in errore :O


slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Criptare TMemo su file
« Risposta #5 il: Marzo 16, 2015, 05:20:28 pm »
Mi viene il dubbio che dopo la criptazione il file venga convertito in binario e che nel rileggerlo ci sia qualche problema ad usare ReadAnsistring ...

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Criptare TMemo su file
« Risposta #6 il: Marzo 17, 2015, 11:32:46 am »
Le mie supposizioni erano errate !! Ho scritto alla lista fpc-pascal e il solito Graeme Geldenhuys mi ha dato un bel suggerimento. Dopo la criptazione occorre usare il metodo flush per fare in modo che si consolidi la criptazione e venga poi effettivamente scritta su disco. ora funziona perfettamente !!

Riporto il codice di seguito se a qualcuno può essere utile !

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var fs: TFileStream;
  tfOut: TextFile;
begin
  fs := TFileStream.Create('textfile.txt', fmCreate);
  fs.Seek(0,soBeginning);
  { 1 }
   key := 'testkey';
   { 2 }
   s1 := TStringStream.Create('');
   en := TBlowFishEncryptStream.Create(key,s1);
   { 3 }
   en.WriteAnsiString(Memo1.Lines.Text);
   en.Flush; // l'invocazione di questo metodo ha risolto il problema !!
   fs.WriteBuffer(Pointer(s1.DataString)^, length(s1.DataString));
   en.Free;
   fs.Free;                   
« Ultima modifica: Marzo 17, 2015, 03:17:31 pm da slapshot »

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2917
  • Karma: +20/-4
Re:Criptare TMemo su file
« Risposta #7 il: Marzo 17, 2015, 03:15:42 pm »
grazie per la condivisione ;)
Imagination is more important than knowledge (A.Einstein)

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Criptare TMemo su file
« Risposta #8 il: Marzo 18, 2015, 09:52:49 am »
Codice: [Seleziona]
en.WriteAnsiString(Memo1.Lines.Text);
   en.Flush; // l'invocazione di questo metodo ha risolto il problema !!
   fs.WriteBuffer(Pointer(s1.DataString)^, length(s1.DataString));
   en.Free;

da ulteriori approfondimenti sembra che il metodo Flush venga chiamato implicitamente al free. Nel mio codice, però, il distruttore dell'oggetto en viene chiamato dopo il WriteAnsistring e quindi si rende necessario esplicitamente invocare il metodo Flush. Spostare en.Free una riga più sopra avrebbe evitato l'invocazione diretta del metodo flush. Non ho ancora provato ma credo sia così.

 

Recenti

How To

Utenti
  • Utenti in totale: 802
  • Latest: Il Faro
Stats
  • Post in totale: 19104
  • Topic in totale: 2279
  • Online Today: 106
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 69
Total: 69

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.