Rabin密码体制

概述

Rabin算法是一种基于计算模合数平方根困难性问题的非对称加密算法,和RSA加密的形式类似。

Rabin算法

加密

选择两个大素数p和q做为私钥

计算n = p * q做为公钥

若明文为m,则密文为 c ≡ m 2 ( m o d n ) c \equiv m^{2} \pmod{n} cm2(modn)

实际做题中,加密指数e不仅限于2,所有和n不互素的都有可能

解密

原理见:Rabin加密算法和n次同余方程 - 先知社区 (aliyun.com)

例题

from gmpy2 import *
from Crypto.Util.number import *
from secret import flag

p=getPrime(512)
q=next_prime(p)
m=bytes_to_long(flag)

n=p*q
assert m<n
e=16
c=pow(m,e,n)
print(n)
print(c)
'''
83650221621907636385329605166638135692478115475567680518380849132069577024122748510094791782430145001844098201472139061632031008106586076821085164564609624397997699554857151869768774151973653565989830019188019812117309808235901878061106045278434665436951550808935925167223645067597674284368743934227459981787
34579794216199333908922247428037098680888455285312254560858707931505429117348762608030176788471386333850151200137016029425553311949776283993956074325906639706948256766367104230283272052968836854901403271583787978609854351861370731069997892323938736099550986552143540329399276006571717464979363554268666913348
'''

flag{Rabin_Rabin_Rabin_go_go_go_e_phi_no}

思路:先利用yafu将n分解成p*q,然后可以用sagemath求解同余式

加密过程: c ≡ m 16 ( m o d n ) c \equiv m^{16} \pmod{n} cm16(modn)

由于n=p*q,所以 c ≡ m 16 ( m o d p ) c \equiv m^{16} \pmod{p} cm16(modp) c ≡ m 16 ( m o d q ) c \equiv m^{16} \pmod{q} cm16(modq)

上述两式同时成立,可以利用sagemath分别求解出只有单个式子满足的情况,然后利用中国剩余定理求解出两式同时满足的解,sagemath脚本如下:

p =
q =
c =
e = 16
R.<x> = Zmod(p)[] #将x作为需要求得的未知数,p为素数
f = x^e-c
r1 = [int(i[0]) for i in f.roots()] #f.roots()返回求解出来的所有解的列表
R.<x> = Zmod(q)[]
f = x^e-c
r2 = [int(i[0]) for i in f.roots()]
m = []
for i in r1:
    for j in r2:
        m.append(crt([i,j],[p,q])) #crt求解中国剩余定理,第一个参数为余数列表,第二个参数为模数列表
print(m) #将所有可能的m输出,复制到python里long_to_bytes()
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h0l10w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值