2017-06-05 2 views
1

Je transcris un code C pour Matlab à partir d'une multiplication par 2 dans le champ Gallois, le problème est que mon code matlab n'affiche pas la même valeur que le code C. Apparemment tout va bien, j'ai commenté le code dans matlab pour identifier les adaptations du code C, en dessous des codes.Algorithme de champ de Galois de C à Matlab

C:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    unsigned char value = 0xaa; 
    signed char temp; 
    // cast to signed value 
    temp = (signed char) value; 
    printf("\n%d",temp); 
    // if MSB is 1, then this will signed extend and fill the temp variable with 1's 
    temp = temp >> 7; 
    printf("\n%d",temp); 
    // AND with the reduction variable 
    temp = temp & 0x1b; 
    printf("\n%d",temp); 
    // finally shift and reduce the value 
    printf("\n%d",((value << 1)^temp)); 
} 

sortie:

-86 
-1 
27 
335 

MatLab:

hex = uint8(hex2dec('1B'));      % define 0x1b 
temp = uint8(hex2dec('AA'));     % temp = (signed char) value; 
disp(temp); 
value = uint8(hex2dec('AA'));     % unsigned char value = 0xaa 
temp = bitsra(temp,7);       % temp = temp >> 7; 
disp(temp); 
temp = bitand(temp,hex);      % temp = temp and 0x1b 
disp(temp); 
galois_value = bitxor(bitsll(value,1),temp); % ((value << 1)^temp) 
disp(galois_value);        % printf ("\n%u",...)      

sortie:

170 

    1 

    1 

    85 

Le code C fonctionne correctement, j'imprime %d dans le code C pour afficher la valeur entière de la variable parce que la distribution dans le début du code.

Quelqu'un sait ce qui se passe

+1

Pourquoi pensez-vous que 'temp = uint8 (HEX2DEC ('AA'));' équivaut à 'temp = (signed char) valeur? –

+0

Vous devez regarder où les calculs commencent à diverger par eux-mêmes au lieu de nous le faire faire pour vous. –

+0

Ajoutez un 'printf' après chaque ligne dans C et' disp' dans MATLAB. –

Répondre

2

Essayez ceci:

hex = uint8(hex2dec('1B')); 

temp = typecast(uint8(hex2dec('AA')), 'int8'); 
disp(temp); 

temp = bitshift(temp,-7); 
disp(temp); 

temp = bitand(typecast(temp,'uint8'),hex); 
disp(temp); 

galois_value = bitxor(bitshift(uint16(hex2dec('AA')),1),uint16(temp)); 
disp(galois_value); 
+0

Comme je l'ai déjà dit, je n'ai pas créé le code C, il s'agit d'une bibliothèque de criptographie AES utilisée dans la série MSP430 MCU, devrais-je supposer que lorsque j'implémenterai le reste du code, le cryptage fonctionnera? Parce que la valeur de sortie de la fonction texas originale est différente, ce qui devait être 335 est maintenant 85. – Mutante

+0

@Mutante, désolé. J'ai raté que vous convertissez de C à Matlab. J'ai mis à jour mon message. Jetez un coup d'oeil s'il vous plaît. – wyc

+0

La fonction 'typecast' était très utile, je ne connaissais pas son existence, merci @wyc! – Mutante