转载:利用中国剩余定理加速 RSA

RSA 作为世界上使用最为流行的公钥密码算法,被广泛应用在数据加密和数字签名上。

为了提高加密和签名验证的效率,一般会将RSA的加密指数(一般是公钥位数)设置的较小,一般为 65537 ,而解密或签名效率却不能够简单的通过减小私钥的长度来实现,因为过短的私钥将直接导致安全问题。

于是乎,基于中国剩余定理(Chinese Remainder Theorem,简称 CRT)的 RSA 加速方案被提出。以RSA加解密为例,本文将首先讲解 RSA 基本原理,再介绍中国剩余理论和费马小定理,最后介绍 RSA-CRT算法。

RSA算法

RSA 包括密钥生成算法、加密算法和签名算法。

密钥生成

加解密

签名与验签

CRT

Garner's formulax(x1, x2)(参考:H. Garner. The Residue Number System. IRE Transactions on Electronic Computers, EC-8 (6), pp. 140 – 147, June 1959.),对于\(x_1 = x(mod p)\)和\(x_2=x(mod q)\):

\(x=x_2 + h.q\)

\(h=(x_1-x_2)(q^{-1}mod p) mod p\)

欧拉定理和费马小定理

RSA-CRT

  • \(d = d(mod p-1)+k(p-1)\),这个如何实现?
  • 求出\(m_q\)和\(m_p\)后,就可以基于CRT求出\(m\)。

举例

## RSA加解密
p = 137, q = 131, n = 137.131 = 17947, e = 3, d = 11787.
私钥(n,d),公钥(n,e)
m = 513
加密:c = 5133 mod n = 8363
解密:m'=c^d mod n = 513 ## RSA-CRT加解密
dP = d mod (p-1) = 11787 mod 136 = 91
dQ = d mod (q-1) = 11787 mod 130 = 87 qInv = q^{-1} mod p = 131-1 mod 137 = 114
m1 = cdP mod p = 836391 mod 137 = 102
m2 = cdQ mod q = 836387 mod 131 = 120 h = qInv.(m1 - m2) mod p = 114.(102-120+137) mod 137 = 3
m = m2 + h.q = 120 + 3.131 = 513.

程序

import time

def chinese_remainder_theorem(c, d, p, q):
dp = d % (p - 1)
dq = d % (q - 1)
q_inv = modinv(q, p) # calculates the inverse
m1 = pow(c % p, dp, p)
m2 = pow(c % q, dq, q)
h = q_inv * (m1 - m2) % p
m = m2 + h * q
return m def modinv(e, phi): # function used to calculate modular inverse
d = 0
x1 = 0
x2 = 1
y1 = 1
temp_phi = phi while e > 0: # extended euclidean algorithm
temp1 = temp_phi // e
temp2 = temp_phi - temp1 * e
temp_phi = e
e = temp2 x = x2 - temp1 * x1
y = d - temp1 * y1 x2 = x1
x1 = x
d = y1
y1 = y if temp_phi == 1:
return d + phi def gcd(a, h): # function used to calculate the GCD
temp = 0
while (1):
temp = a % h
if (temp == 0):
return h
a = h
h = temp start_time = time.time() # p and q are 1024 bit primes. Tested using Miller Rabbin algorithm from Question 2
p = 137
q = 131
n = p*q
e = 3
phi = (p-1)*(q-1)
d = modinv(e, phi) msg = 513
print("Message data = ", msg)
c = pow(msg, e, n) # encryption c = (msg ^ e) % n
print("Encrypted data = ", c) # decryption using chinese remainder theorem
decrypted_msg = chinese_remainder_theorem(c, d, p, q)
print("Original Message Sent = ", decrypted_msg) end_time = time.time() elapsed_time = end_time - start_time
print("Time taken for RSA with CRT: {:.6f} seconds".format(elapsed_time))

参考

  1. 第二十一个知识点:CRT算法如何提高RSA的性能?
  2. Using the CRT with RSA

CRT优化RSA的更多相关文章

  1. $\mathcal{Crypto}$ 共模攻击原理实现以及$\mathcal{CRT}$优化

    \(\mathcal{共模攻击概述}\) 共模攻击是一种攻击 \(\mathcal{RSA}\) 加密的技术,当两个密文使用相同的 \(\mathcal{RSA}\) 公共模数时,攻击者可以使用中国剩 ...

  2. 第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的?

    第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的? 注意:这篇博客是由follow论密码计算中消除错误的重要性(On the importance of Eliminating E ...

  3. RSA算法优化

    RSA算法优化 大数乘法 模乗优化 剩余定理(孙子定理) RSA加解密 python的RSA计算优化 #-*- coding: utf-8 -*- ''' /********************* ...

  4. 实现 RSA 算法之改进和优化(第三章)(老物)

    第三章 如何改进和优化RSA算法 这章呢,我想谈谈在实际应用出现的问题和理解. 由于近期要开始各种忙了,所以写完这章后我短时间内也不打算出什么资料了=- =(反正平时就没有出资料的习惯.) 在讲第一章 ...

  5. IOS客户端实现RSA加密

    在IOS的app登陆模块,用户名和密码如果直接传给后台服务器,很容易被截获并伪造网络请求, 如果利用RSA算法在每个客户端利用公钥解密,服务器端进行私钥解密,即使截获了密码也是无法解密的 在这里只介绍 ...

  6. 实现 RSA 算法之基础公式证明(第一章)(老物)

    写这篇日志是拖了很久的事情,以前说要写些算法相关的文章给想学信息安全学(简称信安),密码学的同学提供些入门资料,毕竟这种知识教师上课也不会细讲太多(纯理论偏重),更不用说理解和应用了,说到RSA公钥( ...

  7. windows通过pfx文件生成key、crt文件

    nginx代理的时候,需要填写证书的crt跟rsa文件路径,通过iis导出的证书是pfx文件(不知道nginx能不能直接用pfx文件,没有查看过相关资料),所以要通过pfx文件生成crt.rsa文件. ...

  8. Nginx详解以及LNMP的搭建

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  9. 项目实战1—LNMP的搭建、nginx反向代理和缓存等的实现

    实战一:搭建lnmp及类小米等商业网站的实现 环境:关闭防火墙,selinux 1.安装包,开启服务 yum -y install nginx mariadb-server php-fpm php-m ...

  10. 从一到万的运维之路,说一说VM/Docker/Kubernetes/ServiceMesh

    摘要:本文从单机真机运营的历史讲起,逐步介绍虚拟化.容器化.Docker.Kubernetes.ServiceMesh的发展历程.并重点介绍了容器化阶段之后,各项重点技术的安装.使用.运维知识.可以说 ...

随机推荐

  1. 基于Java+SpringBoot心理测评心理测试系统功能实现九

    一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...

  2. delphi Image 32 动画演示1

    Image 32 自带的Demo,添加一些注解. unit uFrmAnimation; interface uses Winapi.Windows, Winapi.Messages, System. ...

  3. csv导出特殊字符问题

    昨天听到隔壁组讨论说按照逗号分割implode导出到csv文件,传递文件数据给别人的时候,别人按照都好explode分割回来多一个单元格,他们调查了一下发现是内容里面就是有逗号导致的,居然就这么卡住了 ...

  4. CSS3实现放大镜效果

    市面上基本上所有的购物平台.商城上的商品详情页,对于商品的图片都是有放大功能.那么这个功能主要是怎么实现的呢?CSS3实现放大镜效果主要依赖于CSS的一些高级特性,如transform.transit ...

  5. 【昌哥IT课堂】MySQL8.0新特性之特权连接

    概述: ERROR 1040 (HY000): Too many connections 上面这个报错,开发或DBA一般都遇见过.那么碰到这个问题,我们应该怎么办呢? 在MySQL 5.7及之前版本, ...

  6. 多线程实现的Java爬虫程序

    以下是一个Java爬虫程序,它能从指定主页开始,按照指定的深度抓取该站点域名下的网页并维护简单索引. 参数:private static int webDepth = 2;//爬虫深度. 主页的深度为 ...

  7. vue2-路由Router

    ​ Vue 中的路由用于实现单页应用(SPA)中的页面导航.它允许你在不刷新整个页面的情况下,根据不同的 URL 路径显示不同的组件,提供了类似于多页面应用的用户体验.例如,在一个电商应用中,可以通过 ...

  8. 2024-11-27:字符串的分数。用go语言,给定一个字符串 s,我们可以定义其“分数”为相邻字符的 ASCII 码差值绝对值的总和。 请计算并返回字符串 s 的分数。 输入:s = “hello“

    2024-11-27:字符串的分数.用go语言,给定一个字符串 s,我们可以定义其"分数"为相邻字符的 ASCII 码差值绝对值的总和. 请计算并返回字符串 s 的分数. 输入:s ...

  9. Redis为什么这么快之IO多路复用

    情景复现 面试官:Redis为什么这么快? 我:1. 基于内存 2. 高效数据结构 3. 单线程 4. IO多路复用 面试官:那你讲讲Redis的IO多路复用模型是什么. 我:哦,嗯,啊,呀...IO ...

  10. httpclient 连接池测试

    为什么需要使用http连接池 1.降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗, ...