目录
RSA加密
数学原理
证明:
欧拉函数
欧拉定理
模反元素
模运算
指数运算
同余
欧几里德算法GCD
填充(padding)
对称加密的应用工作流程
非对称加密的应用工作流程
1)加密过程
2)解密过程
代码实现
密码学知识扩展
加密体制
如何破解包括恺撒密码在内的单字母替换密码?
RSA安全性
RSA加密
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的
RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制
非对称加密(分公钥和私钥,不是依靠同一个密码来加解密),依靠随机填充(padding)可以达到:同一个明文、同一个公钥每次生成不同的密文,而私钥能正确解开密文
私钥加密,公钥解密 (私钥在服务器端,公钥在客户端);[为什么](RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密? - 知乎用户的回答 - 知乎 https://www.zhihu.com/question/25912483/answer/252031361)
RSA密钥长度越长约安全:1024、2048、3072….
数学原理
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
一个正整数可以分解为两个互质数相乘,本质就是一个超大数运算,基于大合数的分解这一数学难题
1. n=p1*p2,取两个大的质数,相乘得到n。
n就是密钥,n的长度就是密钥的长度
2. 对p1,p2两个质数,带入欧拉函数 得:
φ(p1)=p1-1 ;φ(p2)=p2-1
再两者相乘得到 n的欧拉函数
φ(n)=φ(p1*p2)=φ(p1)φ(p2)=(p1-1)(p2-1)
3. 随机选择一个整数E,条件是1< e < φ(n),且e与φ(n) 互质,即满足gcd(e,φ(n))=1
(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用)
4. 计算e对于φ(n)的模反元素d
ed=1(mod φ(n));e*d能被φ(n)+1整除 (d+dn都是φ(n)的模反元素)
5. 将n和e封装成公钥,n和d封装成私钥(d是最关键的密钥分量)
公钥=(n,e)
私钥=(n,d)
加密:
M^e=C(mod n)
解密:
C^d=M(mod n)
证明:
M=C^d mod n 代换 C= M^e mod n
=(M^e mod n)^d mod n=M^ed mod n
由 ed = kφ(n)+1
=M^kφ(n)+1mod n = M ?
若 M和n互素 由欧拉定理
M^φ(n)=1 (mod n)
M^kφ(n)=1 (mod n) 两边同乘 M
M^kφ(n)+1=M (mod n) => M=C^d mod n
若不互素,gcd(m,n)≠1
(若mn互素gcd(m,pq)=1意味着m既不是p的倍数也不是q的倍数)
有n=p*q,即gcd(m,pq)≠1
设m=tp; gcd(m,q)=1 由欧拉定理 m^φ(q)=1(mod q)
m^kφ(q)=1(mod q) #1的任意次幂都是1,不管这个式子多少次幂 都等于 1(mod p)
[m^kφ(q)]^φ(p) = 1(mod q)
m^kφ(q)φ(p)=1(mod q)
m^kφ(q)φ(p)=m^kφ(n)=1 mod q 两边在同乘m
m^kφ(n)+1=m mod q =》 M^kφ(n)+1mod n = M 得证
个人理解,n是两边都有的,具体加密中的p,q不知道,一个很大的数,想确定一对p*q=n很难(就算是质数也很难,因为数量真的很多) 用e加密,e是随机取的,用d解密 d是根据e和φ(n)算出来的 ,φ(n)是通过p和q算出来的 所以想破解d是很难的,关于怎么加密解密的过程, 注意点:M=C^d mod n 与C= M^e mod n的代换、ed的产生、1的n次幂还是1、以及欧拉定理 a^φ(n)=1 (mod n) 的同乘M
欧拉函数
定义:欧拉函数(Euler's totient function),即φ(n),表示的是小于等于n的数中,和n互质的数的个数。 如φ(1)=1
欧拉方程有两个性质对RSA算法来说是特别重要的。
当n是质数的时候,显然有φ(n)=n-1 (费马小定理)这是由于n的唯一因子是1和n,因此,n与之前的所有n-1个正整数都是互素的。
另一个有趣的性质是对于任意小于n且与n互素的正整数a,都有aφ(n) mod n = 1。例如,14 mod 8 = 1, 34 mod 8 = 1, 54 mod 8 = 1, 74 mod 8 = 1。对上述方程两边都乘以a,得到:a*(aφ(n) mod n)=a,或者aφ(n)+1 mod n = a
欧拉定理
欧拉定理表明,若n,a为正整数,且n,a互质,则以下公式成立:
即:a的φ(n)次方 被 n整除余1
例:2和5互质,φ(5)=4,2的4次方是16,减去1等于15更好被5整除。
那么根据欧拉函数的特例,质数p 的 φ(p1)=p1-1 得
模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab被n+1整除,或者说ab被n除的余数是1。这时,b就叫做a的“模反元素”。
ab=1(mod n)
例: a=3,n=4
(3b-1)%4=0 ;3b= k4 +1 ;ab=k*n+1 ; (k≥1为任意整数)
故b=7或者3
显然模反元素不止一个,即如果b是a的模反元素,则b+kn都是a的模反元素(k为正整数)
可以看出,a的 φ(n)-1 次方,就是a对模数n的模反元素
模运算
让m去被n整除,只取所得的余数作为结果,就叫做模运算。10 mod 4=2;8 mod 3=2;
指数运算
指数运算又称乘方计算,计算结果称为幂。nm指将n自乘m次。把nm看作乘方的结果,叫做”n的m次幂”或”n的m次方”。其中,n称为“底数”,m称为“指数”。
同余
数学上,当两个整数除以同一个正整数,若得相同余数,则二整数同余。即两个整数a,b,它们除以正整数m所得的余数相等。从特例来解释:b是a模m的余数
给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即(a-b) mod m=0, 那么就称整数a与b对模m同余,记作a≡b (mod m),同时可成立a mod m=b
欧几里德算法GCD
欧几里德算法是用来求两个正整数最大公约数的算法
计算公式gcd(a,b) = gcd(b,a mod b)
填充(padding)
是为了解决每次加密,明文不变,密文也不变的情况。
要遵循欧拉定理的数学公式,对明文长度是有要求的,必须是16的整数倍,不是整数倍就需要填充到那么长,如果刚好是16的倍数也需要再填充。
一开始是固定的填充 比如 明文+0000达到规定长度
后面出现了新的填充模式,每次的填充值随机的变化,但是是有规则的,还是可以用私钥解开
比如 明文+123456
好处在于让加密后的密文每次不一样,不管填充模式怎么变,填充值是什么,只要我通过相同的填充模式去解密,就能把不断变化的明文解出来。
填充模式: NoPadding、OAEPPadding、PKCS1Padding等,PKCS#1的padding就占用了11个字节
公钥和私钥使用不一样的填充模式会导致解密的失败
NoPadding的填充模式不安全(就是填0)
对称加密的应用工作流程
对称加密:DES,AES
DES.encrypt(明文,密钥) 加密——》密文
客户端(加密) ——》传输——》服务器(解密)
DES.decrypt(密文,密钥) 解密 ——》明文
非对称加密的应用工作流程
非对称加密:RSA
RSA.encrypt(明文,公钥,填充值) 加密——》密文
客户端(公钥加密) ——》传输——》服务器(私钥解密)
RSA.decrypt(密文,私钥,填充方式) 解密——》明文
1)加密过程
加密时首先将明文比特串分组,使得每一个分组对应的十进制数小于n,即分组长度小于,然后对每个明文分组做加密运算,具体过程分为如下步骤:
(1)获得接收方公钥(e,n);
(2)把消息M分组为长度为L(L< )的消息分组M=;
(3)使用加密算法计算出密文C=;
(4)将密文C发送给接收方;
2)解密过程
(1)接收方收到密文C=;
(2)使用私钥d逐一恢复明文分组M , ;
(3)得明文消息 M=;
有些明文太长了 常见处理手法是:非对称加密(对称加密(明文))
代码实现
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
import rsa
import base64
#传入长度 注册一个key对象
key=RSA.generate(1024)
#设置一个公钥
pubkey=key.publickey().export_key()
print("pub key:",pubkey)
print("pub len:",len(pubkey))
#设置一个私钥
privkey=key.export_key()
print("pri key:",privkey)
print("pri len:",len(privkey))
#导入公钥 注册一个RSA对象
rsa_key=RSA.importKey(pubkey)
print("n:",rsa_key.n)
print("e:",rsa_key.e)
#传入RSA对象 创建一个PKCS1填充模式的 加密对象
cipher=Cipher_PKCS1_v1_5.new(rsa_key)
#明文
text="hello rsa"
#加密
cipher_text=cipher.encrypt(text.encode())
print("cipher_text:",cipher_text)
print("len:",len(cipher_text))
#导入私钥 注册一个RSA对象
rsa_key=RSA.importKey(privkey)
#解密
cipher=Cipher_PKCS1_v1_5.new(rsa_key)
plaintext=cipher.decrypt(cipher_text,None).decode(encoding='utf-8')
print("plaintext:",plaintext)
密码学知识扩展
加密体制
凯撒密码
凯撒密码,或称恺撒加密、恺撒变换、变换加密,是一种替换加密的技术,以罗马共和时期恺撒的名字命名,恺撒曾用此方法对重要的军事信息进行加密,恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。即明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文,是最简单且最广为人知的加密技术之一。
其基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。位数就是凯撒密码加密和解密的密钥。
例子如下:凯撒当时就是按照字母按顺序后推3位,只需简单地统计字频就可以破译。现今又叫“移位密码”,只不过移动的位数不一定是3位而已。我们知道字母有26位置,那么我们一个字母除了本身的位置还有25个位置可以做位移
那么我们拿到密文,即使没有密匙也能尝试将它破解出来,因为凯撒移位密码只有25种密匙,最多就是将这25种可能性挨个检测一下可以了,这就是我们所说的暴力破解法。
你可能要说了那这个加密强度很低啊,是的因为刚才说的仅仅是按顺序往后位移。因此,为了使密码有更高的安全性,单字母替换密码就出现了。
只需重排密码表二十六个字母的顺序,允许密码表是明码表的任意一种重排,密钥就会增加到四千亿亿亿多种,我们就有超过4×1027种密码表。破解就变得很困难。
如:
明码表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M
明文 F O R E S T
密文 Y G K T L Z
公钥密码体制
在公钥体制中,加密密钥不同于解密密钥。人们将加密密钥公之于众,谁都可以使用;而解密密钥只有解密人自己知道。迄今为止的所有公钥密码体系中,RSA系统是最著名、使用最广泛的一种。
发展历程
1976年提出公共密钥密码体制,其原理是加密密钥和解密密钥分离。这样,一个具体用户就可以将自己设计的加密密钥和算法公诸于众,而只保密解密密钥。任何人利用这个加密密钥和算法向该用户发送的加密信息,该用户均可以将之还原。公共密钥密码的优点是不需要经安全渠道传递密钥,大大简化了密钥管理。它的算法有时也称为公开密钥算法或简称为公钥算法。
1978年提出公共密钥密码的具体实施方案,即RSA方案。
1991年提出的DSA算法也是一种公共密钥算法,在数字签名方面有较大的应用优势。
如何破解包括恺撒密码在内的单字母替换密码?
方法:字母频度分析
“如果我们知道一条加密信息所使用的语言,那么破译这条加密信息的方法就是找出同样的语言写的一篇其他文章,大约一页纸长,然后我们计算其中每个字母的出现频率。我们将频率最高的字母标为1号,频率排第2的标为2号,第三标为3号,依次类推,直到数完样品文章中所有字母。然后我们观察需要破译的密文,同样分类出所有的字母,找出频率最高的字母,并全部用样本文章中最高频率的字母替换。第二高频的字母用样本中2号代替,第三则用3号替换,直到密文中所有字母均已被样本中的字母替换。”
尽管我们不知道是谁发现了字母频度的差异可以用于破解密码。但是9世纪的科学家阿尔·金迪在《关于破译加密信息的手稿》对该技术做了最早的描述。
以英文为例,首先我们以一篇或几篇一定长度的普通文章,建立字母表中每个字母的频度表。
在分析密文中的字母频率,将其对照即可破解。
虽然设密者后来针对频率分析技术对以前的设密方法做了些改进,比如说引进空符号等,目的是为了打破正常的字母出现频率。但是小的改进已经无法掩盖单字母替换法的巨大缺陷了。到16世纪,最好的密码破译师已经能够破译当时大多数的加密信息。
局限性:
短文可能严重偏离标准频率,假如文章少于100个字母,那么对它的解密就会比较困难。
而且不是所有文章都适用标准频度:
1969年,法国作家乔治斯·佩雷克写了一部200页的小说《逃亡》,其中没有一个含有字母e的单词。更令人称奇的是英国小说家和评论家吉尔伯特·阿代尔成功地将《逃亡》翻译成英文,而且其中也没有一个字母e。阿代尔将这部译著命名为《真空》。如果这本书用单密码表进行加密,那么频度分析破解它会受到很大的困难。
一套新的密码系统由法国外交家维热纳尔(Blaise de Vigenère)于16世纪末确立。其密码不再用一个密码表来加密,而是使用了26个不同的密码表。这种密码表最大的优点在于能够克制频度分析,从而提供更好的安全保障。
RSA安全性
-
密码学知识扩展:
-
加密体制:
-
凯撒密码:
凯撒密码,或称恺撒加密、恺撒变换、变换加密,是一种替换加密的技术,以罗马共和时期恺撒的名字命名,恺撒曾用此方法对重要的军事信息进行加密,恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。即明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文,是最简单且最广为人知的加密技术之一。
其基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。位数就是凯撒密码加密和解密的密钥。 例子如下:
-
凯撒当时就是按照字母按顺序后推3位,只需简单地统计字频就可以破译。现今又叫“移位密码”,只不过移动的位数不一定是3位而已。我们知道字母有26位置,那么我们一个字母除了本身的位置还有25个位置可以做位移
那么我们拿到密文,即使没有密匙也能尝试将它破解出来,因为凯撒移位密码只有25种密匙,最多就是将这25种可能性挨个检测一下可以了,这就是我们所说的暴力破解法。
你可能要说了那这个加密强度很低啊,是的因为刚才说的仅仅是按顺序往后位移。因此,为了使密码有更高的安全性,单字母替换密码就出现了。
只需重排密码表二十六个字母的顺序,允许密码表是明码表的任意一种重排,密钥就会增加到四千亿亿亿多种,我们就有超过4×1027种密码表。破解就变得很困难。
如:
明码表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M
明文 F O R E S T
密文 Y G K T L Z
- 公钥密码体制
在公钥体制中,加密密钥不同于解密密钥。人们将加密密钥公之于众,谁都可以使用;而解密密钥只有解密人自己知道。迄今为止的所有公钥密码体系中,RSA系统是最著名、使用最广泛的一种。
### 发展历程
1976年提出公共密钥密码体制,其原理是加密密钥和解密密钥分离。这样,一个具体用户就可以将自己设计的加密密钥和算法公诸于众,而只保密解密密钥。任何人利用这个加密密钥和算法向该用户发送的加密信息,该用户均可以将之还原。公共密钥密码的优点是不需要经安全渠道传递密钥,大大简化了密钥管理。它的算法有时也称为公开密钥算法或简称为公钥算法。
1978年提出公共密钥密码的具体实施方案,即RSA方案。
1991年提出的DSA算法也是一种公共密钥算法,在数字签名方面有较大的应用优势。
-
如何破解包括恺撒密码在内的单字母替换密码?
-
方法:字母频度分析
“如果我们知道一条加密信息所使用的语言,那么破译这条加密信息的方法就是找出同样的语言写的一篇其他文章,大约一页纸长,然后我们计算其中每个字母的出现频率。我们将频率最高的字母标为1号,频率排第2的标为2号,第三标为3号,依次类推,直到数完样品文章中所有字母。然后我们观察需要破译的密文,同样分类出所有的字母,找出频率最高的字母,并全部用样本文章中最高频率的字母替换。第二高频的字母用样本中2号代替,第三则用3号替换,直到密文中所有字母均已被样本中的字母替换。”
尽管我们不知道是谁发现了字母频度的差异可以用于破解密码。但是9世纪的科学家阿尔·金迪在《关于破译加密信息的手稿》对该技术做了最早的描述。
以英文为例,首先我们以一篇或几篇一定长度的普通文章,建立字母表中每个字母的频度表。
在分析密文中的字母频率,将其对照即可破解。
虽然设密者后来针对频率分析技术对以前的设密方法做了些改进,比如说引进空符号等,目的是为了打破正常的字母出现频率。但是小的改进已经无法掩盖单字母替换法的巨大缺陷了。到16世纪,最好的密码破译师已经能够破译当时大多数的加密信息。
-
局限性:
短文可能严重偏离标准频率,假如文章少于100个字母,那么对它的解密就会比较困难。
而且不是所有文章都适用标准频度:
1969年,法国作家乔治斯·佩雷克写了一部200页的小说《逃亡》,其中没有一个含有字母e的单词。更令人称奇的是英国小说家和评论家吉尔伯特·阿代尔成功地将《逃亡》翻译成英文,而且其中也没有一个字母e。阿代尔将这部译著命名为《真空》。如果这本书用单密码表进行加密,那么频度分析破解它会受到很大的困难。
一套新的密码系统由法国外交家维热纳尔(Blaise de Vigenère)于16世纪末确立。其密码不再用一个密码表来加密,而是使用了26个不同的密码表。这种密码表最大的优点在于能够克制频度分析,从而提供更好的安全保障。
-
-
RSA安全性:
一个现代密码体制必须能经得住训练有素的密码分析家借助计算机寻找秘密密钥的攻击或用某些其他方法试破密文的攻击。在RSA体制中,如果密码分析家(知道公开密钥e和n)能把n分解成p和q,那么他就可以计算出F(n),接着找出秘密密钥分量d。
在已知n和e的情况下即(公钥),能否推导出d?
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
-
但RSA应用中,不可能跟我们举例子一样那么小,而且大整数的因数分解,是一件非常困难的事情,例如:
12301866845301177551304949 58384962720772853569595334 79219732245215172640050726 36575187452021997864693899 56474942774063845925192557 32630345373154826850791702 61221429134616704292143116 02221240479274737794080665 351419597459856902143413
没法对这个整数进行因数分解,过于大了,而且目前破解的只有暴力破解,所以RSA才号称是目前地球上最安全的算法。
-
一些其他的参考
现代密码学(四)——RSA密码体制_简述rsa密码体制_Quincy678的博客-CSDN博客
数据加密--详解 RSA加密算法 原理与实现
阮一峰先生的两篇文章《RSA算法原理(一)》、《RSA算法原理(二)》
现代密码学|RSA加密算法及其数学基础_哔哩哔哩_bilibili