XTEA für *sehr* exotische Platform

Hallo Leute!

Ich suche momentan eine C Implementation des XTEA Algorithmusses, aber, und hier liegt das Problem, für eine sehr exotische Platform.

Folgende Einschränkungen:
-Keine Pointer/Zeiger
-Nur 16-Bit Integers (mit Vorzeichen) vorhanden, keine 32 oder 64 Bit Integers
-Keine Arrays

Naja vielleicht hat ja einer Zeit und Lust sich da mal ranzusetzen.

Hier mal die Referenzimplementation von hier:
Code:
void encipher(const unsigned long *const v,unsigned long *const w,
   const unsigned long * const k)
{
   register unsigned long       y=v[0],z=v[1],sum=0,delta=0x9E3779B9,n=32;

   while(n-->0)
      {
      y += (z << 4 ^ z >> 5) + z ^ sum + k[sum&3];
      sum += delta;
      z += (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3];
      }

   w[0]=y; w[1]=z;
}

void decipher(const unsigned long *const v,unsigned long *const w,
   const unsigned long * const k)
{
   register unsigned long       y=v[0],z=v[1],sum=0xC6EF3720,
				delta=0x9E3779B9,n=32;

   /* sum = delta<<5, in general sum = delta * n */

   while(n-->0)
      {
      z -= (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3];
      sum -= delta;
      y -= (z << 4 ^ z >> 5) + z ^ sum + k[sum&3];
      }
   
   w[0]=y; w[1]=z;
}
 
Hallo,
das einzige Problem ist doch nur das 16 Bit Integer. Dort kann man das 32 Bit Wort einfach in zwei Blöcke zerlegen und muss dann die Operationen entsprechend anpassen.

Für Arrays kann man stattdessen auf if nutzen.


Ich würde dir empfehlen, für z.B. z << 4 eine Funktion (am besten für Precompiler) zu schreiben, im Muster.
leftRotate(z1, z2);

Code:
//Muster - Ungetestet
leftRotate(int x1, int x2, int shift) {
   x1 =  (x1 << 4) | (x2 & (0xF000));
   x2 = x2 << 4;
}

Für rightRotate dann ähnlich.
 
Im Windows gibt es übrigens auch die sehr schnelle Möglichkeit mit Assembler (ror oder rol) um z.B. einen Integer rotieren zu lassen.
 
Naja Thank God - BASIC++ kennt UDTs :)
Das macht die Sache um einiges Einfacher :)

Elderan, genau sowas habe ich gesucht! Jetzt brauch ich nur noch Shr, Xor und Addition :D - Ich habs leider nicht so mit Mathe und binären Zahlen. Brauche aber einen brauchbaren (was für eine Wortwahl!) Verschlüsselungsalgorithmus für eine Hardwareplattform...

Okay sum und delta sind ja kein Problem; habe einfach folgenden Typen für 32 Bit Ints konstruiert:
Code:
type DWord
     low as word
     high as word
end type
und sum+delta so zugewiesen:
Code:
xtea_sum.low=C6EFh
         xtea_sum.high=3720h
         xtea_delta.low=9E37h
         xtea_delta.high=79B9h

Okay
Aber bei den Shl, Shr, Xor, und Additionsfunktionen gibts bei mir jetzt eben noch Verständnissprobleme... plz Help - verstehe auch deine angehängte Funktion nicht so ganz...
Warum soll den x1 gleich x1 Shl 4 Or x2 And F000h sein!? - Verstehe ich nicht

@jmc:
Sry aber - "XTEA für *sehr* exotische Platform"
Klar es gibt Architekturen die sogar Rol/Ror nativ unterstüzten (AMD64 und IA64 meines Wissens nach) - aber ein Microcontroller (Motorola MH64C oder so ähnlich) mit knappen 240 Bytes RAM - Wohl eher weniger...
 
Hallo,
wäre schön, zu erfahren, warum es sich erledigt hat. Hast du es portiert (wenn ja, wäre nett wenn du es posts).

Ansonsten:
XOR sollte nicht das Problem sein.

aus
a = b ^ c;

wird
a1 = b1^c1;
a2 = b2^c2;

Bei Addition bin ich gerade noch am Grübeln, wie man den Übertrag hinbekommt.


Und rightshift ist ähnlich wie left shift, muss sich nur mal angucken wie sich das so verhält.
 
Es hat insofern erledigt, als dass ich es nicht mehr brauche, da ich in einem anderen Forum einen "Binärgott" gefunden habe :D
 
Zurück
Oben