Christoph Zurnieden: Integer Variable wie in C

Beitrag lesen

Hi,

also der C-Code passte von anfang an (laut Testvektoren).

Aber nur auf PC-Hardware.

Das umständliche %4Mrd etc. war nur damit ich den gleichen Effekt bei JavaScript erhalten (überlauf).

Aber nur auf PC-Hardware.

Was beim C Programm sowieso entfallen kann, sofern man keine 16/64 Bit Plattform benutzt.

Oder andere als 2s-Complement Little Endian Hardware, z.B. Embededware.

Das ist aber jetzt nicht mehr nötigt, so das ich den schlanker, von Wikipedia stammen Quellcode benutzen kann.

Der ist ebenfalls nicht korrekt.
Es kostet wirklich kaum Arbeit, den Code standardkonform und damit portabel zu machen, warum sträubst Du Dich mit Händen und Füßen dagegen?
Vor allem bewgst Du Dich auf kryptographischem Boden, da ist mehr als nur bloße Vorsicht geboten!

Naja bei JavaScript lag es nur daran, dass ein Integer Variable mehr als 32 Bit (auf dem gleichen Prozessor) speichern kann.

Das kann C auch. Sämtliche Größenangaben sind _nur_ Mindestangaben.

Wenn man aber nur die letzten 32 Bit betrachtet, läuft der Script so wie der C-Programm.

Nur, wenn Du auch bei C nur die letzten 32 Bit betrachtest und dafür sorgst, das die Variablen auch mindestens 32 Bit halten können.

Manchmal sollte man sich die Ausgabe doch Hexadezimal anstatt Integer sein, würde viel Zeit ersparen ^^.

Manchmal sollte man gleich standardkonform arbeiten, würde viel Zeit sparen.
Hättest Du den C-Code standardkonform geschrieben und danach in Javascript übersetzt hätte es erst gar keinen Fehler gegeben. Ist der C-Code immer noch nicht standardkonform paßt er jetzt übrigens nicht mehr zur Javascriptimplementation.

Und weil ich nicht so bin, gibt's hier eine standardkonforme C-Implementation. (die mögliche 64 Bit Implementation erspare ich Dir mal, Du sollst das ja auch nachvollziehen können.)

  
#include <stdint.h>  
#include <stdio.h>  
#include <stdlib.h>  
  
/*  
  Das Macro _LITTLE_ENDIAN_ ist zur Bauzeit zu setzen.  
  Entweder händisch oder per [link:http://autoconf-archive.cryp.to/ac_c_bigendian_cross.html@title=Autoconfmacro]  
*/  
  
#ifdef _LITTLE_ENDIAN_  
  
#ifndef XTEA_FAILURE  
  #define XTEA_FAILURE 0  
#endif  
#ifndef XTEA_SUCCESS  
  #define XTEA_SUCCESS 1  
#endif  
  
int encrypt(uint_least32_t *v, uint_least32_t *k);  
int decrypt(uint_least32_t *v, uint_least32_t *k);  
  
int encrypt(uint_least32_t *v, uint_least32_t *k){  
  uint_least32_t v0  = 0, v1    = 0;  
  uint_least32_t sum = 0, delta = 0x9E3779B9;  
  
  if(NULL == v || NULL == k) return XTEA_FAILURE;  
  
  v0 = v[0] & 0xFFFFFFFF;  
  v1 = v[1] & 0xFFFFFFFF;  
  
  for(int i=0; i<32; i++){  
    v0 += (  ((v1<<4 ^ v1>>5) +v1)  
           ^ (sum + k[sum & 3])  
          ) & 0xFFFFFFFF;  
    sum = (sum + delta) & 0xFFFFFFFF;  
    v1 += (  ((v0<<4 ^ v0>>5) +v0)  
           ^ (sum + k[sum>>11 & 3])  
          ) & 0xFFFFFFFF;  
  }  
  v[0] = v0;  
  v[1] = v1;  
  
  return XTEA_SUCCESS;  
}  
  
int decrypt(uint_least32_t *v, uint_least32_t *k){  
  uint_least32_t v0  = 0, v1    = 0;  
  uint_least32_t sum = 0xC6EF3720, delta = 0x9E3779B9;  
  
  if(NULL == v || NULL == k) return XTEA_FAILURE;  
  
  v0 = v[0] & 0xFFFFFFFF;  
  v1 = v[1] & 0xFFFFFFFF;  
  
  for(int i=0; i<32; i++){  
    v1 -= (  ((v0<<4 ^ v0>>5) +v0)  
           ^ (sum + k[sum>>11 & 3])  
          ) & 0xFFFFFFFF;  
    sum = (sum - delta) & 0xFFFFFFFF;  
    v0 -= (  ((v1<<4 ^ v1>>5) +v1)  
           ^ (sum + k[sum & 3])  
          ) & 0xFFFFFFFF;  
  }  
  v[0] = v0;  
  v[1] = v1;  
  
  return XTEA_SUCCESS;  
}  
#endif  
#ifdef _XTEA_TEST_  
int main(){  
  uint_least32_t v[2] = {0x41424344,0x45464748};  
  uint_least32_t k[4] = {0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f};  
  
  if(encrypt(v,k) == XTEA_FAILURE)  
    exit(EXIT_FAILURE);  
  printf("4142434445464748\n%8.8X%8.8X\n",v[0],v[1]);  
  
  if(decrypt(v,k) == XTEA_FAILURE)  
    exit(EXIT_FAILURE);  
  printf("497DF3D072612CB5\n%8.8X%8.8X\n",v[0],v[1]);  
  
  exit(EXIT_SUCCESS);  
}  
#endif  

Ich hoffe mich nirgendwo vertippelt zu haben, ich hatte keine Lust die Sparcstation anzuschmeißen.

so short

Christoph Zurnieden