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 );
}
posted @   linxr  阅读(1103)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示