信息安全数学基础——求a模p*q的指数

本文介绍了如何利用欧拉定理和指数的基本性质,结合Python编程解决信息安全数学基础中的问题——求解整数a模两个奇素数p和q乘积的指数。通过设计算法分别找出a模p和a模q的指数,然后计算它们的最小公倍数作为最终答案。博客提供了详细的数学背景、算法描述及代码实现。
摘要由CSDN通过智能技术生成

仔细想来转专业到计算机学院还没发过博客,就把上学期刚做过的小作业分享一下

内容关键词:信息安全数学基础,求a模p*q的指数,python实现

  • 问题描述

原题如下:

 (题目源自陈恭亮老师的《信息安全数学基础》)

即已知两个不同的奇素数p和q,也已知一个整数a(a不是q或p的倍数,否则无解),在已知三个数的情况下,求出a模p*q的指数.

  • 数学基础

要认识问题,首先要清楚以下概念与定理。

欧拉函数:

         设p是一个正整数,则p个整数1,2,……,p-1,p中与p互素的整数个数,记作φ(p),即欧拉函数。若p为素数,那么显然φ(p)=p-1.

指数定义:

设p>1是整数,a是与p互素的正整数,则使得a^e≡1(mod p) 成立的最小正整数e叫做ap的指数,记作ordp(a).

(显然,在本题中,由于pq都为奇素数,所以ap互素且aq互素。则存在ordp(a)ordq(a)。)

欧拉定理:

         设p>1是整数,a是与p互素的正整数,则 a^φ(p) 1 (mod p).

要分析问题,还要清楚以下性质。

指数的基本性质:

         p>1是整数,a是与p互素的整数,则整数d使得 a^d ≡ 1 (mod p)的充分必要条件为  ordp(a) | d .

         若(mn=1, ordmn(a)=[ordm(a),ordn(a)]

       推论:

      p>1是整数,a是与p互素的整数,则 ordp(a) | φ(p).

同余式的基本性质:

    设m 是一个正整数,设a ≡ bmod m),如果d | m, a≡bmod d)。

  • 算法描述

数学层面分析问题:不妨设 e = ordp*q(a) , m=ordp(a), n=ordq(a).

则有下面如下等式:

a^e≡1 (mod p*q)

a^m≡1(mod p)

a^n≡1 (mod q)

(且e,m,n分别为a模p*q,p,q的指数)

再由上文性质,因为p|p*q,q|p*q, 不难得到:

    a^e≡a^m≡1(mod p), a^e≡a^n≡1(mod q)

又因为m和n分别是满足对应等式的最小正整数,e也是满足对应等式的最小正整数,所以e应该等于m和n的最小公倍数。

    算法层面描述:

  1. 首先应设计一个函数用于求解任意整数x模奇素数y的指数:令i从1开始遍历直至y-1,当i可以整除y-1时,计算(x^i)模y是否为1,若结果为1,则此时i即为x模y的指数,return i。通过该函数,即可求出上文的m和n。
  2. 在求出m和n之后,应设计一个算法用于计算m和n的最小公倍数e,显然e的大于或等于max(m,n),小于或等于m*n。所以设计如下算法:令i从max(m,n)遍历至m*n,当i既能被m整除,也能被n整除时,return i。此时将i值赋给e,则求出了a模p*q的指数e。
  3. 最后可以额外设计一个函数进行输入检验,当输入的p或q不是奇素数时进行报错,并令使用者重新输入。

四、算法实现

1.xy指数的函数代码:

#求出xy的指数并返回

def index(x,y):

    for i in range(1,y):

        if (y-1)%i==0:

            if (x**i)%y==1:

                return i

2.xy最小公倍数的函数代码:

#求出xy的最小公倍数并返回

def common(x,y):

    f=x*y

    if x>=y:

        for i in range(x,f+1):

            if i%x==0 and i%y==0:

                return i

    if x<y:

        for i in range(y,f+1):

            if i%x==0 and i%y==0:

                return i

3.检验输入数字x是否为奇素数的函数代码:

#检验x是否为奇素数

def check(x):

    if x%2==0:

        return False

    for i in range(2,x):

        if x%i==0:

            return False

    return True            

4.主函数部分:

#主函数部分

k=1

while k:

    a=int(input("请输入正整数a:"))

    p=int(input("请输入奇素数p:"))

    q=int(input("请输入另一个奇素数q:"))

    if check(q) and check(p):#qp全是奇素数时进行运算

        m=index(a,p)

        n=index(a,q)

        e=common(m,n)

        print("apq的指数为:",e)

    else:

        print("pq并不全是奇素数")

    k=int(input("输入1继续,输入0退出:"))

#求出x模y的指数并返回
def index(x,y):
    for i in range(1,y):
        if (y-1)%i==0:
            if (x**i)%y==1:
                return i
#求出x和y的最小公倍数并返回
def common(x,y):
    f=x*y
    if x>=y:
        for i in range(x,f+1):
            if i%x==0 and i%y==0:
                return i
    if x<y:
        for i in range(y,f+1):
            if i%x==0 and i%y==0:
                return i
#检验x是否为奇素数
def check(x):
    if x%2==0:
        return False
    for i in range(2,x):
        if x%i==0:
            return False
    return True            
#主函数部分
k=1
while k:
    a=int(input("请输入正整数a:"))
    p=int(input("请输入奇素数p:"))
    q=int(input("请输入另一个奇素数q:"))
    if check(q) and check(p):#当q和p全是奇素数时进行运算
        m=index(a,p)
        n=index(a,q)
        e=common(m,n)
        print("a模p*q的指数为:",e)
    else:
        print("p或q并不全是奇素数")
    k=int(input("输入1继续,输入0退出:"))

把之前写的复制了一下,估计问题不大

代码就是照着数学证明流程来的,没什么技巧

嗯,差不多就这样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值