String in DataSection?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

String in DataSection?

Beitrag von purebas »

Es ist schon sehr lange her, dass ich mit PB programmierte.
Ich schau mir gerade ein Beispiel aus der PB-Hilfe an.
Ich möchte den String$ aus der DataSection heraus ziehen.
Ich übe nur, bitte nicht den Sinn hinterfragen.

Code: Alles auswählen

; Verschlüsseln eines Strings
  ;String$ = "ABCDEFGHIJKLMNOP"
  String$ = ?Txt

  StringMemorySize = StringByteLength(String$) + SizeOf(Character) ; Platz für den null-terminierten String mit seiner abschließenden Null
  *CipheredString = AllocateMemory(StringMemorySize)   
  *DecipheredString = AllocateMemory(StringMemorySize) 
  
  If AESEncoder(@String$, *CipheredString, StringByteLength(String$), ?Key, 128, ?InitializationVector)
    Debug "Ciphered: "+PeekS(*CipheredString) ; Warning: wird beim ersten Null-Byte angehalten, nur für Demo-Zwecke
    
    AESDecoder(*CipheredString, *DecipheredString, StringByteLength(String$), ?Key, 128, ?InitializationVector)
    Debug "Deciphered: "+PeekS(*DecipheredString)
  EndIf

  DataSection
    Txt:
      Data.b $65, $66, $67, $68, $69, $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $80

    Key:
      Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  
    InitializationVector:
      Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
  EndDataSection
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: String in DataSection?

Beitrag von _JON_ »

Code: Alles auswählen

String$ = PeekS(?Txt, 16, #PB_Ascii)
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: String in DataSection?

Beitrag von purebas »

Wenn in Txt eine 0 drinsteht, dann klappt es nicht mehr. Ansonsten schon.
Wie stelle ich die AES-Funktionsaufrufe so um, dass es einen ByteBuffer und keinen StringBuffer verarbeitet?
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: String in DataSection?

Beitrag von Sicro »

purebas hat geschrieben:Wenn in Txt eine 0 drinsteht, dann klappt es nicht mehr. Ansonsten schon.
Das liegt daran, weil in Strings keine Null-Zeichen vorkommen dürfen. Sie stellen das Ende eines Strings dar.
purebas hat geschrieben:Wie stelle ich die AES-Funktionsaufrufe so um, dass es einen ByteBuffer und keinen StringBuffer verarbeitet?
Die Encoder/Decoder von AES arbeiten bereits binär. Die Problemverursacher sind StringByteLength() und PeekS(), weil die die Daten nur bis zum Null-Zeichen verarbeiten.

Ich habe dir mal schnell einen Beispiel-Code geschrieben, der veranschaulicht, wie binäre Daten verschlüsselt und wieder entschlüsselt werden:

Code: Alles auswählen

EnableExplicit

Define Output$
Define *DataBuffer, *CipheredDataBuffer, *DecipheredDataBuffer
Define i

; Größe des DataBuffers festlegen
Define LengthOfDataBuffer = 16 ; 16 ist Minimum

; Speicher reservieren
*DataBuffer           = AllocateMemory(LengthOfDataBuffer)
*CipheredDataBuffer   = AllocateMemory(LengthOfDataBuffer)
*DecipheredDataBuffer = AllocateMemory(LengthOfDataBuffer)
If *DataBuffer = 0 Or *CipheredDataBuffer = 0 Or *DecipheredDataBuffer = 0
  Debug "Speicher konnte nicht reserviert werden!"
  End
EndIf

; Ein Long-Wert in den DataBuffer schreiben
PokeL(*DataBuffer, 123456)

; Daten ausgeben
For i = 0 To LengthOfDataBuffer
  Output$ + Hex(PeekB(*DataBuffer + i), #PB_Byte) + " "
Next
Debug "Daten im Hex-Format:"
Debug Output$
Debug "----------------------------"

; DataBuffer verschlüsseln
If Not AESEncoder(*DataBuffer, *CipheredDataBuffer, LengthOfDataBuffer, ?Key, 128, ?InitializationVector)
  Debug "Verschlüsselung fehlgeschlagen!"
  End
EndIf

; Verschlüsselte Daten ausgeben
Output$ = ""
For i = 0 To LengthOfDataBuffer
  Output$ + Hex(PeekB(*CipheredDataBuffer + i), #PB_Byte) + " "
Next
Debug "Verschlüsselte Daten im Hex-Format:"
Debug Output$
Debug "----------------------------"

; DataBuffer entschlüsseln
If Not AESDecoder(*CipheredDataBuffer, *DecipheredDataBuffer, LengthOfDataBuffer, ?Key, 128, ?InitializationVector)
  Debug "Entschlüsselung fehlgeschlagen!"
  End
EndIf

; Entschlüsselte Daten ausgeben
Output$ = ""
For i = 0 To LengthOfDataBuffer
  Output$ + Hex(PeekB(*DecipheredDataBuffer + i), #PB_Byte) + " "
Next
Debug "Entschlüsselte Daten im Hex-Format:"
Debug Output$
Debug "----------------------------"

DataSection
  Key:
  Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  
  InitializationVector:
  Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten