Java 密码学中关于一组整数Z*p中元素顺序的群论

Java 密码学中关于一组整数Z*p中元素顺序的群论,java,cryptography,number-theory,elliptic-curve,Java,Cryptography,Number Theory,Elliptic Curve,我有点陷入群论的深渊,我对我上的密码学课有点迷茫。 基本上,我必须用java实现的一个实用程序是 顺序(素数、因子列表) p-1,任何a) 这将返回组Z*p中a的顺序,其中f是p-1的素因子列表。确保当f包含重复项时,方法有效。例如,考虑p=17</p>的情况。 以下是我到目前为止所做的(摘自笔记中的步骤) 公共静态BigInteger顺序(BigInteger p、列表f、BigInteger a){ //算法是这样开始的 //首先将t设置为p-1,即t=p1 p2…pn BigInteger

我有点陷入群论的深渊,我对我上的密码学课有点迷茫。 基本上,我必须用java实现的一个实用程序是

顺序(素数、因子列表) p-1,任何a)

这将返回组Z*p中a的顺序,其中f是p-1的素因子列表。确保当f包含重复项时,方法有效。例如,考虑p=17</p>的情况。 以下是我到目前为止所做的(摘自笔记中的步骤)

公共静态BigInteger顺序(BigInteger p、列表f、BigInteger a){
//算法是这样开始的
//首先将t设置为p-1,即t=p1 p2…pn
BigInteger t=p.subtract(BigInteger.ONE);
对于(BigInteger pi:f){
//测试a^t1=1模p,其中t1=t/pi
大整数t1=t除以(pi);
if(Practical5ExponentiationModMSquareAndMultiply.expm(p,a,t1).equals(biginger.ONE)){
t=t1;
System.out.println(“mod=“+t”之后的t);
System.out.println(“mod=“+pi”后的pi);
}
}       
返回t;
}
素因子f的列表由另一种方法生成,然后传入

我的笔记很难理解,我想知道是否有人能告诉我应该归还什么。
另外,你能给我一个可能的理解群体理论的片段,因为它可以帮助我进一步的实践

你在寻找最小的数
o
,这样
a^o==1(mod p)
,即最小的数
o
使得
p
除以
a^o-1

你需要的群论结果是,整数的乘法群mod p是p-1阶循环的。这意味着:

  • 顺序
    o
    除以
    p-1
    并满足
    a^o==1(mod p)
  • 顺序
    o
    是满足上述条件的最小数字
因此,您可以通过取
p-1
的素因子,并重复将
p-1
除以它们,直到
p
除以
a^n-1
不再成立,从而找到顺序

示例1:p=13,p-1=2*2*3,a=5

对于p=2,5^(12/2)==12(mod 13),因此不能丢失顺序中的2

对于p=3,5^(12/3)==1(mod 13),因此可以按顺序丢失3

因此,顺序是2*2=4

给您的示例(p=17)是另一个说明性案例:

示例2:p=17,p-1=2*2*2*2,a=9

9^(16/2)==1(mod 17),因此您可能会丢失前2个

9^(16/4)==16(mod 17),因此您不能丢失第二个2,并且可以停止搜索

因此,顺序是2*2*2=8


希望这足以让你看到算法。

为这个答案欢呼,但是从这个算法中,我如何找到一个生成器alpha,它是
Z*p
的一个元素,其中p是素数?所以我知道,
euler(p)=p-1
因此,如果
ord(alpha)=p-1
循环群的生成器是阶数等于群大小的元素,那么aplha就是一个生成器,所以你需要寻找阶数为p-1的a。请注意,它们有很多,所以不需要花很长时间就可以找到一个。因此,一个简单的循环就足够了。只要你找到一个就逃离这个循环。不过我觉得很难,现在就进入DLP!!
public static BigInteger order(BigInteger p, List<BigInteger> f, BigInteger a){
    //Algorithm starts like this
    //Start by setting t equal to p-1 i.e t= p1 p2...pn
    BigInteger t = p.subtract(BigInteger.ONE);
    for(BigInteger pi : f){
        //test if a^t1 = 1 mod p where t1 = t/pi
        BigInteger t1 = t.divide(pi);

        if(Practical5ExponentiationModMSquareAndMultiply.expm(p, a, t1).equals(BigInteger.ONE)){
            t = t1;
            System.out.println("t after mod = "+t);
            System.out.println("pi after mod = "+pi);
        }
    }       
    return t;

}