G(2^8)有限域
G(2^8)有限域上的运算
-----------------------------------------------------
本原多项式P(x) = x8+x4+x3+x2+1 [1 0001 1101]
定义 P(x) = 0 则 x8 = x4+x3+x2+1 [0 0001 1101]
-----------------------------------------------------
区间[0,255]可以表示成各种多项式。例如:
0 = 00000000 = 0
1 = 00000001 = x0 = 1
2 = 00000010 = x2
129 = 10000001 = x7+x
-----------------------------------------------------
加法:按位异或
-----------------------------------------------------
乘法:
3*7 = (x+1)*(x2+x+1)
= x*x2+x*x+x+x2+x+1
= x3+1
= 00001001
= 9
129*5 = (x7+1)*(x2+1)
= x9+x7+x2+1
= x5+x4+x3+x1 + x7+x2+1 ( 因为: x9 = x5+x4+x3+x1 )
= x7+x5+x4+x3+x2+x1+1
= 10111111
= 191
------------------------------------------------------
x的指数运算:可以得出x^i(i=0,1,2……),用于乘法运算。
x0 = 00000001 = 1
x1 = 00000010 = x1
x2 = 00000100 = x2
x3 = 00001000 = x3
x4 = 00010000 = x4
x5 = 00100000 = x5
x6 = 01000000 = x6
x7 = 10000000 = x7
x8 = 00011101 = x4+x3+x2+1
x9 = 00111010 = x1*x8 = x1*(x4+x3+x2+1) = x5+x4+x3+x1
x10 = 01110100 = x1*x9 = x1*(x5+x4+x3+x1) = x6+x5+x4+x2
x11 = 11101000
x12 = 11001101 = x1*(x7+x6+x5+x3) = x8+x7+x6+x4
= x4+x3+x2+1+x7+x6+x4
= x7+x6+x3+x2+1
x13 = 10000111
……
x8 = x4+x3+x2+1 = 29 = 00111010
x12= x7+x6+x3+x2+1 = 205 = 11001101
则: 29*205=x20
29/205 = x8/x12 = x251
205/29 = x12/x8 = x4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /*----------------------------------------------------- 用有限域实现加解密 本原多项式: 0x11B( x8+x4+x3+x+1 ) 明文: C[i] 密文: M[i] DEF : 加密乘法因子 或 解密被除数. 注:DEF不能为0 加密: M[i] = C[i] * DEF 解密: C[i] = M[i] / DEF */ int XN[256], NX[256]; void genlt() { int i, j; XN[0] = 1; for (i = 1; i < 256; i++){ j = ( XN[i-1] << 1) ^ XN[i-1]; if ((j & 0x100) != 0) j ^= 0x11B; XN[i] = j; } NX[0] = NX[1] = 0; for (i = 1; i < 255; i++) NX[XN[i]] = i; } int mul( int a, int b ) { if ( a==0 || b==0 ) return 0; else return XN[ (NX[a]+NX[b])%255 ]; } int div ( int a, int b ) { int x; if ( a==0 ) return 0; if ( b==0 ) return -1; x = NX[a]-NX[b] < 0 ? NX[a]-NX[b]+255 : NX[a]-NX[b]; return XN[x]; } void main() { genlt(); int i; unsigned char DEF = 2; unsigned char C[256], M[256], O[256]; sprintf ( ( char *)C, "zhongguo shi shufa de haiyang !" ); printf ( "%s\n" , C ); for ( i=0; i<256; i++ ){ M[i] = mul( DEF, C[i] ); } printf ( "%s\n" , M ); for ( i=0; i<256; i++ ){ O[i] = div ( M[i], DEF ); } printf ( "%s\n" , O ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述