密码学课程设计


中国矿业大学密码学课程设计

一、古典密码

1.1 原理

1.1.1 单表代换

使用一个固定的替换表明文、密文字符一一对应。

  1. 移位密码

    \[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖+𝑘)\;𝑚𝑜𝑑\;𝑞\; =\;𝑗\quad0≤𝑖, 𝑗<𝑞,𝐾= \lbrace 𝑘 | 0≤𝑘<𝑞 \rbrace \\ &𝐷_𝑘(𝑗)=(𝑗-𝑘)\; 𝑚𝑜𝑑\; 𝑞\;=\;𝑖 \end{array} \]

    • 凯撒密码

      \[\begin{array}{c} 𝐸_𝑘(𝑖)=(𝑖+k)\;𝑚𝑜𝑑\;26\;=\;𝑗\\𝐷_𝑘(𝑗)=(𝑗-𝑘)\;𝑚𝑜𝑑\;26\;=\;𝑖 \end{array} \]

  2. 乘数密码

    \[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖*k)\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k,q)=1\\ &𝐷_𝑘(𝑗)=(𝑗*𝑘^{-1})\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \]

  3. 仿射密码

    移位密码和乘数密码的结合。

    \[\begin{array}{c} 𝐸_𝑘(𝑖)=𝑖*k_1+k_2\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k_1,q)=1\\ 𝐷_𝑘(𝑗)=(𝑗-𝑘_{2})*k_1^{-1}\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \]

1.1.2 多表代换

维吉尼亚密码:实质上是周期多表替换,减少了密钥量。

置换表:

image-20201221165605487

明文映射到行,密钥映射到列,通过(明文,密钥)坐标查表可以输出密文。

1.2 实现思路及创新点

实现代码见附录,原理比较简单,按照步骤写代码即可。

使用了重合指数法对维吉尼亚密码进行攻击,以及使用了统计分析的方法对移位密码进行攻击,针对长密文攻击具有良好的攻击效果。

1.3 安全性分析

① 穷举分析

移位密码穷举只需要\(n-1\)次。

乘数密码只需要$ \varphi(n)-1 $次。

放射密码只需要\(n\varphi(n)-1\)次。

② 统计特性分析

英语或者说任何自然语言都有固有的统计特性。可以根据字母频率进行破译。

image-20201221171737521

同样,字母组合也有其统计特性。

可以根据其统计特性猜测置换的密文对应的明文。

单表替换统计分析

  1. 统计密文的各种统计特征,如果密文量比较多,则完成这步后便可确定出大部分密文字母
  2. 分析双字母、三字母密文组,以区分元音和辅音字母
  3. 分析字母较多的密文,在这一过程中大胆使用猜测的方法,如果猜对一个或几个词,就会大大加快破译过程

多表替换统计分析

多表替换在一定程度上隐藏了明文消息的一些统计特性分析,破译相对比较困难。

  • 主要包括两个步骤:
  1. 确定密钥的长度d(就是确定使用的加密表个数)
  2. 确定具体的密钥字
  • 确定密钥的长度两种方法:
  1. Kasiski测试法
  2. 重合指数法

① 确定密钥字:

Kasiski测试法基本原理

若用给定的d个密钥表周期地对明文字母加密,则当明文中两个相同字母组的间隔为d的倍数时,这两个明文字母组对应的 密文字母组必相同

两个相同的密文段,对应的明文段不一定相同,但相同的可能性大。将密文中相同的字母组找出来,并找出相同字母组距离的最大公因子,就有可能提取出密钥的长度d

过程:

搜索长度至少为2的相邻的一对对相同的密文段,记下它们之间的距离。而密钥长度d可能就是这些距离的最大公因子。

重合指数法基本原理

重合指数:设\(x=x_1\;x_2\;…\;x_n\)是n个字母的串,x的重合指数是指x中两个随机元素相同的概率,记为\(I_c ( x )\)

\[I_c(x)={\sum^{25}_{i=0}f_i(f_i-1)\over n(n-1)} \]

\[期望值:I_c(x)=\sum_{i=0}^{25}p_i^2=0.065 \]

假定\(y=y_1\;y_2\;…\;y_n\)Vigenere密码的密文串。把\(y\)分成\(d\)个长为\(n/d\)的子串,记为\(Y_1, Y_2,⋯Y_d\)

\[\begin{array}{c} Y_1=y_1y_{d+1}y_{2d+1}y_{3d+1}...\\ Y_2=y_2y_{d+2}y_{2d+2}y_{3d+2}...\\ ......\\ Y_d=y_dy_{2d}y_{3d}y_{4d}... \end{array} \]

如果d是密钥字长度,那么每个\(Y_i\)都可以看作单表置换密码每个\(I_c(y_i)\;(1≤i≤d)\)都会趋近于0.065

如果不是,那么会更加随机一点。

② 确定具体密钥字:

这里已经退化成了凯撒密码,可以使用穷举法得到密钥字。

但是对于非已知密码算法可以采用重合互指数法。

重合互指数:假定\(x=x_1\;x_2\;…\;x_n\)\(y=y_1\;y_2\;…\;y_n′\),分别是长为\(n\)\(n'\)的字母串。\(x\)\(y\)的重合互指数是指\(x\)的一个随机元素等于\(y\)的一个随机元素的概率,记为\(MI_c(x,y)\)

具体步骤:

\(x\)\(y\)中的字母\(A,B,C,……,Z\)出现的次数分别表示为\(f_0,f_1,……,f_{25}\)\(f_0^′, f_1^′,⋯, f_{25}^′\), 那么有

\[\begin{array}{c} MI_c(x,y)=\sum^{25}_{i=0}{f_i\over n}{f_i^`\over n^`}={\sum^{25}_{i=0}f_if_i^`\over nn^`} \end{array} \]

设定密钥字\(K=(k_1,k_2,k_3,...k_n)\)

\(MI_c (Y_i, Y_j )\)的估计值只依赖于差\((k_i-k_j) mod 26\),我们称该差为\(Y_i\)\(Y_j\)的相对移位。

当相对移位不是0,估计值在0.031-0.045之间,是0的时候,估计值是0.065。

可以利用这个计算出任何两个字串的\(Y_1,Y_2\)相对移位,有了相对移位只需要穷举26次就可找出密钥字。

二、序列密码

2.1原理

2.1.1 LSFR

①密钥流的要求:

  • 极大的周期:随机序列是非周期的,而按任何算法产生的序列都是周期的,因此应要求密钥流具有尽可能大的周期

  • 良好的统计特性:随机序列有均匀的游程分布

    游程:指序列中相同符号的连续段,其前后均为异种符号。

    例如:……0 111 0000 10……

    注意:计算游程的时候要首尾相连计算,头和尾的两个0合在一起构成长度为2的0游程。

    有长为3的1游程、长为4的0游程、长为1的1游程,长为2的0游程。一般要求其在周期内满足:同样长度的0游程和1游程的个数相等,或近似相等。

  • 很高的线性复杂度:不能用级数较小的线性移位寄存器LFSR近似代替

  • 用统计方法由密钥序列\(k_0k_1k_2…ki…\)提取密钥生成器结构或种子密钥在计算上不可行

②反馈移位寄存器:

image-20201221221349679

GF(2)上一个n级反馈移位寄存器由n个二元存储器与一个反馈函数\(f(a_1a_2 ... a_n)\)组成

  • 每个存储器称为移位寄存器的一级

  • 在任一时刻,这些级的内容构成该FSR的状态;对应于一个GF(2)上的n维向量,共有\(2^n\)种可能的状态

  • 状态可用n长序列\(a_1, a_2, a_3, …, a_n\)或n维行向量\((a_1, a_2, a_3, …, a_n)\)表示

  • 每一级存储器\(a_i\)将其内容向下一级\(a_{i-1}\)传递,并根据存储器当前状态计算\(f(a_1, a_2, a_3, …, a_n)\)作为\(a_n\)下一时间的内容

example:

image-20201221222458573

初始状态为\((a_1,a_2,a_3)=(1,0,1)\),输出可由上表求出,其输出序列为\(10111011101…\),周期为4

如果反馈函数\(f(a_1, a_2, …, a_n)\)\(a_1, a_2, …, a_n\)的线性函数,则称为线性反馈移位寄存器(LFSR)

\[f(a_1,a_2...a_n)=c_na_1⊕c_{n-1}a_2⊕...⊕c_2a_{n-1}⊕c_1a_n \]

image-20201221223018332

n级LFSR最多有\(2^n\)个不同的状态

初始状态为零,则其状态恒为零

若其初始状态非0,则其后继状态不会为0

因此n级LFSR的状态周期\(≤2^n-1\)

输出序列的周期与状态周期相等,所以$≤2^n-1 $

选择合适反馈函数可使序列周期达到最大值\(2^n -1\),周期达到最大值的序列称为m序列

特征多项式表示:

\[p(x)=1+c_1x+...+c_{n-1}x^{n-1}+c_nx^n \]

1是必须写的,\(c_i\)的取值和上面一一对应

  • 定理:n级LFSR产生的序列有最大周期\(2^n-1\)的必要条件是其特征多项式为不可约的

  • 定义:若n次不可约多项式\(p(x)\)的阶为\(2^n-1\),则称\(p(x)\)是n次本原多项式,使得\(p(x)|(x^p-1)\)的最小p称为\(p(x)\)的阶

  • 定理:\(\{a_i\}∈G(p(x))\)\(\{a_i\}\)为m序列的充要条件\(p(x)\)为本原多项式

LSFR的优点:

  1. 非常适合硬件实现
  2. 能产生大的周期序列
  3. 能产生统计特性好的序列
  4. 能够应用代数方法进行很好的分析

2.1.2 RC4

RC4算法的大小根据参数\(n\)的值而变化,通常\(n=8\),这样RC4可生成\(256(2^8)\)个元素的数据表\(S:S_0,S_1,S_2,…,S_{255}\)

种子密钥长度为1~256个字节(8~2048比特)的可变长度,用于初始化256个字节的初始向量S

RC4有两个主要算法:

  1. 密钥调度算法(KSA)

  2. 伪随机数生成算法(PRGA)

基本思想:

  • 根据种子密钥,利用密钥调度算法对数据表S进行重新排列

  • 利用伪随机数生成算法,从重新排列的数据表S中取出一个字节

  • 每取出一个字节,数据表S将发生变化

2.2实现思路及创新点

代码见附录

功能:给定任意本原多项式以及初始序列,都可以生成周期为\(2^n-1\)的序列。

同时基于LSFR实现了RC4算法。

2.3安全性分析

对于m-序列(周期为\(2^n-1\)),如果攻击者知道了\(2n\)位明密文对,则可确定反馈多项式的系数,从而确定该LFSR接下来的状态,也就能得到余下的密钥序列,具体过程如下:

\[\begin{array}{c} x=x_1x_2...x_{2n}\\y=y_1y_2...y_{2n} \end{array} \]

可以求出一段长为2n的密钥序列

\[\begin{array}{c} z=z_1z_2...z_{2n} \end{array} \]

其中

\[y_i=x_i⊕z_i\;\;z_i=x_i⊕y_i \]

由此可以推出线性反馈移位寄存器连续的n+1个状态:

\[\begin{array}{c} S_1=(z_1z_2...z_n)=(a_1a_2...a_n)\\ S_1=(z_1z_2...z_n)=(a_1a_2...a_n)\\ ...\\ S_1=(z_1z_2...z_n)=(a_1a_2...a_n) \end{array} \]

序列\(\{a_i\}\)满足线性递推关系:

\[a_{h+n}=c_ia_{h+n-1}⊕c_2a_{h+n-2}⊕...⊕c_na_h \]

做矩阵 \(X=(S_1\;S_2...S_n)\)

所以

\[\begin{array}{l} [a_{n+1}a_{n+2}...a_{2n}]=[c_nc_{n-1}...c_1] \left[ \begin{matrix} a_1 & a_2 & a_n \\ a_2 & a_3 & a_{n+1} \\...\\ a_n & a_{n+1} & a_{2n-1} \end{matrix} \right]\\=[c_nc_{n-1}...c_1] \end{array} \]

若X可逆,则

\[[c_nc_{n-1}...c_1]=[a_{n+1}a_{n+2}...a_{2n}]X^{-1} \]

三、分组密码

3.1原理

① 分组密码特点:

速度快、安全性较高、易于标准化和便于软硬件实现

是信息与网络安全中实现数据保密性的核心机制,在计算机通信和信息系统安全领域有着广泛应用

也是构造伪随机数生成器、序列密码、消息认证码和Hash函数的方法

② 分组密码设计要求:

分组长度要足够大

  • 假设n为分组长度,则要使\(2^n\)足够大,防止明文穷举攻击

密钥量要足够大

  • 防止密钥穷举攻击

密码变换要足够复杂

  • 使攻击者除穷举攻击外,找不到其他简洁的数学攻击方法

加密和解密运算简单

  • 便于软件和硬件的实现

无数据扩展和压缩

③ 分组密码设计思想✨

  1. 扩散原则
  • 密钥或明文的每一比特变化影响密文的许多比特的变化,以便隐蔽明文的统计特性(雪崩效应)
  1. 混淆原则
  • 混乱原则,指密钥和明文以及密文之间的依赖关系尽可能的复杂化,以防通过统计分析法进行破译

image-20201230151131294

3.1.1 DES

image-20201230152015348

明文分组和密文分组均为64比特有效密钥56比特

DES基于加密的两个基本属性:替换(也称为混乱)和置换(也称为扩散)。DES由16个步骤组成,每个步骤称为一个回合。每轮执行替换和转位的步骤。现在让我们讨论DES中的广泛步骤:

  1. 第一步,将64位纯文本块移交给初始置换(IP)功能。
  2. 初始置换是对纯文本执行的。
  3. 接下来,初始置换(IP)产生置换块的两半;称为左纯文本(LPT)和右纯文本(RPT)。
  4. 现在,每个LPT和RPT都要经过16轮加密过程。
  5. 最后,重新合并LPT和RPT,并在组合块上执行最终置换(FP)
  6. 该过程的结果将产生64位密文。

image-20201230152937242

3.1.2 AES

采用SPN结构的迭代型分组密码

分组长度和密钥长度都可变,各自可以为128、192、256比特

image-20210109160028312

AES的加解密过程:

密钥被扩展成44个32比特字所组成的数组W[i]

AES每轮由4个阶段组成:

  • 字节代换

  • 行移位

  • 列混合

  • 轮密钥加

每个阶段均可逆,加密和解密算法不相同

加密和解密的最后一个阶段均只有3个阶段(没有列混合阶段)

image-20210109160130121

3.2实现思路及创新点

DES运算时间的改进:

DES 算法的实现中,要实现 E 扩展功能,从表里逐个取数据来扩展成48 位,这样计算的工作量较大,从扩展置换 E 表中的数据清楚地反映了置换中的规律:即将\(R_{i-1}\)第1位赋给\(R^`_{i-1}\)的第 2 位,\(R_{i-1}\)的第2位赋给\(R^`_{i-1}\)的第 3 位 ,以此类推.找到这个规律 ,可 以不需要逐个从表里取数据 ,有助于程序实现 的改进并能够提高计算的速度.这 48 位的扩展的实现将由计算代替查表 ,按照下面的程序段来实现 ,可以提高运行的速度,速度大概提高了 2-3 倍。

for(i=0;i<8;i++)
	for(j=O;j<6;j++)
		a=i*4+j

实现了ECB,CBC模式的DES,同时针对DES密钥过短的特点进行改进,实现了3DES。

image-20201230195407579

密钥长度任意,不够使用密钥循环填充到8byte,超出只选取前8byte。

可以支持加密汉字,字母,数字,特殊符号的密文,并进行base64编码。

3.3安全性分析

普通的DES很容易被穷举攻击,存在一些弱密钥和半弱密钥,代数结构存在互补对称性,可以使用3DES或者AES改进。

分组密码攻击方法有

  1. 穷举攻击

  2. 线性分析攻击

  3. 差分分析攻击

  4. 相关密钥分析攻击

  5. 代数攻击

  6. 中间相遇攻击

四、Hash函数

4.1原理

hash函数基本特征:

  • 算法公开,不需要密钥

  • 数据压缩:可将任意长度的输入数据变换成一个固定长度的输出

  • 易于计算:对任何给定的m,h(m)易于计算

  • 单向性(抗原像性,Pre-image Resistance):给定消息的散列值h(m),要得到消息m在计算上不可行

安全性要求

  1. 抗弱碰撞性

    对任意给定的消息\(m\),寻找与\(m\)不同的消息\(m’\),使得\(h(m)=h(m’)\)在计算上不可行

  2. 抗强碰撞性

    寻找任意两个不同的消息\(m\)\(m’\),使得\(h(m)=h(m’)\)在计算上不可行

4.1.1 MD5

结构:

image-20210109164007833

步骤1(填充消息): 使消息长度模512=448

  • 如果消息长度模512恰等于448,增加512个填充比特。即填充的个数为1~512

  • 填充方法:第1比特为1,其余全部为0

步骤2(补足长度): 将消息长度转换为64比特的数值

  • 如果长度超过64比特所能表示的数据长度,值保留最后64比特

  • 添加到填充数据后面,使数据为512比特的整数倍

512比特按32比特分为16组

MD5分组操作

image-20210109165458050

MD5步操作

image-20210109165531329

4.1.2 SHA-1

第一步:填充消息

  • 使消息长度模512=448。如果消息长度模512正好=448,增加512个填充比特,即填充个数为1~512

  • 填充方法:第1个比特为1,其余全部为0

  • 计算公式:补零的个数\(d=447-(|x| mod 512) (|x|: 消息长度)\)

\[X||1||0^d|| \]

第二步:补足长度

  • 将数据长度转换为64bit的数值

  • 每个512bit按每组32bit进行分组,分为16组

image-20210109165726851

image-20210109165800995

4.2实现思路及创新点

MD5比较简单,按照步骤,实现了针对字节进行处理,可以处理汉字,字母,数字,以及特殊符号的MD5算法。

4.3安全性分析

对Hash函数的基本攻击方法:

  1. 穷举攻击:能对任何类型的Hash函数进行攻击

    • 最典型方法是“生日攻击”:给定初值\(H_0\),寻找\(M’≠ M\),使\(h(M’)= H_0\)
  2. 密码分析法:依赖于对Hash函数的结构和代数性质分析,采用针对Hash函数弱性质的方法进行攻击。这类攻击方法有中间相遇攻击、修正分组攻击和差分分析等

五、公钥密码及数字签名

5.1原理

每个用户都分别拥有两个密钥:加密密钥(公钥)与解密密钥(私钥) ,两者并不相同,且由加密密钥得到解密密钥在计算上不可行。加密密钥是公开的。

image-20210106214134683

关键是寻找单向陷门函数

  1. 给出\(f\)定义域中的任意元素\(x\),计算\(f(x)\)是容易的

  2. 给出\(y=f(x)\)中的\(y\),计算\(x\)

  • 若知道设计函数f时结合进去的某种信息(称为陷门),则\(x\)容易计算;

  • 若不知道该陷门信息,则\(x\)难以计算

单项陷门函数依赖于数学困难问题

  1. 大整数因子分解问题(如公钥密码体制RSA)

    • 给定两个素数\(p,q,\)计算乘积\(n=pq\)很容易,但给定整数\(n\),求\(n\)的素因子\(p,q\)使得\(n=pq\)是困难的
  2. 有限域上的离散对数问题(如公钥密码体制ElGamal)

    • 已知有限循环群\(G=<g>={g^k|k=0,1,2,…}\)及其生成元\(g\)和阶\(|G|=n.\)给定整数\(a\),求\(h=g^a\)很容易;但是给定元素\(h\),计算整数\(x\),使得\(h=g^x\)非常困难
  3. 椭圆曲线上的离散对数问题(如公钥密码体制ECC)

  4. 背包问题(背包算法)

  5. 基于身份的密码体制(IBE

5.1.1 RSA

安全性基于大整数因子分解的困难性

  1. 密钥的生成

    • 选择两个大素数 \(p\)\(q\),(\(p≠q\),需要保密)
    • 计算\(n=p×q\)\(\varphi(n)=(p-1)×(q-1)\)
    • 选择整数 \(e\)使$ (\varphi(n),e) =1, 1<e< \varphi(n) $
    • 计算\(d\),使\(d=e^{-1} mod \varphi(n)\),
    • 得到:公钥为\({e, n}\); 私钥为\({d}\)
  2. 加密\((e,n)\): 明文\(M<n\), 密文\(C=M^e (mod n)\)

  3. 解密\((d,n)\): 密文\(C\), 明文\(M =C^d (mod n)\)

正确性验证

\[C^dmod\;n=(M^e)^dmod\;n=m^{ed}mod\;n≡M\;mod\;n \]

大素数的生成与检验

先随机生成一个适当大小的奇数n,再检测其素性;如果不是,则选取后继的随机数直到找到通过检验的素数为止

概率素性检测

这里使用Miller-Rabin算法

引理:

(1)费马小定理:当\(p\)为质数,有\(a^{p-1}≡1(mod\;p)\),不过反过来不一定成立,也就是说,如果\(a,p\)互质,且\(a^{p-1}≡1(mod\;p)\),不能推出\(p\)是质数,比如\(Carmichael\)

(2)二次探测:如果\(p\)是一个素数,\(0<x<p\), 则方程\(x^2≡1(mod\;p)\)的解为\(x=1\)\(x=p-1\)

算法流程

(1)对于偶数和 $0,1,2 $可以直接判断。

(2)设要测试的数为 \(x\),我们取一个较小的质数\(a\) ,设\(s,t\)满足\(2^st=x-1\)(其中\(t\)是奇数)。

(3)我们先算出\(a^t\),然后不断地平方并且进行二次探测(进行\(s\)次)。

(4)最后我们根据费马小定律,如果最后\(a^{x-1}≠1(mod\;x)\),则说明\(x\)为合数。

(5)多次取不同的\(a\)进行\(Miller-Rabin\)素数测试,这样可以使正确性更高

快速幂算法

常见的快速幂算法是模平方计算法,但是对于大整数,计算机进行取模运算效率是很低的,所以对此进行了优化。

代码如下:

public static BigInteger expMod(int base, BigInteger exp, BigInteger n) {
	if (exp.equals(BigInteger.ZERO)) {
		return BigInteger.ONE;
	}

	if (!exp.testBit(0)) {//如果为偶数
		return expMod(base, exp.divide(BigInteger.valueOf(2)), n).pow(2).remainder(n);
	} else {
		return (expMod(base, exp.subtract(BigInteger.ONE).divide(BigInteger.valueOf(2)), n).pow(2).multiply(BigInteger.valueOf(base))).remainder(n);
	}
}

没有进行取模运算,可以说几乎做到了Java代码层最快了。

Miller-Rabin算法代码实现:

public static boolean passesMillerRabin(BigInteger n) {
        int base = 0;
        if (n.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0) {
            base = ran.nextInt(n.intValue() - 1) + 1;
        } else {
            base = ran.nextInt(Integer.MAX_VALUE - 1) + 1;
        }

        BigInteger thisMinusOne = n.subtract(BigInteger.ONE);
        BigInteger m = thisMinusOne;
        while (!m.testBit(0)) {
            m = m.shiftRight(1);
            BigInteger z = BigInteger.valueOf(base).modPow(m, n);
            //BigInteger z = expMod(base, m, n);
            if (z.equals(thisMinusOne)) {
                break;
            } else if (z.equals(BigInteger.ONE)) {

            } else {
                return false;
            }
        }
        return true;
    }

根据标准 ANSI X9.80, "PRIME NUMBER GENERATION, PRIMALITY TESTING, AND PRIMALITY CERTIFICATES". n的bit数越多, 需要的检测次数就越少。

public static boolean isPrime(BigInteger n) {
        int sizeInBits = n.bitLength();
        int tryTime = 0;
        if (sizeInBits < 100) {
            tryTime = 50;
            return isPrime(n, tryTime);
        }

        if (sizeInBits < 256) {
            tryTime = 27;
        } else if (sizeInBits < 512) {
            tryTime = 15;
        } else if (sizeInBits < 768) {
            tryTime = 8;
        } else if (sizeInBits < 1024) {
            tryTime = 4;
        } else {
            tryTime = 2;
        }
        return isPrime(n, tryTime);
    }

5.1.2 Elgamal

安全性基于离散对数问题

离散对数问题:设\(p\)至少是150位的十进制素数,\(p-1\)有大素因子。\(Z_p\)为有限域,若\(g\)\(Z_p\)中的本原元/生成元/原根,有

\[{Z_p}^∗=<g> \]

$ β∈{Z_p}^∗=Zp{0}\(,求唯一的整数\)a(0≤a≤p-2)$,满足

\[g^a=β(mod p) \]

记为$a=log_gβ $

一般来说,求解\(a\)在计算上是困难的

算法特点:

  1. 非确定性:由于密文依赖于加密过程中用户A选择的随机数r ,所以加密相同的明文可能会产生不同的密文—概率加密

  2. 密文空间大于明文空间:明文空间为\({Z_p}^∗\),而密文空间为\({Z_p}^∗×{Z_p}^*\)

5.2实现思路及创新点

RSA使用Miller-Rabin算法检验素数,根据ANSI X9.80标准进行检验次数的选择。

改进快速幂算法,由于计算机对大整数取模运算效率很低,所以对此进行了优化,没有进行取模运算,效率提高到和标准库几乎一样。

密钥按照X.509标准进行编码,密文进行base64编码,提高传输效率。

实现了RSA签名算法。

5.3安全性分析

针对RSA的攻击方式主要有

  • 针对n分解的攻击

  • 循环攻击

  • 同模攻击

  • 选择密文攻击

  • 低加密指数攻击

  • 时间攻击

运用RSA需要注意

  1. 选择素数\(p\)\(q\)时,应使其欧拉函数\(\varphi(p)\)\(\varphi(q)\)的最小公倍数尽可能大\((\varphi(p)\)\(\varphi(q)\)有大的素因子)。最小公倍数越大,幂剩余函数的周期就越长—避免循环攻击

  2. 密钥中的各项参数应选得足够大—避免穷举攻击

  3. 在同一个通信网络中,不同的用户不应该使用共同的模数—避免同模攻击

六、混合加密

6.1 架构设计

程序主框架

image-20210107162621192

安全套接字socket实现流程

img

6.2 创新点

采用B/S架构进行设计,服务端采用多线程,可以支持多客户端同时并发连接,具有良好的工程性。

通过对称密钥加密数据,公钥加密密钥,提高了加密速度。

实现了数字签名。

不足:因为时间原因,对称加密使用了DES算法,存在不安全的隐患,可以使用AES进行改进。

6.3 安全性分析

对称加密使用了DES,可以换用安全性更好的AES,RSA也可以换成ECC椭圆曲线算法。

附录

源码:

链接:https://pan.baidu.com/s/1ZCJAwJwCHhwEwEpvkxmSmA
提取码:cumt
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V3的分享


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM