Phasenraumplot

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Phasenraumplot

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Beeindrucked wie immer! Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten