zoukankan      html  css  js  c++  java
  • 从数学到密码学(十)

    数学基础(五)--群、环、域

    上一节后面提到几个关于元素阶的定理,为什么要强调元素的阶呢?因为由元素的阶可以产生所谓的离散对数问题(简称DLP),而DLP是密码学的数学基础之一。

    先回顾一下对数的概念,如果a的n次方等于b,那么称n是以a为底b的对数,给出a、b,要求n的值,就称为求解对数问题,简称对数问题。那群中的对数问题又是什么?

    前面已知,有限群中任意一个元素的阶都存在,并且元素的阶整除于群中元素的个数(即有限群的阶)。
    如果群中存在一个特殊的元素(假设记为a),满足:a的阶正好等于群的阶,则称此群为循环群,相应称a为循环群的生成元。

    生成元有什么用?设|a|=n=|G|,则可以证明,集合{1(单位元)、a1、a2、an-1}恰好等于集合G。如果我们定义a0=1,则
    生成元从0、1、2……n-1一直取幂,最终将得到(或生成)群中的所有元素。这也是称之为生成元的理由。
    很容易验证,Zn关于+运算是一个循环群,生成元就是[1]。

    现在可以回答循环群的对数问题了,对于循环群G,给出任意元素b和生成元a,求解满足ak=b的正整数k
    这一问题就称为此循环群上的DLP,相应地,称k为b关于a的离散对数

    对于某些特定的循环群,求解其上的DLP十分简单,比如对于群(Zn,+),任意元素[k]关于循环元[1]的DLP求解就很简单,其离散对数就是k本身。
    对于另外一些特殊的循环群,求解DLP则变得十分困难,后面即将碰到有限域,其上的DLP求解就是个例子。

    在讨论另一个代数概念--环--之前,我们先放松下,再来研究研究老朋友Zn。
    已知,Zn关于运算+构成一个(循环)(交换)群,我们再在Zn的元素之间定义一个新的运算法则*(通常称为乘法运算)如下:
    [i]*[j]≡[i*j],其中i、j为等价类的代表元素

    定理:Zn上的乘法运算*结果是唯一的,即*是等价类之间的一个代数运算
    证明:设A、B是Zn的等价类,i、j是A的代表元素,s、t是B的代表元素,故i~j,s~t
    根据~的定义,i=j+k*n,s=t+l*n(其中k、l∈Z),两式左右分别相乘,得
    i*s=j*t+p*n,其中p∈Z,根据定义,i*s~j*t,即[i*s]=[j*t],这说明[i]*[s]=[j]*[t]

    *运算满足以下性质:
    1、对于元素A,B,C∈Zn,有(A*B)*C=A*(B*C),即运算*满足结合律
    证明:分别取A、B、C的代表元a、b、c,则A*(B*C)=[a]*([b]*[c])=[a]*[b*c]=[a*b*c]
       同理(A*B)*C=([a]*[b])*[c]=[a*b]*[c]=[a*b*c],左右两边相等,得证

    2、[1]是Zn中(关于乘法)的单位元,即满足:[1]*A=A*[1]=A,其中A为Zn中任意元素

    现在我们把Zn上的加法+和乘法*运算一并考虑,发现满足左、右分配律:
    对任何A,B,C∈Zn,满足A*(B+C)=(A*B)+(A*C),(B+C)*A=(B*A)+(C*A)
    证明:A*(B+C)=[a]*([b]+[c])=[a]*[b+c]=[a*(b+c)]=[a*b+a*c]=[a*b]+[a*c]=[a]*[b]+[a]*[c]=A*B+A*C
    同理可证另一个分配律成立

    下面正式给出环的定义
    [环]:R是一个关于+(称为加法运算)的交换群,同时R上还存在另一个称为乘法的代数运算(用*表示),并且满足下列条件,则称R为一个环
    1、乘法*满足结合律:即对任何a、b、c∈R,有a*(b*c)=(a*b)*c
    2、加法+和乘法*满足左、右分配律. 即对任何a、b、c∈R,满足a*(b+c)=(a*b)+(a*c),(b+c)*a=(b*a)+(c*a)
    说明:
    1、我们完全可以把+称为乘法运算,把*称为加法运算,或者把+换为*,把*换成+,只是为了区分这2个代数运算。你现在能深深体会到,符号不重要,重要的是要表示的内容。
    2、括号是为了强调先进行其中的运算,如果我们人为对*赋予比+更高的运算优先级,就可以去掉部分括号,变为:a*(b+c)=a*b+a*c,(b+c)*a=b*a+c*a
    3、当我们进行环的乘法运算时,其代表符号*常省略不用,即我们直接用ab来表示a*b,这样可以更省一步,记为:a(b+c)=ab+ac,(b+c)a=ba+ca,a(bc)=(ab)c

    根据环的定义和上面已经证明的定理,可知Zn关于+、*构成环。

    [交换环]:环R若满足乘法交换律(即对运算*是可交换的),则称R为交换环。
    [含厶环]:环R如果关于乘法*存在单位元,则称R为含厶环。

    环Zn是交换环,也是含厶环。

    对于环而言,加法单位元可以不等于乘法单位元。比如环Zn就是如此。

    加法和乘法通过分配律纠缠到一起后,就产生了一些奇特的性质。

    定理:环的加法单位元e乘以任何元素(无论是左乘还是右乘)都等于加法单位元自身
    证明:任取a∈环R,根据加法单位元的性质,e+a*e=a*e=a*(e+e)=a*e+a*e,两边消去a*e,得a*e=e
    同理,e+e*a=e*a=(e+e)*a=e*a+e*a,两边消去e*a,得e*a=e。
    从这个意义上来说,加法单位元很像数字0(0乘以任何数都等于0),所以又称为乘法零元,并经常用符号0来表示。

    根据环的定义,环对于加法运算要求较高,必须构成加法交换群,但对于乘法运算没有这个要求,比如说不一定要构成乘法群
    对于Zn中的乘法,已知其满足群的四条性质中的三条(运算封闭、满足结合律、存在单位元),甚至还满足乘法交换律
    我们自然会想,是否存在逆元,即对于任意元素A∈Zn,是否存在元素B∈Zn,满足:A*B=[1]=B*A(如果满足的话就构成群)

    遗憾的是,这一结论并不成立,[0]就没有乘法逆元。我们注意到,[0]是加法的单位元,因而也是乘法零元
    定理:Zn的乘法零元[0]无逆元
    反证:设[0]存在逆元[x],[1]是Zn的乘法单位元,则[0]*[x]=[1],因而[0]=[1],矛盾。

    只好把[0]排除掉,我们自然进一步会问:Zn中排除[0]后剩下的元素,是否都有逆元?
    遗憾的是,这一结论仍不能普遍成立,举个反例,设n=6,取A=[4],则Z6={[0],[1],[2],[3],[4],[5]}中
    任何一个元素与A相乘(即进行*运算),都不会等于[1],从而A不存在逆元。读者可以手工一一验证。

    尽管如此,我们发现,将条件适当放宽,仍可以使Zn中的部分元素关于乘法运算*构成群。
    下面先给出定义:
    Zn*≡{[k]|(k,n)=1}
    说明
    1、符号(,)表示两个数的最大公因子(也称最大公约数)。此定义中,(k,n)=1表示k与n互素,换言之,k与n没有大于1的公因子
    2、可以证明,只要等价类中的任意一个元素与n互素,则该等价类中的任意元素都与n互素,因而代表元素的选择无关紧要
    举例:Z6*={[1],[5]},Z7*={[1],[2],[3],[4],[5],[6]}。Zn*是Zn的子集。

    定理:Zn*关于*运算构成群--通常称为乘法群。
    证明:根据群的定义,我们需要证明以下几个性质
    1、Zn*元素对于运算*封闭的,即对任意[a]、[b]∈Zn*,满足[a*b]∈Zn*
      直接验证,(a,n)=1且(b,n)=1,则由初等数论,可知(a*b,n)=1,即[a*b]∈Zn*
    2、对于运算*是可结合的。
      自然满足,见上面说明
    3、Zn*中存在单位元。
      单位元就是[1]
    4、对于任意[a]∈Zn*,存在X∈Zn*,满足[a]*X=[1]=X*[a]
      (a,n)=1,由初等数论,存在整数r,s,满足r*a+s*n=1并且(r,n)=1,从而[r*a+s*n]=[1]
      左边=[r*a]+[s*n]=[r]*[a]+[s]*[n]=[r]*[a]+[s]*[0]=[r]*[a]+[0]=[r]*[a],X=[r]就是[a]的逆元

    如果n=素数p,则Zp*=Zp-{[0]},即Zp除去[0]后的所有元素都可逆。

    [域]:一个具有乘法单位元的交换环R,若至少含有一个非零元,并且每个非零元a都可逆,则称R为一个域。
    换言之,乘法交换环R中除去乘法零元,剩下的元素关于乘法构成一个交换群,则称R为域。

    [有限域]:元素个数有限的域,称为有限域。

    对于素数p,Zp={[0],[1],[2]……[p-1]}是有限域。

    定理:有限域的乘法群是一个循环群。

    对于素数p,Zp*={[1],[2]……[p-1]}是循环群。
    事实上,这里的素数p,可以放宽到p的幂,我们就不再深究。

    前面我们已讨论在Zn中引入+运算后,等价类代表元素的选择,现在又引入*运算,代表元素的选择是否与原来的方案相容呢?
    继续按照以前的思路,[i]*[j]≡[i*j]——i,j仍然限制在0,n-1之间
    现在要计算i*j,仍将i*j除以n,得到余数r,r就是经过乘法运算后的等价类代表元素,证明如下
    设i*j=k*n+r,则i*j-r=k*n,由定义,i*j~r,从而[i*j]=[r],

    计算两个等价类的乘积,并得到对应的代表元素如下
    设等价类的代表元素分别为a、c,且b、d分别是a、c模n的余数,则[a]=[b],[c]=[d],[a*c]=[a]*[c]=[b]*[d]=[b*d]=[(b*d)(mod n)]
    换言之,求两个整数之积的模n的余数,可以先分别计算这两个整数模n的余数,然后把两个余数相乘,再对积取余数,就得到想要的结果。

  • 相关阅读:
    JavaScript(js)的replace问题的解决
    如何让Log4net日志文件按每月归成一个文件夹,StaticLogFileName参数的用法
    点到线的距离计算公式
    如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰
    Python如何动态的为对象添加方法或属性,__slots__用法
    Python生成器的用法,使用生成器灵活的生成斐波那契数列
    Python函数名做参数,闭包,装饰器
    Python迭代器的用法,next()方法的调用
    property用法,使Python中的get方法和set方法使用更简单
    python中for循环删除不全的问题
  • 原文地址:https://www.cnblogs.com/efzju/p/2165972.html
Copyright © 2011-2022 走看看