2016-09-15 2 views
1

저는 AES를 뒤집습니다. mixcolumns 연산을 반전하고 GF (256)에서 14를 곱해야합니다. 이것은 내가 (p는 결과와 q (14)에 의해 번식하는 번호)와 함께 온 것입니다 :GF (256)에서 14 배 곱하기

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <unistd.h> 
int main() 
{ 
    uint8_t p=1, q=0x02; 
    p = (q<<1)^(q<<2)^(q<<3);//*(x³+x²+x) 
    //modulo x⁸+x⁴+x³+x+1 
    if((q>>5)<5&&(q>>5)!=0&&(q>>5)!=3) 
     p^=0x1B; 
    if((q>>5)>1&&(q>>5)<6) 
     p^=0x36; 
    if((q>>5)>3) 
     p^=0x6C; 
    printf("\n\n\t%2.2X\n\n",p); 
    return 0; 
} 

그것은 작동하지만 나는이 작업을 수행 할 수있는 간단한 방법이 있다고 생각하지만 난 그것을 찾을 수 없습니다 . 여기에서 가장 중요한 문제는 6 번의 비교를한다는 것입니다.

+0

// modulo? 그러나 14로 곱하면 14 = 8 + 4 + 2이므로 p = (q << 3) + (q << 2) + (q << 1); –

+0

GF AES 표준에 의해 지정된대로 x8 + x4 + x3 + x + 1 인 환원 가능 다항식을 모듈로 곱한다. –

답변

2

여기에서 가장 중요한 문제는 6 가지 비교를하는 것입니다.

모든 비교를 피하기 위해 룩업 테이블을 사용하십시오. q>>5은 3 비트입니다.

static const uint8_t Table1B[8] = { 0, 0x1B, 0x1B, 0, 0x1B, 0, 0, 0 }; 
static const uint8_t Table36[8] = { 0, 0, 0x36, 0x36, 0x36, 0x36, 0, 0 }; 
static const uint8_t Table6C[8] = { 0, 0, 0, 0, 0x6C, 0x6C, 0x6C, 0x6C }; 

q >>= 5; 
p ^= Table1B[q]; 
p ^= Table36[q]; 
p ^= Table6C[q]; 

가능성이 1 표를 단순화 할 수 있습니다 : Table[0] = Table1B[0]^Table36[0]^Table6C[0] 등 내가 비교의 필요성을 이해하지만 더는 주석을 포함하고 있기 때문에 당신이 요구하는 것보다 코드에 존재하지 않는

p ^= Table[q >> 5]; 
+0

성능이 향상 될까요? xoring 0은 기계어 코드를 어떻게 작동합니까? –

+0

@ 2A-66-42 "성능이 향상 될 것입니다"가능성이 있습니다. 테스트 (프로파일 링)가 표시됩니다. 결정하려면 플랫폼, 컴파일러, 사용 된 옵션 및 완전한 테스트 케이스 코드를 제공해야합니다. "xoring 0은 기계 코드를 현명하게 작동합니까?" 'p^= some_variable_that_happens_to_be_0'는'p^= any_variable'만큼 많은 시간이 걸립니다. 'p^= a_constant_0;'는 확실히 NOP에 최적화되어 있습니다. – chux