密码学课程设计
目录
一.
二.
三.
四.
五.
六.
实验目的 ............................................................................................................................ 1
实验内容及基本要求........................................................................................................1
2.1、分组密码 SPN 的编程实现..............................................................................................1
2.2、RSA 的加/解密及快速加/解密 ........................................................................................1
2.3、随机性检测 ....................................................................................................................... 1
实验原理 ............................................................................................................................ 1
3.1、分组密码 SPN...................................................................................................................1
3.2、RSA 的加/解密及快速加/解密 ........................................................................................6
3.3、随机性检测 ....................................................................................................................... 6
实验过程 ............................................................................................................................ 7
5.1、分组密码 SPN...................................................................................................................7
5.1.1 SPN 加密................................................................................................................7
5.1.2 线性密码分析 ......................................................................................................10
5.1.3 差分密码分析 ......................................................................................................12
5.2、RSA 的加/解密及快速加/解密 ......................................................................................15
5.1.1 生成大素数 ..........................................................................................................15
5.1.2 运用模重复平方的 RSA 加/解密 .......................................................................18
5.1.3 运用蒙哥马利的 RSA 快速加解密....................................................................20
5.1.4 运用中国剩余定理的 RSA 解密 ........................................................................23
5.3、随机性检测 ..................................................................................................................... 25
实验结果 .......................................................................................................................... 25
6.1、分组密码 SPN.................................................................................................................25
6.2、RSA 的加/解密及快速加/解密 ......................................................................................28
6.3、随机性检测 ..................................................................................................................... 31
实验心得总结 .................................................................................................................. 33
密码学课程设计
一. 实验目的
通过课程设计,使学生进一步熟悉密码算法以及算法安全性的基本概念和原
理;培养学生将密码理论和技术应用于实际的能力,使学生具备实施数据加/脱
密和基本的密码分析的能力。
二. 实验内容及基本要求
2.1、分组密码 SPN 的编程实现
①加密:输入初始加密密钥和一串有意义的字符串,显示相应的加密结果;
②线性分析:通过对明密文对的线性分析,破解出初始加密密钥;
③差分分析:通过对明密文对的差分分析,破解出初始加密密钥;
④设计用户界面,界面要有加密选择,线性与差分分析选择,输入密钥与明文栏
以及密文显示栏;
2.2、RSA 的加/解密及快速加/解密
① 编制或网上下载大素数生成算法,产生二个大素数 p 和 q;
② 编写 RSA 的加/解密过程和快速加/解密过程;
③ 通过调用时钟对二种加/解密方法的时间开销进行测试;
④ 设计用户界面,界面要有加/解密方式选择,快速方式与一般方式的选择及时
间开销显示。
2.3、随机性检测
密文的随机性反映了密码的强度,通过设计随机性测试算法或运用工具对
SPN 生成的密文进行随机性检测,来测试 SPN 的密码强度。
三. 实验原理
3.1、分组密码 SPN
(1)迭代密码
迭代密码的核心是一个密钥编排方案和一个轮函数
1
密码学课程设计
密钥编排方案对密钥 k 进行变换,生成 Nr 个子密钥(也叫轮密钥),记为
k1,k2,...,kNr
轮函数 g 是一个状态加密函数,以 ki 为密钥对当前状态 wr-1 进行变换,输
出新的状态值 wr,即 g(wr-1,ki)=wr;轮函数是单射函数,存在一个逆变换 g-1,有
g-1(wr,ki)=wr-1
迭代密码的加密为将密钥 k 编排成 Nr 个轮密钥 k1,k2,...,kNr,将明文 x 定义
为初始状态 w0,经过 Nr 轮变换得到 wNr 为密文 y,即
w1=g(w0,k1),
w0=x,
wNr-1=g(wNr-2,kNr-1),
y=wNr
迭代密码的解密为将密文 y 定义为初始状态 wNr,经过 Nr 轮逆变换得到 w0
w2=g(w1,k2),
wNr=g(wNr-1,kNr)
...
wNr-1=g-1(wNr,kNr),wNr-2=g-1(wNr-1,kNr-1)
为明文 x,即
y=wNr,
...
w1=g-1(w2,k2), w0=g-1(w1,k1),
x=w0
(2)代替-置换网络(Substitution-Permutation Network)
代替-置换网络(Substitution-Permutation Network)是一种简单的迭代密码。处
理的明文单元和状态值长度为 l×m,轮函数 g 包括两个核心变换——代替和置
换,分别记为πs 和πp,有
πs : {0,1}l → {0,1}l
πp : {1,2,...,lm} → {1,2,...,lm}
在进行轮函数变换前,先用轮密钥和状态值进行异或(称为白化)
(3)SPN 密码体制设计
设 l,m,Nr 是正整数,P=C={0,1}lm
K⊆({0,1}lm)Nr+1 是由初始密钥 k 用密钥编排算法生成的所有可能的密钥编
排方案集合,一个密钥编排方案记为(k1,k2,...,kNr+1)
状态值 w 长度为 l×m,记为 w1,w2,...,wlm;
w 可以看成 m 个长度为 l 的子串连接而成,记为
w=w<1>,w<2>,...,w,其中
w=w(i-1)l+1,w(i-1)l+2,...,w(i-1)l+l
加密过程使用如下算法描述:
w0=x
for
to Nr-1
r=1
{
// 白化
i=1
ur=wr-1⊕kr
for
vr=πs(ur)
}
wr=(vr
πp(1),vr
to m {
// 代替
πp(2),...,vr
}
uNr=wNr-1⊕kNr
for
i=1
to m {
vNr=πs(uNr)
}
πp(lm))
// 置换
// 代替
2
密码学课程设计
y=vNr⊕kNr+1
return
具体加密过程如图 3.1 所示:
// 白化
y
图 3.1 SPN 加密过程示例
(4)线性密码分析
线性密码分析,是通过分析 S 盒的线性特性,从而发现明文比特、密文比特
和密钥比特之间可能存在的线性关系,如果 S 盒设计不当,这种线性关系会以较
大的概率存在,称为概率线性关系。线性密码分析一种已知明文攻击方法,已知
x 和 y,确定 k 或 k 的部分比特。
其中,S 盒的选择对 SPN 的安全性影响巨大,假设一个 S 盒按如下规则设
计,见图 3.2
图 3.2
S 盒示例
可以发现其实是将输入进行了循环左移,如图 3.3
图 3.3 输入输出线性关系示例
3
密码学课程设计
这种输入输出关系是一种”线性关系”。
采用已知明文攻击方法,如果掌握了足够多的明-密文对,即可求出轮密钥
ki,进而根据轮密钥编排方案反向推导出加密密钥 k。线性密码分析思路为找到
足够多的明文-密文对,对可能的密钥进行穷举,计算相关随机变量的偏差,正
确的密钥作用下,偏差的绝对值最大
不需要对全部密钥空间进行穷举,只需要对随机变量有影响的密钥比特进行
穷举,这些密钥比特称为候选子密钥
具体算法如下:
线性攻击(T, T, πs-1)
for (L1,L2)=(0,0) to (F,F)
{
Count[L1,L2]=0
// L1,L2 表示候选子密钥 k5<2>和 k5<4>
// 每个候选子密钥分配一个计数器并初始化
为 0
}
for
each (x,y) ∈ T
{
{
for (L1,L2)=(0,0) to (F,F)
v4<2> = L1⊕y<2>
v4<4> = L2⊕y<4>
u4<2> = πs-1(v4<2>)
u4<4> = πs-1(v4<4>)
z = x5⊕x7⊕x8⊕u46⊕u48⊕u414⊕u416
if
{
z=0
Count[L1,L2] ++;
}
// 计算随机变量值
}
max = -1
for (L1,L2)=(0,0) to (F,F)
Count[L1,L2] = | Count[L1,L2] - T/2 |
if Count[L1,L2] > max
{
{
max = Count[L1,L2]
maxkey = (L1,L2)
}
// maxkey 即为所求子密钥
(4)差分密码分析
通过分析明文对的差值对密文对差值的影响来恢复某些密钥比特的分析方
法,分析两个输入的异或和两个输出的异或之间的线性关系。构造若干个明文串
对,每对明文的异或结果相同,观察相应的密文异或结果。
差分分析是一种选择明文攻击方法,比线性分析更早提出,分析效果略差于
线性分析。
仍以“循环左移”S 盒为例
假设两个输入分别是 x=1010 和 x*=1101
则相应的输出是 y=0101 和 y*=1011
输入的异或为 x’=x⊕x*=0111
输出的异或为 y’=y⊕y*=1110
4
密码学课程设计
可以发现不论 x 和 x*如何变化,只要它们的异或是 0111,相应输出的异或
都是 1110,(x’,y’)被称为一个差分
如果 S 盒是线性的,整个 SPN 也会是线性的,明文和密文的差分也会是线
性的
差分分析的优势在于,分析过程基本可以忽略密钥的干扰作用。
差分密码分析思路
找到足够多的四元组(x,x*,y,y*),其中 x’=x⊕x*固定不变。对可能的密钥
进行穷举,计算相关差分的扩散率,正确的密钥作用下,扩散率应最大
和线性分析一样,不需要对全部密钥空间进行穷举,只需要对候选子密钥进
行穷举即可。具体算法如下:
差分攻击(T, T, πs-1)
for (L1,L2)=(0,0) to (F,F)
{
Count[L1,L2]=0
// L1,L2 表示候选子密钥 k5<2>和 k5<4>
// 每个候选子密钥分配一个计数器并初始化为 0
}
for
{
if
{
each (x,x*,y,y*) ∈ T
(y<1>=y*<1> and
y<3>=y*<3>)
// 只考虑 y’<1>和 y’<3>=0
{
for (L1,L2)=(0,0) to (F,F)
v4<2> = L1⊕y<2>
v4<4> = L2⊕y<4>
u4<2> = πs-1(v4<2>)
u4<4> = πs-1(v4<4>)
(v4<2>)*= L1⊕(y<2>)*
(v4<4>)* = L2⊕(y<4>)*
(u4<2>)* = πs-1((v4<2>) *)
(u4<4>)* = πs-1((v4<4>)*)
(u4<2>)’=u4<2>⊕(u4<2>)*
(u4<4>)’=u4<4>⊕(u4<4>)*
and
if
(u4<2>)’=0110
Count[L1,L2] ++;
}
}
}
}
max = -1
for (L1,L2)=(0,0) to (F,F)
if Count[L1,L2] > max
{
{
max = Count[L1,L2]
maxkey = (L1,L2)
}
}
// maxkey 即为所求子密钥
(u4<4>)’ = 0110 {
5
密码学课程设计
3.2、RSA 的加/解密及快速加/解密
非对称密码算法是指一个加密系统的加密密钥和解密密钥是不同的,或者说
不能用其中一个推导出另一个。在非对称密码算法的两个密钥中,一个是用于加
密的密钥,它是可以公开的,称为公钥;另一个是用于解密的密钥,是保密的,
称为私钥。非对称密码算法解决了对称密码体制中密钥管理的难题,并提供了对
信息发送人的身份进行验证手段,是现代密码学最重要的发明。
RSA 密码体制是目前为止最成功的非对称密码算法,它是在 1977 年由 Rivest、
Shamir 和 Adleman 提出的第一个比较完善的非对称密码算法。它的安全性是建
立在“大数分解和素性检测”这个数论难题的基础上,即将两个大素数相乘在计
算上容易实现,而将该乘积分解为两个大素数因子的计算量相当大。虽然它的安
全性还未能得到理论证明,但经过 20 多年的密码分析和攻击,迄今仍然被实践
证明是安全的。
RSA 算法描述如下:
(1)公钥
选择两个互异的大素数 p 和 q,n 是二者的乘积,即 n=pq,使Φ(n)=(p-1)(q-1)为
欧拉函数。随机选取正整数 e,使其满足 gcd(e, Φ(n)) =1,即 e 和Φ(n) 互质,
则将(n,e)作为公钥。
(2)私钥
求出正数 d,使其满足 e×d=1(modΦ(n)),则将(n,d)作为私钥。
(3)加密算法
对于明文 M,由 C=Me(mod n),得到密文 C。
(4)解密算法
对于密文 C,由 M=Cd(mod n),得到明文 M。
如果窃密者获得了 n、e 和密文 C,为了破解密文必须计算出私钥 d,为此需要
先分解 n。为了提高破解难度,达到更高的安全性,一般商业应用要求 n 的长度
不小于 1024 位,更重要的场合不小于 2048 位。
3.3、随机性检测
随机性测试方法
对于一个用 DES 加密产生的密文序列,分别以下面三种情况设计测试随机性工
具
(1)0 和 1 在密文中所占比例
(2) 00、01、10、11 在密文中所占比例
(3) 000、001、010、011、100、101、110、111 在密文中所占比例
6
密码学课程设计
四. 实验过程
5.1、分组密码 SPN
5.1.1 SPN 加密
(一)数据结构选用
该部分首先确定选用数据结构,我选用 C#中的 List 类型来存储切分后的明
文单元与加密后的密文单元以及用于显示的 string 单元,因为 List 这种数据结构
在添加元素的时候类似于 C 语言中的链表,动态存储,这样就适应了明文大小
不确定的特点,避免了申请固定存储空间大小带来的麻烦。对于 S 盒与 P 盒,
我采用一维数组的数据结构来存储相关信息。具体声明如下:
static public UInt16[] S = new UInt16[16]{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};
static public UInt16[] S_ni = new UInt16[16] { 14, 3, 4, 8, 1, 12, 10, 15,
7, 13, 9, 6, 11, 2, 0, 5 };
//S 盒逆置换
static public int[] P = new int[16]{ 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4,
//S 盒
8, 12, 16 };
//P 盒
static public UInt32 K ;
static public UInt32 ceshi;
static public List X = new List();
static public List code = new List();
static public List miwen = new List();
//放明文
//放密文
(二)具体代码实施
该部分主要依照 SPN 加密的原理来进行对明文的加密,并将密文转码之后
转成字符串显示出来。主要按照以下几个步骤完成:
(1) 根据初始密钥,生成轮密钥。
由于该设计中初始密钥设置为手动输入,以string的形式显示,所以生
成轮密钥之前,首先要将初始密钥string转成二进制,再根据其二进制
表现形式,采用位操作生成轮密钥。本实验中选用的密钥编排算法为:
从一个32比特的密钥开始,对轮数1==0; i--)
{
p = (UInt32)(kk[i]<<(kk.Length-i-1));
number =(UInt32) (number | p);
}
生成轮密钥:
//获取轮函数
7