中国矿业大学密码学课程设计
一、古典密码
1.1 原理
1.1.1 单表代换
使用一个固定的替换表—明文、密文字符一一对应。
-
移位密码
\[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖+𝑘)\;𝑚𝑜𝑑\;𝑞\; =\;𝑗\quad0≤𝑖, 𝑗<𝑞,𝐾= \lbrace 𝑘 | 0≤𝑘<𝑞 \rbrace \\ &𝐷_𝑘(𝑗)=(𝑗-𝑘)\; 𝑚𝑜𝑑\; 𝑞\;=\;𝑖 \end{array} \]- 凯撒密码
\[\begin{array}{c} 𝐸_𝑘(𝑖)=(𝑖+k)\;𝑚𝑜𝑑\;26\;=\;𝑗\\𝐷_𝑘(𝑗)=(𝑗-𝑘)\;𝑚𝑜𝑑\;26\;=\;𝑖 \end{array} \]
- 凯撒密码
-
乘数密码
\[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖*k)\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k,q)=1\\ &𝐷_𝑘(𝑗)=(𝑗*𝑘^{-1})\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \] -
仿射密码
移位密码和乘数密码的结合。
\[\begin{array}{c} 𝐸_𝑘(𝑖)=𝑖*k_1+k_2\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k_1,q)=1\\ 𝐷_𝑘(𝑗)=(𝑗-𝑘_{2})*k_1^{-1}\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \]
1.1.2 多表代换
维吉尼亚密码:实质上是周期多表替换,减少了密钥量。
置换表:
明文映射到行,密钥映射到列,通过(明文,密钥)坐标查表可以输出密文。
1.2 实现思路及创新点
实现代码见附录,原理比较简单,按照步骤写代码即可。
使用了重合指数法对维吉尼亚密码进行攻击,以及使用了统计分析的方法对移位密码进行攻击,针对长密文攻击具有良好的攻击效果。
1.3 安全性分析
① 穷举分析
移位密码穷举只需要\(n-1\)次。
乘数密码只需要$ \varphi(n)-1 $次。
放射密码只需要\(n\varphi(n)-1\)次。
② 统计特性分析
英语或者说任何自然语言都有固有的统计特性。可以根据字母频率进行破译。
同样,字母组合也有其统计特性。
可以根据其统计特性猜测置换的密文对应的明文。
单表替换统计分析
- 统计密文的各种统计特征,如果密文量比较多,则完成这步后便可确定出大部分密文字母
- 分析双字母、三字母密文组,以区分元音和辅音字母
- 分析字母较多的密文,在这一过程中大胆使用猜测的方法,如果猜对一个或几个词,就会大大加快破译过程
多表替换统计分析
多表替换在一定程度上隐藏了明文消息的一些统计特性分析,破译相对比较困难。
- 主要包括两个步骤:
- 确定密钥的长度d(就是确定使用的加密表个数)
- 确定具体的密钥字
- 确定密钥的长度两种方法:
- Kasiski测试法
- 重合指数法
① 确定密钥字:
Kasiski测试法基本原理
若用给定的d个密钥表周期地对明文字母加密,则当明文中两个相同字母组的间隔为d的倍数时,这两个明文字母组对应的 密文字母组必相同
两个相同的密文段,对应的明文段不一定相同,但相同的可能性大。将密文中相同的字母组找出来,并找出相同字母组距离的最大公因子,就有可能提取出密钥的长度d
过程:
搜索长度至少为2的相邻的一对对相同的密文段,记下它们之间的距离。而密钥长度d可能就是这些距离的最大公因子。
重合指数法基本原理
重合指数:设\(x=x_1\;x_2\;…\;x_n\)是n个字母的串,x的重合指数是指x中两个随机元素相同的概率,记为\(I_c ( x )\)
假定\(y=y_1\;y_2\;…\;y_n\)是Vigenere
密码的密文串。把\(y\)分成\(d\)个长为\(n/d\)的子串,记为\(Y_1, Y_2,⋯Y_d\)
如果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}^′\), 那么有
设定密钥字\(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…\)提取密钥生成器结构或种子密钥在计算上不可行
②反馈移位寄存器:
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:
初始状态为\((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)
n级LFSR最多有\(2^n\)个不同的状态
初始状态为零,则其状态恒为零
若其初始状态非0,则其后继状态不会为0
因此n级LFSR的状态周期\(≤2^n-1\)
输出序列的周期与状态周期相等,所以$≤2^n-1 $
选择合适反馈函数可使序列周期达到最大值\(2^n -1\),周期达到最大值的序列称为m序列
特征多项式表示:
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的优点:
- 非常适合硬件实现
- 能产生大的周期序列
- 能产生统计特性好的序列
- 能够应用代数方法进行很好的分析
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有两个主要算法:
-
密钥调度算法(KSA)
-
伪随机数生成算法(PRGA)
基本思想:
-
根据种子密钥,利用密钥调度算法对数据表S进行重新排列
-
利用伪随机数生成算法,从重新排列的数据表S中取出一个字节
-
每取出一个字节,数据表S将发生变化
2.2实现思路及创新点
代码见附录
功能:给定任意本原多项式以及初始序列,都可以生成周期为\(2^n-1\)的序列。
同时基于LSFR实现了RC4算法。
2.3安全性分析
对于m-序列(周期为\(2^n-1\)),如果攻击者知道了\(2n\)位明密文对,则可确定反馈多项式的系数,从而确定该LFSR接下来的状态,也就能得到余下的密钥序列,具体过程如下:
可以求出一段长为2n的密钥序列
其中
由此可以推出线性反馈移位寄存器连续的n+1个状态:
序列\(\{a_i\}\)满足线性递推关系:
做矩阵 \(X=(S_1\;S_2...S_n)\)
所以
若X可逆,则
三、分组密码
3.1原理
① 分组密码特点:
速度快、安全性较高、易于标准化和便于软硬件实现
是信息与网络安全中实现数据保密性的核心机制,在计算机通信和信息系统安全领域有着广泛应用
也是构造伪随机数生成器、序列密码、消息认证码和Hash函数的方法
② 分组密码设计要求:
分组长度要足够大
- 假设n为分组长度,则要使\(2^n\)足够大,防止明文穷举攻击
密钥量要足够大
- 防止密钥穷举攻击
密码变换要足够复杂
- 使攻击者除穷举攻击外,找不到其他简洁的数学攻击方法
加密和解密运算简单
- 便于软件和硬件的实现
无数据扩展和压缩
③ 分组密码设计思想✨
- 扩散原则
- 密钥或明文的每一比特变化影响密文的许多比特的变化,以便隐蔽明文的统计特性(雪崩效应)
- 混淆原则
- 混乱原则,指密钥和明文以及密文之间的依赖关系尽可能的复杂化,以防通过统计分析法进行破译
3.1.1 DES
明文分组和密文分组均为64比特,有效密钥56比特
DES基于加密的两个基本属性:替换(也称为混乱)和置换(也称为扩散)。DES由16个步骤组成,每个步骤称为一个回合。每轮执行替换和转位的步骤。现在让我们讨论DES中的广泛步骤:
- 第一步,将64位纯文本块移交给初始置换(IP)功能。
- 初始置换是对纯文本执行的。
- 接下来,初始置换(IP)产生置换块的两半;称为左纯文本(LPT)和右纯文本(RPT)。
- 现在,每个LPT和RPT都要经过16轮加密过程。
- 最后,重新合并LPT和RPT,并在组合块上执行最终置换(FP)
- 该过程的结果将产生64位密文。
3.1.2 AES
采用SPN结构的迭代型分组密码
分组长度和密钥长度都可变,各自可以为128、192、256比特
AES的加解密过程:
密钥被扩展成44个32比特字所组成的数组W[i]
AES每轮由4个阶段组成:
-
字节代换
-
行移位
-
列混合
-
轮密钥加
每个阶段均可逆,加密和解密算法不相同
加密和解密的最后一个阶段均只有3个阶段(没有列混合阶段)
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。
密钥长度任意,不够使用密钥循环填充到8byte,超出只选取前8byte。
可以支持加密汉字,字母,数字,特殊符号的密文,并进行base64编码。
3.3安全性分析
普通的DES很容易被穷举攻击,存在一些弱密钥和半弱密钥,代数结构存在互补对称性,可以使用3DES或者AES改进。
分组密码攻击方法有
-
穷举攻击
-
线性分析攻击
-
差分分析攻击
-
相关密钥分析攻击
-
代数攻击
-
中间相遇攻击
四、Hash函数
4.1原理
hash函数基本特征:
-
算法公开,不需要密钥
-
数据压缩:可将任意长度的输入数据变换成一个固定长度的输出
-
易于计算:对任何给定的m,h(m)易于计算
-
单向性(抗原像性,Pre-image Resistance):给定消息的散列值h(m),要得到消息m在计算上不可行
安全性要求
-
抗弱碰撞性
对任意给定的消息\(m\),寻找与\(m\)不同的消息\(m’\),使得\(h(m)=h(m’)\)在计算上不可行
-
抗强碰撞性
寻找任意两个不同的消息\(m\)和\(m’\),使得\(h(m)=h(m’)\)在计算上不可行
4.1.1 MD5
结构:
步骤1(填充消息): 使消息长度模512=448
-
如果消息长度模512恰等于448,增加512个填充比特。即填充的个数为1~512
-
填充方法:第1比特为1,其余全部为0
步骤2(补足长度): 将消息长度转换为64比特的数值
-
如果长度超过64比特所能表示的数据长度,值保留最后64比特
-
添加到填充数据后面,使数据为512比特的整数倍
512比特按32比特分为16组
MD5分组操作
MD5步操作
4.1.2 SHA-1
第一步:填充消息
-
使消息长度模512=448。如果消息长度模512正好=448,增加512个填充比特,即填充个数为1~512
-
填充方法:第1个比特为1,其余全部为0
-
计算公式:补零的个数\(d=447-(|x| mod 512) (|x|: 消息长度)\)
第二步:补足长度
-
将数据长度转换为64bit的数值
-
每个512bit按每组32bit进行分组,分为16组
4.2实现思路及创新点
MD5比较简单,按照步骤,实现了针对字节进行处理,可以处理汉字,字母,数字,以及特殊符号的MD5算法。
4.3安全性分析
对Hash函数的基本攻击方法:
-
穷举攻击:能对任何类型的Hash函数进行攻击
- 最典型方法是“生日攻击”:给定初值\(H_0\),寻找\(M’≠ M\),使\(h(M’)= H_0\)
-
密码分析法:依赖于对Hash函数的结构和代数性质分析,采用针对Hash函数弱性质的方法进行攻击。这类攻击方法有中间相遇攻击、修正分组攻击和差分分析等
五、公钥密码及数字签名
5.1原理
每个用户都分别拥有两个密钥:加密密钥(公钥)与解密密钥(私钥) ,两者并不相同,且由加密密钥得到解密密钥在计算上不可行。加密密钥是公开的。
关键是寻找单向陷门函数
-
给出\(f\)定义域中的任意元素\(x\),计算\(f(x)\)是容易的
-
给出\(y=f(x)\)中的\(y\),计算\(x\):
-
若知道设计函数f时结合进去的某种信息(称为陷门),则\(x\)容易计算;
-
若不知道该陷门信息,则\(x\)难以计算
单项陷门函数依赖于数学困难问题
-
大整数因子分解问题(如公钥密码体制
RSA
)- 给定两个素数\(p,q,\)计算乘积\(n=pq\)很容易,但给定整数\(n\),求\(n\)的素因子\(p,q\)使得\(n=pq\)是困难的
-
有限域上的离散对数问题(如公钥密码体制
ElGamal
)- 已知有限循环群\(G=<g>={g^k|k=0,1,2,…}\)及其生成元\(g\)和阶\(|G|=n.\)给定整数\(a\),求\(h=g^a\)很容易;但是给定元素\(h\),计算整数\(x\),使得\(h=g^x\)非常困难
-
椭圆曲线上的离散对数问题(如公钥密码体制
ECC
) -
背包问题(背包算法)
-
基于身份的密码体制(
IBE
)
5.1.1 RSA
安全性基于大整数因子分解的困难性
-
密钥的生成
- 选择两个大素数 \(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}\)
-
加密\((e,n)\): 明文\(M<n\), 密文\(C=M^e (mod n)\)
-
解密\((d,n)\): 密文\(C\), 明文\(M =C^d (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}^∗=Zp{0}\(,求唯一的整数\)a(0≤a≤p-2)$,满足
记为$a=log_gβ $
一般来说,求解\(a\)在计算上是困难的
算法特点:
-
非确定性:由于密文依赖于加密过程中用户A选择的随机数r ,所以加密相同的明文可能会产生不同的密文—概率加密
-
密文空间大于明文空间:明文空间为\({Z_p}^∗\),而密文空间为\({Z_p}^∗×{Z_p}^*\)∗
5.2实现思路及创新点
RSA使用Miller-Rabin
算法检验素数,根据ANSI X9.80标准进行检验次数的选择。
改进快速幂算法,由于计算机对大整数取模运算效率很低,所以对此进行了优化,没有进行取模运算,效率提高到和标准库几乎一样。
密钥按照X.509标准进行编码,密文进行base64编码,提高传输效率。
实现了RSA签名算法。
5.3安全性分析
针对RSA的攻击方式主要有
-
针对n分解的攻击
-
循环攻击
-
同模攻击
-
选择密文攻击
-
低加密指数攻击
-
时间攻击
运用RSA需要注意
-
选择素数\(p\)和\(q\)时,应使其欧拉函数\(\varphi(p)\)和\(\varphi(q)\)的最小公倍数尽可能大\((\varphi(p)\)和\(\varphi(q)\)有大的素因子)。最小公倍数越大,幂剩余函数的周期就越长—避免循环攻击
-
密钥中的各项参数应选得足够大—避免穷举攻击
-
在同一个通信网络中,不同的用户不应该使用共同的模数—避免同模攻击
六、混合加密
6.1 架构设计
程序主框架
安全套接字socket实现流程
6.2 创新点
采用B/S
架构进行设计,服务端采用多线程,可以支持多客户端同时并发连接,具有良好的工程性。
通过对称密钥加密数据,公钥加密密钥,提高了加密速度。
实现了数字签名。
不足:因为时间原因,对称加密使用了DES算法,存在不安全的隐患,可以使用AES进行改进。
6.3 安全性分析
对称加密使用了DES,可以换用安全性更好的AES,RSA也可以换成ECC椭圆曲线算法。
附录
源码:
链接:https://pan.baidu.com/s/1ZCJAwJwCHhwEwEpvkxmSmA
提取码:cumt
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V3的分享