《密码技术与物联网安全:mbedtls开发实战》 —3.3.4 模逆运算

举报
华章计算机 发表于 2019/12/16 18:34:20 2019/12/16
【摘要】 本节书摘来自华章计算机《密码技术与物联网安全:mbedtls开发实战》 一书中第3章,第3.3.4节,作者是徐 凯 崔红鹏 。

3.3.4 模逆运算

和普通加法运算一样,模运算中对于每个整数也存在加法逆元,或称为负数。在模运算中整数a的加法逆元b是使得(a+b)mod n=0成立的值。同样,每个整数也存在乘法逆元,或称为倒数。在模运算中整数a的乘法逆元b满足(a·b)≡1 mod n。

表3-3为模8的加法计算结果,表3-4为模8的乘法计算结果。由于加法运算和乘法运算的交换性,从表3-3或表3-4可以看出,模加法和模乘法的计算结果均关于主对角线对称。关于模8的加法逆元可以通过浏览表3-3中值为0的项获得,例如3的加法逆元为5;而乘法逆元可以通过浏览表3-4中值为1的项获得,例如3的乘法逆元为3。

表3-3 关于模8的加法运算

image.png

 

表3-4 关于模8的乘法运算

   image.png

 

关于模8的乘法逆元结果可以看出,整数1、3和5存在关于模8的乘法逆元,而整数2、4和6不存在关于模8的乘法逆元,如表3-5所示。实际上,只有当a和m互为质数,也就是说gcd(a,m)=1时,才存在一个整数b且满足a·b≡1 mod m。此处3和8互为质数,5和8互为质数,而4和8并不存在互为质数的关系。

表3-5 关于模8的加法逆元和乘法逆元结果汇总

image.png

 

模乘法逆元可使用扩展欧几里得算法计算得到,具体算法可参考《深入浅出密码学—常用加密技术原理与应用》6.3.1节欧几里得算法和6.3.2节扩展的欧几里得算法。代码清单3-1是扩展欧几里得算法计算模乘法逆元的python脚本,可通过命令行输入参数计算得到模乘法逆元。该文件名称为eea.py,位于本书代码仓库scripts目录下。

代码清单3-1 计算模乘法逆元脚本 eea.py

import sys

 

n = int(sys.argv[1])

p = int(sys.argv[2])

 

def extended_euclid_algorithm(n, p):

    s, old_s = 0, 1

    t, old_t = 1, 0

    r, old_r = p, n

 

    while r != 0:

        quotient = old_r // r

        old_r, r = r, old_r - quotient * r

        old_s, s = s, old_s - quotient * s

        old_t, t = t, old_t - quotient * t

 

    return old_r, old_s, old_t

 

def inverse_of(n, p):

    gcd, x, y = extended_euclid_algorithm(n, p)

    assert (n * x + p * y) % p == gcd

 

    if gcd != 1:

        raise ValueError(

            '{} has no multiplicative inverse '

            'modulo {}'.format(n, p))

    else:

        return x % p

 

print(n, "^ -1 mod", p, "=", inverse_of(n, p))

计算7 mod 23的乘法逆元的代码如下:

$ cd scripts

$ python3 eea.py 7 23

# 输出

7 ^ -1 mod 23 = 10


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。