Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Free Pascal Compiler - Stream read error

Mitglied: AnkhMorpork

AnkhMorpork (Level 2) - Jetzt verbinden

06.12.2018 um 07:29 Uhr, 214 Aufrufe, 11 Kommentare, 1 Danke

Hallo Alle und Moinsen

System:
Windows 7, x64
Free Pascal Compiler 3.0.4
Lazarus IDE 1.8.4



In der Hoffnung, hier noch einen weisen Pascal-Coder zu finden:

Ich habe ein kleines Konsolen-Programm geschrieben, das kurze Texte entgegen nimmt, verschlüsselt (BlowFish) und in eine Datei schreibt. Zudem kann der Datei-Inhalt zurückgelesen, entschlüsselt und in der Konsole angezeigt werden.
Zum Speichern/Laden nutze ich Streams (TStringStream).

Die Verschlüsselung funktioniert perfekt.
Die Entschlüsselung aber nur, wenn der String exakt 4 Zeichen lang ist. Sonst schmeißt es folgenden Fehler:
Project crypt hat Exception-Klasse "EReadError" ausgelöst mit der Meldung:
Stream read error
Bei Adresse 410EE5
Mein erster Gedanke war ein Zeichensatz-Problem beim Übergang Console/Stream. Aber dann sollten mMn auch die 4-Zeichen-Strings denselben Fehler schmeißen - tun sie aber nicht. Ich habe eine Reihe von 4-Zeichen-Kombinationen durchgespielt - werden korrekt ver-/entschlüsselt.

Habe mittlerweile dutzende von Artikeln gelesen, Foren durchstöbert und Zeichensatz-Umwandlungen probiert, aber keine Erleuchtung zu vermelden.

Am BlowFish-Algorithmus liegt es auch nicht, der funktioniert perfekt (habe ich mit einer kleinen Test-Routine nachvollziehen können). Das explizite Setzen der CodePage in der Console bringt ebenfalls nix. Ich bin schlussendlich auf die Schnappsidee gekommen, die ASCII/ANSI-Codes der Chiffre in die Datei zu schreiben - ooch nöscht.

Mein Schädel stößt bereits kleine Rauchwolken aus ... ich hoffe, die Krankenkasse übernimmt das (btw: bitte keine anzüglichen Wortspiele mit dem Crypto-Algorithmus!).

Kennt einer von euch da draußen an den Geräten dieses Phänomen? Kann es mir jemand erklären? Hat jemand eine Lösung / einen Lösungsansatz?


Gruß und schöne Adzwenzzeit euch allen

Ankh


Hier noch der Quelltext:
01.
Program crypt;
02.
{$mode objfpc}{$H+}
03.
 
04.
uses
05.
  Classes, Crt, SysUtils, BlowFish;
06.
 
07.
const TheFile: String = 'CryptFile.txt';
08.
 
09.
var
10.
  EncodeBlowFishStream: TBlowFishEncryptStream;
11.
  DecodeBlowFishStream: TBlowFishDeCryptStream;
12.
  EncodeStringStream,DeCodeStringStream: TStringStream;
13.
  EncodeString,DecodedString,key,value: String;
14.
  Choice: Char;
15.
 
16.
Procedure Encrypt;
17.
Begin
18.
     EncodeStringStream := TStringStream.Create('');
19.
     EncodeBlowFishStream := TBlowFishEncryptStream.Create(key,EncodeStringStream);
20.
     EncodeBlowFishStream.WriteAnsiString(value);
21.
     EncodeString := EncodeStringStream.DataString;
22.
     EncodeBlowFishStream.Free;
23.
     EncodeStringStream.Free;
24.
End;
25.
 
26.
Procedure Decrypt;
27.
Begin
28.
     DeCodeStringStream := TStringStream.Create(value);
29.
     DecodeBlowFishStream := TBlowFishDeCryptStream.Create(key,DeCodeStringStream);
30.
     DecodedString := DecodeBlowFishStream.ReadAnsiString;
31.
     DecodeBlowFishStream.Free;
32.
     DeCodeStringStream.Free;
33.
End;
34.
 
35.
Function ReadFile(File2Read:String):String;
36.
Var  String2Read: TstringList;
37.
Begin
38.
     Value:='';
39.
     String2Read := TStringList.Create;
40.
     Try
41.
        String2Read.LoadFromFile(File2Read);
42.
        value:=String2Read[0];
43.
     Finally
44.
         String2Read.Free;
45.
     End;
46.
End;
47.
 
48.
Function WriteFile(File2Write:String):String;
49.
Var String2Write: TStringList;
50.
Begin
51.
     String2Write := TStringList.Create;
52.
     Try
53.
        String2Write.Add(EncodeString);
54.
        String2Write.SaveToFile(File2Write);
55.
     Finally
56.
        String2Write.Free;
57.
        EncodeString:='';
58.
     End;
59.
End;
60.
 
61.
Begin
62.
  While True Do
63.
  Begin
64.
     ClrScr;
65.
     TextColor(LightGreen);
66.
     Write('Encrypt = 1 | Decrypt = 2 | Exit = 3 ... Your choice: ');
67.
     Choice := ReadKey;
68.
     WriteLn;
69.
     If Choice='3' Then
70.
        Halt(0);
71.
 
72.
     Write('Key: ');
73.
     ReadLn(key);
74.
 
75.
     Case Choice of
76.
      '1': Begin
77.
                Write('Text: ');
78.
                ReadLn(value);
79.
                Encrypt;
80.
                WriteLn('Encrypted: ' + EncodeString);
81.
                WriteLn('Decrypted: ' + value);
82.
                WriteFile(TheFile);
83.
           End;
84.
      '2': Begin
85.
                ReadFile(TheFile);
86.
                Decrypt;
87.
                WriteLn('Encrypted: ' + value);
88.
                writeLn('Decrypted: ' + DecodedString);
89.
           End;
90.
 
91.
     End; //Case
92.
     WriteLn;
93.
     TextColor(white);
94.
     Write('Press ENTER to continue...');
95.
     ReadLn;
96.
  End; //While
97.
End.
Mitglied: answer
06.12.2018, aktualisiert um 10:12 Uhr
Moin.
Wo liegt die zu lesende Datei? Auf einem Netzlaufwerk?

Gruß A.
Bitte warten ..
Mitglied: AnkhMorpork
06.12.2018 um 10:26 Uhr
@answer
Nein, lokale Festplatte
Bitte warten ..
Mitglied: answer
06.12.2018, aktualisiert um 12:22 Uhr
OK, ich bau die Build-Umgebung nachher mal in einer VM nach und gebe Rückmeldung was dein Code dort meldet.
Bitte warten ..
Mitglied: Friemler
06.12.2018, aktualisiert um 21:56 Uhr
'n Abend Ankh,

ich bin Delphi-Entwickler und kenne deshalb die Details der FPC RTL nicht. Die Doku von ReadAnsiString sagt jedoch:

The Ansistring should be stored as 4 bytes (a DWord) representing the length of the string, and then the string value itself. The WriteAnsiString function writes an ansistring in such a format.

Das mit den 4 Bytes kommt mir schonmal verdächtig vor. Was passiert, wenn Du die Prozedur Decrypt folgendermaßen umschreibst:
01.
Procedure Decrypt;
02.
var
03.
    TmpStream: TStringStream;
04.
Begin
05.
    DeCodeStringStream := TStringStream.Create(value);
06.
    DecodeBlowFishStream := TBlowFishDeCryptStream.Create(key,DeCodeStringStream);
07.
    TmpStream := TStringStream.Create('');
08.
    TmpStream.CopyFrom(DecodeBlowFishStream, DecodeBlowFishStream.Size);
09.
    DecodedString := TmpStream.DataString;
10.
    TmpStream.Free;
11.
    DecodeBlowFishStream.Free;
12.
    DeCodeStringStream.Free;
13.
End;
Grüße
Friemler
Bitte warten ..
Mitglied: AnkhMorpork
07.12.2018 um 07:26 Uhr
Moin Friemler,

schön von dir zu "hören".

Es schmeißt wieder Fehler. Diesmal:
errmsg - Klicke auf das Bild, um es zu vergrößern

In der FPC-Version 3.0+ sollte eigentlich alles UTF8 kodiert sein. Ist aber auch nur graue Theorie.

Grüße zurück

Ankh
Bitte warten ..
Mitglied: Friemler
07.12.2018 um 09:04 Uhr
Moin Ankh,

die Länge des BlowFish-Streams wird intern anscheinend durch eine Suchoperation bestimmt. Kann die Längenangabe (Parameter 2) der CopyFrom-Methode wie in Delphi auf 0 gesetzt werden, um den gesamten Stream zu kopieren?

Muss der String, damit er entschlüsselt werden kann, eigentlich genau 4 Bytes lang sein oder muss er mindestens 4 Byte lang sein? Hintergrund: Du schreibst das "eigentlich alles UTF8 kodiert sein" soll. Die Byte Order Mark (BOM) von UTF-8 ist 3 Bytes lang.

Grüße
Friemler
Bitte warten ..
Mitglied: AnkhMorpork
07.12.2018 um 09:31 Uhr
@Friemler

Die Längenangabe der CopyFrom-Methode kann auf 0 gesetzt werden, aber dann kommt Murks raus:

bild1 - Klicke auf das Bild, um es zu vergrößern

bild2 - Klicke auf das Bild, um es zu vergrößern

Der String muss exakt 4 Byte lang sein. Alle anderen Längen schmeißen den String read error.

Notepad++ sagt übrigens, dass die Datei Ansi-kodiert ist ... ?

Ich habe das Ganze auch mal unter Linux (openSUSE Leap 42.3) compiliert - selbes Fehlerbild. Das war sicher auch zu erwarten, aber ich nehme mitlerweile jeden Strohhalm mit, der nicht bei 3 auf'm Baum ist.


Danke für deine Unterstützung!

Ich wäre ja gern bei Delphi geblieben, aber die Preispolitik hat mich rausgeschmissen. Und die Zeit meiner wirklich großen Projekte ist auch vorbei. Die meisten Sachen funktionieren ja primelich, aber der Teufel steckt bekanntlich im Detail (und das habe ich hier wohl erwischt).

Glück auf

Ankh
Bitte warten ..
Mitglied: Friemler
07.12.2018 um 10:00 Uhr
Hallo Ankh

Notepad++ sagt übrigens, dass die Datei Ansi-kodiert ist ... ?

Solange keine UTF-8 Byte Order Mark und auch keine Zeichen mit einem Code größer 127 in der Datei enthalten sind, lassen sich ANSI und UTF-8 Dateien nicht unterscheiden.

Ich schätze, da musst Du mal in die RTL von FPC rein debuggen und herausfinden, durch welche Umstände der Fehler entsteht. Evtl. hast Du da einen noch nicht entdeckten Bug gefunden.

Danke für deine Unterstützung!

Gerne wieder!

Ich wäre ja gern bei Delphi geblieben, aber die Preispolitik hat mich rausgeschmissen.

Bei mir zahlt der Cheffe.


Grüße
Friemler
Bitte warten ..
Mitglied: AnkhMorpork
07.12.2018 um 10:29 Uhr
Ay Friemler,

dann werde ich mich mal auf den Weg machen und die Tiefen der RTL erkunden. Könnte ganz interesant werden.

War mal wieder angenehm, mit dir zu "arbeiten".

Alles Gute weiterhin und bleib munter.


P.S.: Frag doch bitte Cheffe, ob er mich vielleicht sponsoren möchte.
Bitte warten ..
Mitglied: Friemler
07.12.2018 um 11:02 Uhr
Hey Ankh,

Frag doch bitte Cheffe, ob er mich vielleicht sponsoren möchte.

Von der neuesten Delphi-Version 10.3 Rio gibt es eine Community Edition für umme. Damit kann man sogar kommerzielle Software entwickeln, wenn die Firma höchstens 5 Entwickler beschäftigt und höchstens $5000 Umsatz pro Jahr macht (wie davon 5 Entwickler oder auch nur einer leben sollen verraten sie nicht).

Mehr Infos und Links zum Download hier: https://www.embarcadero.com/products/delphi/starter

Grüße
Friemler
Bitte warten ..
Mitglied: AnkhMorpork
07.12.2018 um 11:34 Uhr
@Friemler

Klasse!

Vielen Dank für den Link. Werde ich gleich mal ausprobieren.

Vergiss das mit Cheffe!


Schönes WE

Ankh
Bitte warten ..
Ähnliche Inhalte
Festplatten, SSD, Raid
Disk read error occured
Frage von 122573Festplatten, SSD, Raid7 Kommentare

Hallo, nach dem Neustart meines Rechners mit 2 Festplatten kam der Fehler DIsk read eroor occured. Ich dachte erst ...

KVM

Proxmox KVM - Disk read error nach verschieben der disk

gelöst Frage von ketanest112KVM6 Kommentare

Hallo zusammen, ich komme grad nicht weiter. Ich habe Proxmox 4.3-7/db02a4de als Virtualisierungshost laufen. Der Exchange ist wohl mit ...

Soziale Netzwerke

Facebook Live Stream - Persistent stream key

Frage von smackeeSoziale Netzwerke4 Kommentare

Liebe Community Ich versuchen schon seit Tagen einen permamenten Stream-Key für den Facebook Live zu erhalten. Diese Option gibt ...

Utilities

Stream von spiegel.tv speichern

Frage von klaraFUtilities16 Kommentare

Hallo, ich habe schon einiges Probiert, bin aber kläglich gescheitert: Wie kann ich diesen Flash-Stream speichern? Danke für jegliche ...

Neue Wissensbeiträge
iOS
WatchChat für Whatsapp
Tipp von Criemo vor 3 TageniOS3 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor !!!
Tipp von Criemo vor 3 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Off Topic
Avengers 4: Endgame - Erster Trailer
Information von Frank vor 5 TagenOff Topic2 Kommentare

Ich weiß es ist Off Topic, aber ich freue mich auf diesen Film und vielleicht geht es anderen hier ...

Webbrowser
Microsoft bestätigt Edge mit Chromium-Kern
Information von Frank vor 6 TagenWebbrowser5 Kommentare

Microsoft hat nun in seinem Blog bestätigt, dass die nächste Edge Version kein EdgeHTML mehr für die Darstellung benutzen ...

Heiß diskutierte Inhalte
Drucker und Scanner
SW-Laserdrucker mit sechs Papierfächern gesucht
Frage von MOS6581Drucker und Scanner21 Kommentare

Moin, zur Abwechslung mal eine sonderbare Anforderung :) Ich suche einen S/W Laserdrucker (kein MFP), der sechs Papierfächer bzw. ...

Windows Server
Einziger Domänencontroller ersetzen - Windows Server 2012R2 - Hostname
Frage von DeRo93Windows Server20 Kommentare

Guten Tag, Leider haben wir einen Domänencontroller dessen Komponentenspeicher defekt ist. Alle Maßnahmen sind da leider fehlgeschlagen. Nun wurde ...

Netzwerke
Open VPN Konfiguration
gelöst Frage von blubaaNetzwerke14 Kommentare

Hallo zusammen, im Büro habe ich einen Server aufgesetzt mit Debian 9 und darauf OMV installiert um das ganze ...

Server-Hardware
WS 2016 Essentials Hardware
Frage von ChefknechtServer-Hardware10 Kommentare

Moin welche Hardware würdet ihr empfehlen? Dell Poweredge HP Proliant Fujitsu Ich bin total konfus was nun nötig ist, ...