日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gf(2 4)有限域的乘法c语言实现,有限域GF(2^n)的C语言实现浅析

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gf(2 4)有限域的乘法c语言实现,有限域GF(2^n)的C语言实现浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于項目的需要,在網上扒了半天,沒有找到域GF(2^n)的C語言實現的系統的介紹。本文試圖解釋偶特征有限域的實現,讓讀者不必像我一樣浪費太多時間在搜索中。本文以GF(2^8)為例。轉載請注明出處,謝謝!

甲、有限域的加法實現

簡單的異或運算即可:

unsigned char add(unsigned

char a, unsigned char b) {

return a ^ b;

}

乙、有限域的減法實現

與加法相同

unsigned char sub(unsigned char a, unsigned

char b) {

return a ^ b;

}

丙、有限域的乘法實現

算法簡介

輸入:8-bit數a,b,

輸出:8-bit數c

1、?設定c的初始值為0

2、?執行以下循環8次

(1)?如果b的最低位是1,則c與a做異或運算。

(2)?檢查a的最高位是否為1.

(3)?a左移一位,即舍棄最高位,最低位以0補充。

(4)?如果在上一步左移前,a的最高位是1,則a與十六進制數0x1b做異或運算。

(5)?b右移1位,即舍棄最低位,最高位以0補充。

3、c

就是a和b的乘積。

乘法偽代碼:

unsigned char mul(unsigned char a, unsigned char b) {

unsigned char p = 0;

unsigned char counter;

unsigned char hi_bit_set;

for(counter = 0; counter < 8; counter++) {

if((b & 1) == 1)

p ^= a;

hi_bit_set = (a & 0x80);

a <<= 1;

if(hi_bit_set == 0x80)

a ^= 0x1b;

b >>= 1;

}

return p;

}

例子?假設 .

1.?c

= 0; a = 7(0000 0111); b=3(0000 0011).

2.?進入8次循環

第一次循環

(1)?b

的最低位為1 , 故c=0^a=7.

(2)?a的值原來是7,

左移一位后a的值為14(0000 1110).

(3)?在a左移一位前,a=7(0000

0111), 顯然它的最高位不是1,因此不需要與十六進制數0x1b做異或運算。

(4)?b

右移一位,得b=1(00000001).

第二次循環

(1)?b

的最低位為1 , 故c=c^a=7^14=9.

(2)?左移一位后a的值為28(000

11100).

(3)?在a左移一位前,a=14(0000

1110), 顯然它的最高位不是1,因此不需要與十六進制數0x1b做異或運算。

(4)?b

右移一位,得b=1(00000000).

在第三到第八次循環中,b=0,最低位為0,c的值不再改變。

3.

最后c=9,返回c=9;

丁、有限域乘法的快速實現

1、指數表和對數表

有限域的非零元素構成一個Abel群,從而每個非零元素都可以用群的某個生成元素表示。GF(2^8)的生成元素有:

3 5

6 9 11 14 17 18 19 20 23 24 25 26 28 30 3133 34 35 39 40 42 44 48

49 60 62 63 65 69 70 71 72 73 75 76 78 79 82 84 86 8788 89 90 91 95

100 101 104 105 109 110 112 113 118 119 121 122 123 126 129 132134

135 136 138 142 143 144 147 149 150 152 153 155 157 160 164 165 166

167 169170 172 173 178 180 183 184 185 186 190 191 192 193 196 200

201 206 207 208 214215 218 220 221 222 226 227 229 230 231 233 234

235 238 240 241 244 245 246 248251 253 254 255

這些數的16進制表示:

03 05 06 09 0b 0e 11 12 13 14 17 18 19 1a 1c 1e

1f 21 22 23 27 28 2a 2c 30 31 3c 3e 3f 41 45 46

47 48 49 4b 4c 4e 4f 52 54 56 57 58 59 5a 5b 5f

64 65 68 69 6d 6e 70 71 76 77 79 7a 7b 7e 81 84

86 87 88 8a 8e 8f 90 93 95 96 98 99 9b 9d a0 a4

a5 a6 a7 a9 aa ac ad b2 b4 b7 b8 b9 ba be bf c0

c1 c4 c8 c9 ce cf d0 d6 d7 da dc dd de e2 e3 e5

e6 e7 e9 ea eb ee f0 f1 f4 f5 f6 f8 fb fd fe ff

2、利用指數表和對數表進行快速乘法

本方法需要事先存儲指數表和對數表,因此需要512Byte的內存。對AES來說,此方法對加密速度影響不大(最多只用3數乘法),但解密時(15數連乘),此方法可加快解密速度。

注意到,有限域GF(2^8)有256個數,但是,對數表只有255個數,這是因為0是一個比較特殊的數,任何數乘以0 都等于0.

unsigned

char ?Logtable[256]

=

{ 0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223,

3,

100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28,

193,

125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201,

9, 120,

101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218,

142,

150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70,

131, 56,

102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136,

145, 16,

126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61,

186,

43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115,

167, 87,

175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230,

173, 232,

44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169,

81, 160,

127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118,

123, 183,

204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41,

157,

151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63,

91, 209,

83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211,

171,

68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153,

227, 165,

103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247,

112, 7};

unsigned char?Alogtable[256]

=

{ 1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19,

53,

95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102,

170,

229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171,

230, 49,

83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178,

205,

76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120,

136,

131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73,

219, 118, 154,

181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97,

163,

254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32,

96, 160,

251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63,

65,

195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191,

218, 117,

159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122,

142, 137, 128,

155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67,

197, 84,

252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70,

202,

69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81,

243, 14,

18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242,

13, 23,

57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82,

246, 1};

快速乘法:

unsigned

char ?mul(unsigned char

a,unsignedchar

b) {

if (a && b)

return Alogtable[(Logtable[a] + Logtable[b])%5];

else return 0;

}

戊、

有限域除法實現

unsigned char ?div(unsigned char

a,unsigned?char b) {

int j;

if (b == 0) {

printf( "Division by zero\n" );

abort();

}

if (a == 0) return (0);

if ((j = Logtable[a] - Logtable[b]) < 0) j += 255;

return (Alogtable[j]);

}

己、逆元

unsigned char?inv(unsigned

char?in) {

if(in == 0)?return 0;

else

return Alogtable[(255 -

Logtable[in])];

}

總結

以上是生活随笔為你收集整理的gf(2 4)有限域的乘法c语言实现,有限域GF(2^n)的C语言实现浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。