Seite 1 von 1

Phasenraumplot

Verfasst: 07.04.2008 20:58
von Helle
Angeregt durch einen Artikel bei heise Security ("Verschusselt statt verschlüsselt") habe ich zu Testzwecken dieses Progrämmchen geschrieben. Der optische Unterschied zwischen einer "normalen" Exe-Datei und der (mit AES) verschlüsselten Datei ist schon beeindruckend.
Die Test-Datei (für z.B. eigene Verschlüsselungen) sollte schon einige KB groß sein, begrenzt nach oben habe ich es auf 100.000 Bytes.

Code: Alles auswählen

;- Phasenraumplot
;- "Helle" Klaus Helbing, 07.04.2008, PB4.10 
;- Dieser Phasenraumplot stellt die Bytes z.B. einer Datei 3-dimensional als Raumpunkte dar
;- Die Raum-Koordinaten errechnen sich folgendermaßen:
;- Punkt1=(Byte1-Byte2, Byte2-Byte3, Byte3-Byte4), Punkt2=(Byte2-Byte3, Byte3-Byte4, Byte4-Byte5) usw.
;- Gut verschlüsselte Daten und gute Zufallszahlen ergeben im Phasenraumplot eine gleichmäßig
;- verteilte Punktewolke, ansonsten sieht man Strukturen (z.B. Linien) 
;- Z wurde aus Platzgründen um Faktor 2 gestaucht
;- Zur besseren Übersicht wurde der Koordinaten-Ursprung nach oben verschoben

Cos10.f = Cos(10*#PI/180)
Sin10.f = Sin(10*#PI/180)
Cos60.f = 0.5                                    ;Cos(60°)
Sin60.f = Sin(60*#PI/180)

AX.l = 50
AY.l = 548
BX.l = AX + 0.75*510*Sin60                       ;0.75=Verkürzungsfaktor 
BY.l = AY - 0.75*510*Cos60
CX.l = BX + 510*Cos10
CY.l = BY + 510*Sin10
DX.l = AX + 510*Cos10
DY.l = AY + 510*Sin10

Buffer = AllocateMemory(100000)                  ;100000 Bytes für die zu testende Datei

If OpenWindow(0, 0, 0, 900, 675, "Phasenraumplot", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TextGadget(0,200,10,500,20,"Zu testende Datei auswählen :",#PB_Text_Center)  
  ExplorerTreeGadget(1, 10, 30, 880, 620,"",#PB_Explorer_NoDriveRequester)

  Repeat
    Event=WaitWindowEvent()
    If Event=#PB_Event_CloseWindow
      End 
    EndIf   
  Until EventType()=#PB_EventType_LeftDoubleClick And GetGadgetState(1)=#PB_Explorer_File
 
  File$=GetGadgetText(1)

  ReadFile(0,File$)                              ;nur zum Lesen öffnen
  FileL=Lof(0)
  
  If FileL > 100000                              
    FileL = 100000                               ;hier auf 100000 Bytes begrenzt
  EndIf  

  ReadData(0, Buffer, FileL)

  If StartDrawing(WindowOutput(0))
    Box(0, 0, 900, 675, RGB(255,255,255))
    ;Z-Bemaßung
    LineXY(AX, AY, AX, 170)
    LineXY(45, 170, 55, 170)                     ;Querstrich +255
    LineXY(45, 298, 55, 298)                     ;Querstrich 0
    LineXY(45, 425, 55, 425)                     ;Querstrich -255
    DrawText(35 ,150, "( Z )")                   ;ist nicht die Achse, sondern die Bemaßung!
    DrawText(5, 165, "+255")
    DrawText(25, 290, "0")
    DrawText(5, 420, "-255")
    DrawText(475, 15, "Z", RGB(0, 0, 255), RGB(255, 255, 255))
    ;Y-Bemaßung
    LineXY(AX, AY, DX, DY)                       ;unten
    LineXY(BX, BY, CX, CY)                       ;oben
    YMXU = AX + (DX-AX)/2
    YMYU = AY + (DY-AY)/2
    YMXO = BX + (CX-BX)/2
    YMYO = BY + (CY-BY)/2
    LineXY(YMXU, YMYU, YMXO, YMYO, RGB(0, 0, 255))    ;blau
    DrawText(DX-40, DY, "( Y )")                 ;ist nicht die Achse, sondern die Bemaßung!
    DrawText(DX-10, DY+10, "+255")
    DrawText(YMXU-8, YMYU+3, "0")
    DrawText(AX-10, AY+5, "-255")
    DrawText(670, 535, "Y", RGB(0, 0, 255), RGB(255, 255, 255))
    ;X-Bemaßung
    LineXY(AX, AY, BX, BY)                       ;links
    LineXY(DX, DY, CX, CY)                       ;rechts
    XMXL = AX + (BX-AX)/2
    XMYL = BY + (AY-BY)/2
    XMXR = DX + (CX-DX)/2 
    XMYR = CY + (DY-CY)/2
    LineXY(XMXL, XMYL, XMXR, XMYR, RGB(0, 0, 255))    ;blau 
    DrawText(DX+10, DY-5, "( X )")               ;ist nicht die Achse, sondern die Bemaßung!
    DrawText(XMXR+5, XMYR, "0")
    DrawText(CX-10, CY-20, "-255")
    DrawText(335, 575, "X", RGB(0, 0, 255), RGB(255, 255, 255))
    ;"echte" Z-Achse  
    MXZ = YMXU + (YMXO-YMXU)/2  
    MYZ = YMYO + (YMYU-YMYO)/2   
   ;Nullpunkt = (MXZ, MYZ-AY+170+128)  
    MX = MXZ
    MY = MYZ-AY+170+128

;--------------------------------------------------------------------------------------------------
    For R=0 To FileL - 4
      T = PeekL(Buffer + R)

      A.c = T & 255
      B.c = T >> 8
      T>>8
      C.c = T >> 8
      T>>8
      D.c = T >> 8

      PX = A-B
      PY = B-C
      PZ = C-D

      PXX = MX - 0.75*PX*Sin60
      PXY = MY + 0.75*PX*Cos60
      
      PYX = PXX + PY*Cos10 
      PYY = PXY + PY*Sin10

      PZY = PYY - PZ/2
     
      Plot(PYX, PZY, RGB(255, 0, 0))             ;roten Punkt zeichnen
    Next 

    ;"echte" Z-Achse mit Koordinaten-Ursprung zur Orientierung nachträglich einzeichnen
    LineXY(MXZ, MYZ, MXZ, MYZ-AY+70, RGB(0, 0, 255))  ;blau  
    LineXY(MXZ-5, MYZ-AY+170+128,MXZ+5, MYZ-AY+170+128)
    DrawText(MXZ+5, MYZ-AY+170+128-8, "(0,0,0)")  

    StopDrawing()
  EndIf
  Repeat : Event = WaitWindowEvent() : Until  Event = #PB_Event_CloseWindow
EndIf
Gruß
Helle

Verfasst: 07.04.2008 21:29
von Fluid Byte
Beeindrucked wie immer! Bild