.

Für allgemeine Fragen zur Programmierung mit PureBasic.
NoUser

.

Beitrag von NoUser »

.
Zuletzt geändert von NoUser am 01.09.2012 07:18, insgesamt 2-mal geändert.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: TEA C++ nach PureBasic

Beitrag von DarkDragon »

Hallo,

Eine 1:1 Übersetzung ist kaum möglich. Daher die 3 Funktionen mit Inline Assembler. Die Shifts sind lediglich logische Shifts, keine arithmetischen und das XOr gibt es erstaunlicherweise nicht in PureBasic (obwohl ich mich an etwas derartiges erinnere).

(Korrigierte Version siehe unten)
Zuletzt geändert von DarkDragon am 17.06.2012 13:13, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
NoUser

Re: TEA C++ nach PureBasic

Beitrag von NoUser »

.
Zuletzt geändert von NoUser am 01.09.2012 07:18, insgesamt 1-mal geändert.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: TEA C++ nach PureBasic

Beitrag von DarkDragon »

marroh hat geschrieben:Zum C++ Code hätte ich da noch ein zwei Verständnis fragen:

^ ist in PureBasic Pow()?
+= entspricht in PureBasic einem x = x + ... ?
<< und >> sind also immer logische und keine arithmetischen Shifts oder kann dass auch anders sein?
^ ist in PureBasic anscheinend nicht vorhanden. Das entspricht meiner LogicXOR Funktion und führt ein bitweises, exklusives Oder aus.
x += y ist in PureBasic x = x + y, aber PureBasic versteht auch ein einfaches x + y.
<< und >> sind arithmetische Shifts, allerdings gibt es in PureBasic keine unsigned Datentypen für 32- und 64bit Ganzzahlen. Da unsigned Datentypen kein Vorzeichen haben kommt ein arithmetischer Shift hierbei dem logischen Shift gleich.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
NoUser

Re: TEA C++ nach PureBasic

Beitrag von NoUser »

.
Zuletzt geändert von NoUser am 01.09.2012 07:18, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: TEA C++ nach PureBasic

Beitrag von ts-soft »

Als 64-Bit kompiliert funktioniert es gut :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: TEA C++ nach PureBasic

Beitrag von DarkDragon »

Ah .. ebx ist ja reserviert, setze es um auf ecx:

Code: Alles auswählen

Procedure.l ShiftLR(Value.l, Bits.b)
  !MOV eax, dword [p.v_Value]
  !MOV cl, byte [p.v_Bits]
  !SHR eax, cl
  !MOV dword [p.v_Value], eax
  
  ProcedureReturn Value
EndProcedure

Procedure.l ShiftLL(Value.l, Bits.b)
  !MOV eax, dword [p.v_Value]
  !MOV cl, byte [p.v_Bits]
  !SHL eax, cl
  !MOV dword [p.v_Value], eax
  
  ProcedureReturn Value
EndProcedure

Procedure.l LogicXOR(A.l, B.l)
  !MOV eax, dword [p.v_A]
  !MOV ecx, dword [p.v_B]
  !XOR eax, ecx
  !MOV dword [p.v_A], eax
  
  ProcedureReturn A
EndProcedure

Procedure TeaEncrypt(*InData.Long, *OutData.Long, *Key.Long)
  Protected.l y = PeekL(*InData)
  Protected.l z = PeekL(*InData + SizeOf(Long))
  Protected.l sum = 0
  Protected.l delta = $9E3779B9
  Protected.l a = PeekL(*Key)
  Protected.l b = PeekL(*Key + SizeOf(Long))
  Protected.l c = PeekL(*Key + SizeOf(Long) * 2)
  Protected.l d = PeekL(*Key + SizeOf(Long) * 3)
  Protected.l n = 32
  
  While n > 0
    n - 1
    sum + delta
    y = y + LogicXOR(LogicXOR(ShiftLL(z, 4) + a, z + sum), ShiftLR(z, 5) + b)
    z = z + LogicXOR(LogicXOR(ShiftLL(y, 4) + c, y + sum), ShiftLR(y, 5) + d)
  Wend
  
  PokeL(*OutData, y)
  PokeL(*OutData + SizeOf(Long), z)
EndProcedure

Procedure TeaDecrypt(*InData.Long, *OutData.Long, *Key.Long)
  Protected.l y = PeekL(*InData)
  Protected.l z = PeekL(*InData + SizeOf(Long))
  Protected.l sum = $C6EF3720
  Protected.l delta = $9E3779B9
  Protected.l a = PeekL(*Key)
  Protected.l b = PeekL(*Key + SizeOf(Long))
  Protected.l c = PeekL(*Key + SizeOf(Long) * 2)
  Protected.l d = PeekL(*Key + SizeOf(Long) * 3)
  Protected.l n = 32
  
  While n > 0
    n = n - 1
    z = z - LogicXOR(LogicXOR(ShiftLL(y, 4) + c, y + sum), ShiftLR(y, 5) + d)
    y = y - LogicXOR(LogicXOR(ShiftLL(z, 4) + a, z + sum), ShiftLR(z, 5) + b)
    sum - delta
  Wend
  
  PokeL(*OutData, y)
  PokeL(*OutData + SizeOf(Long), z)
EndProcedure

Define TestValueDecrypted1.q = $DEADBEEFCAFEBABE
Define TestValueEncrypted.q
Define TestValueDecrypted2.q

Dim Key.l(3)
Key(0) = $12345678
Key(1) = $12345678
Key(2) = $12345678
Key(3) = $12345678

TeaEncrypt(@TestValueDecrypted1, @TestValueEncrypted, @Key(0))
TeaDecrypt(@TestValueEncrypted, @TestValueDecrypted2, @Key(0))

Debug Hex(TestValueDecrypted1, #PB_Quad)
Debug Hex(TestValueEncrypted, #PB_Quad)
Debug Hex(TestValueDecrypted2, #PB_Quad)
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: TEA C++ nach PureBasic

Beitrag von NicTheQuick »

Ein bitweises XOr geht in PB mit '!'. Schon immer. Und Shift gibt es in PB auch.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: TEA C++ nach PureBasic

Beitrag von DarkDragon »

NicTheQuick hat geschrieben:Ein bitweises XOr geht in PB mit '!'. Schon immer.
Das habe ich gesucht.
NicTheQuick hat geschrieben:Und Shift gibt es in PB auch.
Ja, aber wie gesagt nur arithmetisches Shifting.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
NoUser

Re: TEA C++ nach PureBasic

Beitrag von NoUser »

.
Zuletzt geändert von NoUser am 01.09.2012 07:18, insgesamt 1-mal geändert.
Antworten