2016-09-15 2 views
1

私はAESを反転してミックスカラム演算を行い、GF(256)で14を乗算する必要があります。これは私が(pは結果とq 14で乗算する数である)が出ているものです:GFでの乗算(256)

#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

'//モジュロ'?しかし、14で乗算することは簡単です、14 = 8 + 4 + 2、従ってp =(q << 3)+(q << 2)+(q << 1); –

+0

GF(256)乗算を、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