当前位置: 首页 > news >正文

拉宾公钥密码算法实现

拉宾公钥密码算法实现

    • (一) 算法原理
      • 1.1 密钥生成
      • 1.2 加密步骤
      • 1.3 解密步骤
    • (二) 算法设计
      • 2.1 密钥生成的设计与实现
      • 2.2 加密的设计与实现
      • 2.3 解密的设计与实现
    • (三)测试
      • 3.1 完整源码
      • 3.2 运行结果


(一) 算法原理


1.1 密钥生成

在这里插入图片描述

1.2 加密步骤

在这里插入图片描述

1.3 解密步骤

在这里插入图片描述


(二) 算法设计


2.1 密钥生成的设计与实现

# 生成一个大素数p
def generate_p():while True:# 使得p也在150位,p = 2t + 1时p为强素数,即t=p/2-1t = sympy.randprime(10**149, 10**150 / 2 - 1)if sympy.isprime(t):p = 2 * t + 1if len(str(p)) == 150 and sympy.isprime(p) and (p % 4 == 3):breakreturn p

2.2 加密的设计与实现

# 快速幂模运算(大指数的模运算),计算a^e mod m
def fastExpMod(a, e, m):a = a % mres = 1while e != 0:# if e & 1的判断是一种位运算,用于检查整数e的最低位是否为1。在二进制表示中,如果一个整数的最低位(最右边的位)是1,那么这个数就是奇数;如果最低位是0,那么这个数就是偶数。因此,if e & 1的判断常用于检查e是否为奇数。如果e & 1的结果为1,那么e就是奇数;如果结果为0,那么e就是偶数# 如果e是奇数,a^e=a^(e-1)*a,a^(e-1)可通过循环进行平方计算,还差个a直接乘进resif e & 1:res = (res * a) % me >>= 1  # 右移一位,相当于将 e 除以 2# a, a^2, a^4, a^8, ... , a^(2^n)a = (a * a) % mreturn res# 加密
def encode(m, n):c = m**2 % nreturn c

2.3 解密的设计与实现

# 孙子定理
def theorem(b1, b2, p, q):M1 = qM2 = p# M1 mod p的逆M1_ = gmpy2.invert(M1, p)M2_ = gmpy2.invert(M2, q)# p mod q的逆x = (b1 * M1 * M1_ + b2 * M2 * M2_) % (p * q)return x# 求解二次同余式
def calc_b(p, a):k = (p + 1) // 4b = fastExpMod(a, k, p)return b# 解密,有4个解,其中1个解为真正的明文
def decrypt(p, q, a):b1 = calc_b(p, a)b2 = calc_b(q, a)x1 = theorem(b1, b2, p, q)x2 = theorem(b1, -b2, p, q)x3 = theorem(-b1, b2, p, q)x4 = theorem(-b1, -b2, p, q)return [x1, x2, x3, x4]

(三)测试


3.1 完整源码

import sympy
import gmpy2# 生成一个大素数p
def generate_p():while True:# 使得p也在150位,p = 2t + 1时p为强素数,即t=p/2-1t = sympy.randprime(10**149, 10**150 / 2 - 1)if sympy.isprime(t):p = 2 * t + 1if len(str(p)) == 150 and sympy.isprime(p) and (p % 4 == 3):breakreturn p# 快速幂模运算(大指数的模运算),计算a^e mod m
def fastExpMod(a, e, m):a = a % mres = 1while e != 0:# if e & 1的判断是一种位运算,用于检查整数e的最低位是否为1。在二进制表示中,如果一个整数的最低位(最右边的位)是1,那么这个数就是奇数;如果最低位是0,那么这个数就是偶数。因此,if e & 1的判断常用于检查e是否为奇数。如果e & 1的结果为1,那么e就是奇数;如果结果为0,那么e就是偶数# 如果e是奇数,a^e=a^(e-1)*a,a^(e-1)可通过循环进行平方计算,还差个a直接乘进resif e & 1:res = (res * a) % me >>= 1  # 右移一位,相当于将 e 除以 2# a, a^2, a^4, a^8, ... , a^(2^n)a = (a * a) % mreturn res# 加密
def encode(m, n):c = m**2 % nreturn c# 孙子定理
def theorem(b1, b2, p, q):M1 = qM2 = p# M1 mod p的逆M1_ = gmpy2.invert(M1, p)M2_ = gmpy2.invert(M2, q)# p mod q的逆x = (b1 * M1 * M1_ + b2 * M2 * M2_) % (p * q)return x# 求解二次同余式
def calc_b(p, a):k = (p + 1) // 4b = fastExpMod(a, k, p)return b# 解密,有4个解,其中1个解为真正的明文
def decrypt(p, q, a):b1 = calc_b(p, a)b2 = calc_b(q, a)x1 = theorem(b1, b2, p, q)x2 = theorem(b1, -b2, p, q)x3 = theorem(-b1, b2, p, q)x4 = theorem(-b1, -b2, p, q)return [x1, x2, x3, x4]def main():m = 42443p = generate_p()q = generate_p()n = p * qc = encode(m, n)m_c = decrypt(p, q, c)print("m = %s\n密文c = %s\n明文m = %s" % (m, c, m_c))returnif __name__ == "__main__":main()

3.2 运行结果

在这里插入图片描述

相关文章:

  • Dubbo(88)如何设计一个跨地域的Dubbo服务?
  • Leetcode刷题记录24——最大子数组和
  • 在 Modal 平台上高效部署 DeepSeek 模型:从环境准备到实战案例
  • 小白dockerfile
  • 数字智慧方案5972丨智慧农业大数据平台解决方案(65页PPT)(文末有下载方式)
  • 协议(消息)配置
  • ctfshow web入门 web44
  • 如何用AI生成生成个人简历
  • 2025深圳杯、东三省数学建模B题数模AI全网专业性第一
  • MATLAB R2024a安装教程
  • Python 常用内置函数详解(九):type()函数——获取对象类型或获取一个新的类型对象
  • 【Tool】vscode
  • Unity图片导入设置
  • d202551
  • [蓝桥杯 2023 国 Python B] 划分 Java
  • 【Unity】MVP框架的使用例子
  • Http详解
  • AI日报 · 2025年05月01日|DeepSeek 发布新一代定理证明模型 Prover V2
  • 【数据结构】 复杂度
  • 2025五一杯数学建模竞赛选题建议+初步分析
  • 一周文化讲座|那些年的年青人
  • 净海护渔,中国海警局直属第一局开展伏季休渔普法宣传活动
  • 体坛联播|欧冠巴萨3比3战平国米,柯洁未进入国家集训队
  • 近七成科创板公司2024年营收增长,285家营收创历史新高
  • 杭州挂牌临平区两宗住宅用地,起始总价约11.02亿元
  • 电话费被私改成48元套餐长达数年,投诉后移动公司退补600元话费