1:应用一种加密方法,将一段明文加密成密文,用任意一种语言编写出完整的程序。
2:制作一种数字水印方案,写出完整制作过程。(作品通过网上提供)
3:简单叙述分组编码技术的基本应用过程。
4:防火墙技术的应用
一种过滤型防火墙规则定义在转发控制表内容如下
Direction Type Src Port Dest Port Action 传输方向 协议类型 报文源地址 源主机端口 报文宿地址 宿主机端口 控制操作
访问要求:
1)网络123.45.0.0/16不愿其他Internet 主机访问其站点;
2)但它的一个子网123.45.6.0/24和某大学135.79.0.0/16有合作项目,因此允许该大学访问该子网(Allow );
3)然而135.79.99.0/24是黑客天堂,需要禁止(Deny)。
请根据上述要求完成规则设计原则,完成下表填写。
Direction Type Src Port Dest Port Action 1 In * * * 2 Out * * * 3 In * * * 4 Out * * * 5 Both * * *
陕西科技大学答题纸 课程 密码学与网络安全 班级
学号 姓名
1(应用一种加密方法,将一段明文加密成密文,用任意一种语言编写出完整的程序。 答:(以下程序用C#编译,在VS2005下运行通过)
using System;
using System.Collections.Generic; using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace mima1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
char[,] mabiao=new char[11,26]; //定义二维全局数组,用以保存密码码表
private void Form1_Load(object sender, EventArgs e)
//生成窗口的同时,建立随机产生26×10的二维密码码表,在窗口的生命周期内,不会发生变化.
{
for(int i=0;i<11;i++)>11;i++)>
for (int j = 0; j < 26;="" j++)="">
{
mabiao[i, j] = (char)(j + 97);
}
Random r = new Random();
for (int i = 1; i < 11;i++="" )="">
for (int j = 25; j >= 0; j--)
{
int address = r.Next(0, j);
char tmp = mabiao[i,address];
mabiao[i, address] = mabiao[i,j];
mabiao[i, j] = tmp;
}
}
private string jiami(string mingwen) //加密过程,10组码表轮转替换
{
string miwen="";
int count=1;
for(int i=0;i
{
for (int j = 0; j < 8;="" j++)="">
{
for (int m = 0; m < 26;="" m++)="">
{
if (mingwen.Length!=miwen.Length)
if (!(mingwen[i * 8 + j].Equals("")) && (mingwen[i * 8 +
j]).Equals((char)(m + 97)))
miwen += mabiao[count, m];
}
}
if (count==10) count=0;
}
return miwen;
}
private string jiemi(string miwen) //解密过程,与加密过程原理相当
{
string mingwen = "";
int count = 1;
for (int i = 0; i < miwen.length="" 8+1;="" i++,="" count++)="">
{
for (int j = 0; j < 8;="" j++)="">
{
for (int m = 0; m < 26;="" m++)="">
{
if (mingwen.Length != miwen.Length)
if (!(miwen[i * 8 + j].Equals("")) && (miwen[i * 8 +
j]).Equals(mabiao[count, m]))
mingwen += (char)(m + 97);
}
}
if (count == 10) count = 0;
}
return mingwen;
}
private void button1_Click(object sender, EventArgs e) //点击此按钮,执行加密
{
textBox2.Text= jiami(textBox1.Text);
}
private void button2_Click(object sender, EventArgs e) //显示码表,有利于检查排错
{
string show="码表如下:(n=8加密)\n";
for (int i = 0; i < 11;="" i++)="">
{
for (int j = 0; j < 26;="" j++)="">
{
show += mabiao[i, j].ToString()+" ";
}
show += "\n";
}
MessageBox.Show(show,"码表");
}
private void button3_Click(object sender, EventArgs e) //点击此按钮,执行解密
{
textBox1.Text = jiemi(textBox2.Text);
}
}
}
2(制作一种数字水印方案,写出完整制作过程。
答:以下是加网上最常见的多行斜体数字文印的方法:(操作工具为Photoshop CS2)
第一步,新建图片,设置适当的图片大小,选择文字工具,在图片上输入你要添加的文字,调节文字大小、字体以及文字角度,栅格化文字图层,保存为自定义的图案;
第二步,打开要加水印的图片,新建一个图层;只选择新建的图层,用刚才保存的图案进行填充;并调整图层透明度为20%,40%。
第三步,合并图层,并保存。
这样,图片的数字水印就制作完成了,当我们需要给很多文件加水印的时候,可以使用Photoshop中的动作功能以及批处理功能来实现,即用动作记录加水印的操作,再用批处理对目标文件夹内所有文件执行统一操作。这种制作水印的方法的缺陷在于它是可见水印,破坏了原有图像的数据。此外,我们还可以利用Photoshop自带的Digimarc工具(滤镜?Digimarc)很方便地制作简单的隐形水印。
3(简单叙述分组编码技术的基本应用过程。
答:分组密码分为三类:代替密码(Substitution)、移位密码(Transposition)和乘积密码。
分组密码就是将明文消息序列
m,m,…,m,… 12k
分成等长的消息组(m,m,…,m),(m,m,…,m),… 12nn+1n+22n
在密钥控制下,按固定的算法E一组一组进行加密,加密后输出相等数量的密文组 k
(y,…,y),(y,…,y),… 1mm+12m
一个分组密码是一种映射
ntm F×F?F222ntnmt记为E(X,K)或E(X),X?F,K?F,F称为明文空间,F称为密文空间,F称K22222为密钥空间。n为明文分组长度,当n,m时,称为有数据压缩的分组密码;当n,m时,
nn称为有数据扩展的分组密码;当n,m且一一映射时,E(X)就是GF(2)到GF(2)的置换。K
通常最常见的就是最后一种情况。
先介绍第一种,代替密码。代替密码使用到的算法E,实际上是一组码表的集合。在k
每一个码表当中,每一个明文字符都有相应的另一个密文字符(组)与之相对应,比如a对应b,b对应d,或者a对应bd,b对应ac……等等,当采用a对应bd这种格式的时候,我们使用的是有扩展的密码。每一个对应的码表中包含的明文都是一组完整的字符集,所对应的密文则是没有重复的字符(字符组)集,这样,才能够保证每一个明文都能找到与之相对应的密文。代替密码是很简单的加密方法,如果我们把一组密钥称为一个码表,那么只使用一组密钥的单码表代替密码显然是很不安全的,所以产生了多码表代替密码,即利用一个以上的码表进行分组加密。这就是我们所说的分组代替密码。
移位密码则是一种更简便的加密方法。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法又被称为恺撒密码。移位密码的算法是这样的,假如位移量为n,那么对于明文当中的一个ASC码值为m的字符,则采用ASC码码值m+n或者m-n所对应的字符做替换,比如当位移量为2时,我们用a替换c,同样就可以得出b对应的一定是d,c对应的一定是e。由于它的码表是采用移位方法得到的,所以被命名为移位密码。显然的,相对于代替密码而言,移位密码更容易被破解,但是其码表占用的存储空间却非常非常小,它的码表只需要保存所移动的位数而已,而不需要像代替密码一样记录下所有的码表序列。
随着计算机数的发展,,早期的代替和移位密码已无安全可言。一个增加密码强度的显然的方法是合并代替和移位密码,这样的密码称为乘积密码。如果密文是由明文运用轮函数多次而得,这样的乘积密码又称为迭代分组密码。DES和今天的大多数分组密码都是迭代分组密码。
4(创建防火墙规则如下:
Direction Type Src Port Dest Port Action 1 In * 135.79.99.0/24 * 123.45.0.0/16 * Deny 2 Out * 123.45.0.0/16 * 135.79.99.0/24 * Deny 3 In * 135.79.0.0/16 * 123.45.6.0/24 * Allow 4 Out * 123.45.6.0/24 * 135.79.0.0/16 * Allow 5 Both * * * * * Deny 注:*指任意、任何(如所指的表示为任意的协议类型),其他的类推
密码学
第一章 绪 论
本章主要阐述了公钥密码体制的研究背景和积极意义,并简单介绍了代理重加密体制的研究现状以及该密码体制在云存储数据共享领域的独特优势。最后,本章介绍了本文的主要研究工作和论文结构。
1.1 研究背景与意义
密码学是伴随着信息保密而产生的,其基本任务就是通过一定的加密方法对信息提供保密性服务。然而,信息系统安全技术已不再是单纯的保密通信,现代的密码学研究已经远远超越了信息保密的范围。随着信息时代对信息安全的需求,密码技术开始从传统的军事保密领域走向公开领域,并成为一个“普通”的专业学科。这是密码学发展的一个跨越,密码技术研究群体越来越多,加快了密码学的发展和变革,使其在信息安全保密中的核心地位日益巩固,同时也给密码学带来了前所未有的机遇和挑战。密码学的发展历经了一个富有传奇特色的漫长过程,一般可分为3个阶段:
第一阶段:从古代一直到1949年,密码学都是停留在应用于军事政治等神秘领域的实践技术。从1949年香农(Shannon )发表了《保密系统的信息理论》未找到引用源。错误!后,密码学才由理论基础指导而上升为学科。这一阶段,密码学研究的突破并不大,而且应用方面仍然只局限于特殊领域。
第二阶段:1976年《密码学的新方向》错误!未找到引用源。的发表标志着公钥密码学的诞生,1977年美国发布的数据加密标准(DES )加密算法标志着对称密码体制上升到一个新的阶段,上述两个事件将密码学带入了现代密码学阶段。
第三阶段:伴随着相关理论的完善,以及由集成电路和因特网推动的信息化工业浪潮,密码学进入了一个全新爆发的时代:研究文献和成果层出不穷,研究的方向也不断拓展,并成为了一个数学、计算机科学、通信工程学等各学科密切相关的交叉学科,同时各种密码产品也走进了寻常百姓家,从原来局限的特殊领域进入了人民群众的生产、生活之中。
在一个通信系统中,确保发送信息的安全,同时接收者在获取信息后能正确获得原始信息是密码学的基本内容,这一过程由加密和解密两部分组成。加密通常是将明文进行编码,使其含义变得模糊或不易理解的过程。而解密是加密的逆过程,其作用是将密文恢复为其原始形式。信息发送方利用加密密钥并采用一定的加密算法,对明文进行加密得到密文,然后将密文发送给接收方。接收方在收
到密文之后,利用解密密钥和相应的解密算法对密文进行解密,从而获得原始的信息。在加密和解密过程中,密钥的使用方法又可以分为两大类:一类是加密密钥和解密密钥相同,或者通过加密密钥很容易得到解密密钥,这类加密算法被称为单密钥系统或者对称密码体制;另一类则是加密密钥和解密密钥不同,通过加密密钥无法或很难计算得到解密密钥,这类加密算法通常被称为双密钥系统或非对称密码体制、公钥密码体制。在公钥密码体制中,公钥加密算法通常指使用一个可公开的密钥进行加密,使用另一个秘密保存的密钥进行解密。公钥加密算法不需要加密和解密双方互相信任。目前比较流行的公钥加密算法有RSA 算法错误!未找到引用源。、Rabin 算法错误!未找到引用源。、ElGamal 错误!未找到引用源。、以及ECC (椭圆曲线)算法错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。等。
对于密码体制而言,安全的核心是私钥,一个安全系统无论设计得多么完美,如果其中的密钥安全没办法保证,则整个系统的安全也将是空中楼阁。从已经广泛商用的密码算法来看,公钥基础设施(Public Key Infrastructure,PKI )是必不可少的,PKI 作为一个可信第三方负责管理和分发密钥。特别地,大量的公钥密码算法都是基于PKI 系统提出的。但是,随着PKI 系统中用户数量的不断增加,PKI 系统将牺牲大量的计算开销和通信开销来管理公钥证书。为了克服PKI 系统中存在的缺陷,基于身份的公钥密码体制错误!未找到引用源。的概念在1984年被提出,该密码体制不存在繁琐的公钥证书管理问题,用户公钥由惟一标识用户身份信息的ID 推导而来,然而,却产生了密钥托管问题,即可信密钥生成中心负责为用户分发私钥。直到2001年,第一个安全实用的基于身份公钥加密方案才由Boneh 和Franklin 错误!未找到引用源。基于椭圆曲线上的双线性对构造而来。不久,基于无证书的公钥密码体制错误!未找到引用源。的概念于2003年首次被提出,该密码体制不仅可以消除PKI 系统中存在的证书管理问题,也可以克服基于身份密码体制中存在的密钥托管问题。此后,多个无证书公钥加密方案错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。被提出。
尽管公钥密码体制已被广泛应用于社会各领域,但公钥密码学依然要不断发展以适应社会的进步。如今,云计算能够方便地为远程用户提供计算和存储资源,从而节省本地开销。一旦数据拥有者将数据上传给半可信的云服务提供商(Cloud Service Provider ,CSP ),将失去对数据的控制权。因此,出于安全考虑,数据拥有者必须对将要外包出去的数据做加密处理。考虑如下场景错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。:数据拥有者Alice 希望将其外包在云服务器中的敏感数据与其他用户Bob 共享,除了Bob ,包括CSP 在内的任何人都无法解密这些共享数据。Alice 直接将其私钥告知Bob 是不可取的,最简单、安全的方法是Alice 先将云中数据下载到本地解密,然后再与Bob 安全通信。此时,Bob 可以利用其自身私钥获得共享
数据。显然地,此方法牺牲了数据拥有者的计算开销、通信带宽以及本地存储资源,这不符合用户通过云计算节省资源开销的初衷,因此,传统的公钥密码方案无法解决云存储数据安全共享问题。
为此,代理重加密(Proxy Re-Encryption,PRE )是一种具备安全转换功能的密码系统,能够有效地实现云存储数据安全共享。在PRE 密码系统中,一个半可信代理者(Proxy )扮演着密文转换的角色,针对同一明文消息,它可以将Alice 公钥下的密文重加密为Bob 公钥下的密文。然后,Bob 可利用其自身私钥解密重加密后的密文。因此,通过利用PRE 的思想,当Alice 收到Bob 的共享请求后,Alice 产生一个代理重加密密钥并将该密钥发送给CSP 。后者利用该代理重加密密钥能够将Alice 存储在云端的外包数据转换为由Bob 公钥加密的密文,而无法获知共享数据的内容。然后,Bob 可用其自身私钥解密这些共享数据。在共享过程中,数据拥有者无需将数据下载到本地,从而节省开销。此后,代理重加密成为密码学与信息安全领域的一个研究热点,积累了大量研究成果,且在云计算错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。
错误!未找到引用源。
未找到引用源。、数字版权管理错误!未找到引用源。错误!未找到引用源。、加密电子邮件转发、分布式文件系统错误!未找到引用源。错误!未找到引用源。、加密病毒过滤错误!未找到引用源。错误!等领域的应用前景广阔。
1.2 代理重加密研究现状
Blaze 、Bleumer 和Strauss 于1998年欧密会上率先提出了代理重加密(Proxy Re-Encryption ,PRE )的概念错误!未找到引用源。。在代理重加密中,一个半可信代理者(Proxy )扮演着密文转换的角色,它可以将由委托者(Delegator )公钥加密的密文转换为被委托者(Delegatee )对同一明文加密的密文,然后被委托者可利用其自身私钥解密该转换后的密文。在转换过程中,代理者必须拥有一个由委托者授权的针对被委托者的密文转换密钥(即代理重加密密钥),同时,该代理者无法获知关于密文中对应明文的任何信息。
一般来说,代理重加密存在两种分类方式:一种是根据密文转换方向,可将代理重加密分为单向和双向的,前者仅能实现由Alice 到Bob 的密文转换,而后者不仅能够实现由Alice 到Bob 的密文转换,反之亦然;另一种是根据密文转换次数,又可将代理重加密分为单用和复用的,前者仅能实现由Alice 到Bob 的一次密文转换,后者可将转换后的密文进行再次转换。
1998年欧洲密码会议上,Blaze 、Bleumer 和Strauss 第一次提出了代理重加密的概念错误!未找到引用源。,并基于ElGamal 加密算法错误!未找到引用源。构造了第一个双向、复用的代理重加密方案。该方案是高效的且在DDH (Decision Diffie-Hellman)困难问
题假设下语义安全于选择明文攻击(Chosen-Plaintext Attack ,CPA )。然而,被委托者和代理者可以发起合谋攻击,从而得到委托者的私钥。此外,Blaze 等人还留下了一个开放问题,即如何构造一个单向的代理重加密方案。
1999年,Jakobsson 错误!未找到引用源。提出了一个基于仲裁的PRE 方案,其设计思路是将代理者划分为多个子代理,每个子代理各控制着代理重加密密钥的一部分,如果部分代理者是诚实的,则委托者的私钥就是安全的。该方案宣称部分解决了文献错误!未找到引用源。中的合谋攻击问题。
2003年,基于密钥分享机制,Ivan 等人错误!未找到引用源。给出了代理重加密方案的通用设计思路,即用户私钥被分割成两个,一个由代理者持有,另一个委托者保存。虽然该方法解决了文献错误!未找到引用源。中代理者独自分发解密授权的问题,却无法满足密钥优化和抗合谋攻击的特性。
2005年,Ateniese 等人错误!未找到引用源。首次形式化地描述了代理重加密及其安全模型,并设计出第一个基于双线性对的单向代理重加密方案。该方案实现了主密钥安全,即能够抵抗代理者与被委托者的合谋攻击。随后,作者对该方案进行扩展错误!未找到引用源。,通过引入时间片使其满足暂时性。然而,Ateniese 等人的多个方案仅能达到CPA 安全性,无法满足实际应用需求。因此,如何构造出选择密文攻击(Chosen-Ciphertext Attack,CCA )安全的代理重加密方案将是一个重要的开放问题。
2007年,Canetti 和Hohenberger 错误!未找到引用源。在ACM CCS 上解决了上述开放问题,首次提出了满足CCA 安全性的双向、复用代理重加密方案,而且其变体方案在标准模型下被证明语义安全。他们还留下了6个开放问题,其中最重要的一个是如何构造出不依靠双线性对且CCA 安全的代理重加密方案。另外,Green 和Ateniese
方案。
2008年,为解决文献错误!未找到引用源。中遗留的开放问题,Libert 和Vergnaud 错误!未找到引用源。错误!未找到引用源。首次提出了基于身份的代理重加密(Identity-based PRE ,ID-PRE )的概念,并基于Boneh-Franklin 错误!未找到引用源。构造了一个CCA 安全的具体提出了首个在标准模型下可证明RCCA (Replayable CCA)安全的单向代理重加密方案,其变体方案支持暂时性的性质。Deng 等人错误!未找到引用源。提出第一个不依靠双线性对、可证明CCA 安全的双向代理重加密方案。但是,此方案的代理重加密密钥构造方式与Blaze 等人的错误!未找到引用源。相同,从而使其不能够满足非交互性、非传递性以及无法抗合谋攻击等。
2009年,Shao 等人错误!未找到引用源。在PKC 会议上构造了第一个无需双线性对且可证明CCA 安全的单向代理重加密方案。Wang 等人错误!未找到引用源。提出了一个单向、
复用且CCA 安全的代理重加密方案,该方案正确解答了文献错误!未找到引用源。中提到的第二个开放问题。此外,Liang 等人错误!未找到引用源。率先给出了基于属性代理重加密(Attribute-Based PRE,AB-PRE )的概念,并构造出一个具体方案,满足CPA 安全性。Weng 等人错误!未找到引用源。错误!未找到引用源。首次提出了条件代理重加密(Conditional PRE ,C-PRE )的概念和一个CCA 安全的具体方案。
2010年,Fang 等人错误!未找到引用源。指出Libert 等人错误!未找到引用源。的方案无法抵抗选择公钥攻击,并构造出了一个改进方案,使其同时满足选择公钥攻击安全性和CCA 安全性。Weng 等人错误!未找到引用源。基于Libert-Vergnaud 错误!未找到引用源。提出了一个标准模型下更加安全、高效的代理重加密方案。随后,Chow 等人错误!未找到引用源。在AfricaCrypt ’10会议中指出Shao 等人错误!未找到引用源。的方案无法达到CCA 安全性,并给出改进方案。Matsuda 等人错误!未找到引用源。通过引入有损陷门函数,提出无需双线性对的双向、复用代理重加密方案,且在标准模型下可证明CCA 安全。另外,一个新型的概念,无证书代理重加密(Certificateless PRE,CL-PRE )由Sur 等人错误!未找到引用源。首次提出。
2011年,Libert 等人错误!未找到引用源。考虑到一个更现实的敌手模型,并提出了第一个在标准模型下可证明CCA 安全的单向代理重加密方案。Weng 等人错误!未找到引用源。在PKC 2011上通过给出具体攻击方法,指出他们的方案并非CCA 安全。Canard 等人错误!未找到引用源。强化了Chow 等人错误!未找到引用源。的安全模型,然后,提出了一个完全CCA 安全的单向代理重加密方案。在标准模型下,Shao 等人错误!未找到引用源。提出了第一个单向、复用代理重加密方案,可以抵抗选择密文攻击和合谋攻击。
2012,针对选择密文攻击,文献错误!未找到引用源。给出了一个更强的安全模型,在此基础上提出的PRE 方案具有更强的CCA 安全性。Sun 等人错误!未找到引用源。提出了第一个CCA 安全的单向广播代理重加密(Broadcast PRE ,BPRE ),该
2013年,Isshiki 等人错误!未找到引用源。在RSA ’13上对Hanaoka 等人错误!未找到引用源。安方案在标准模型下满足自适应选择密文安全。 全定义进行了扩展,刻画出了一个更强的完全CCA 安全模型,并在标准模型下提出了一个完全CCA 安全的代理重加密方案。Wang 等人错误!未找到引用源。无需利用不可伪造一次签名,构造出标准模型下CCA 安全的单向代理重加密。上述两个方案都是单向、复用的。
2014年,Zhang 等人错误!未找到引用源。提出了选择密钥安全模型,允许敌手为恶意用户适应性选择公钥,他们在该模型的基础上提出了无需随机预言机模型的高效且CCA 安全的代理重加密方案。Cai 等人错误!未找到引用源。改进了Wang 等人错误!未找到引用源。的方案,使其能够抵抗文献错误!未找到引用源。中的恶意攻击。
2015年,基于多线性映射错误!未找到引用源。,Tang 等人错误!未找到引用源。构造了一个单向、多用的PRE 方案。然而,该方案的安全性依赖于多线性映射下的强安全假设。
未找到引用源。未找到引用源。Srinivasan 等人错误!指出Yang 等人错误!的CL-PRE 方案仅能达到RCCA
安全性,并在Chow 等人方案
CCA 安全的CL-PRE 方案。 错误!未找到引用源。的基础上进而提出了一个无需双线性对且
近年来,学界将基于身份公钥密码、基于属性公钥密码以及无证书公钥密码与代理重加密体制相结合。ID-PRE 的优势在于解决了传统PKI-PRE 中的证书管理问题。此后,诸多ID-PRE 方案相继被提出。 在ISC 2007会议上,Chu 和Tzeng 错误!未找到引用源。提出了第一个不依靠随机预言机的ID-PRE 方案。随后该方案被Shao 等人错误!未找到引用源。指出无法达到CPA 安全性。Matusuo 等人错误!未找到引用源。基于ElGamal 错误!未找到引用源。提出了一个宣称CCA 安全的ID-PRE 方案,Wang 等人错误!未找到引用源。指出其不能够抵抗选择密文攻击。在标准模型下,Ren 等人错误!未找到引用源。构造了一个CCA 安全的ID-PRE 方案。Emura 等人错误!未找到引用源。提出了一个支持委托者身份隐私保护的ID-PRE 方案。Wang 等人错误!未找到引用源。构造了一个单向、复用的ID-PRE 方案,然而,Zhang 等人错误!未找到引用源。描述了一个恶意攻击者能够破坏其安全性。另外,在随机预言机模型下,Shao 等人错误!未找到引用源。提出了一个支持匿名保护的ID-PRE 方案。随后,Shao 和Cao 错误!未找到引用源。对文献错误!未找到引用源。中方案做了改进,使其可以抵抗合谋攻击且在标准模型下语义安全于选择密文攻击。
此外,Liang 等人错误!未找到引用源。将基于属性公钥加密错误!未找到引用源。与PRE 相结合,第一次介绍了基于属性的代理重加密(AB-PRE )的概念,且在随机预言机模型下构造了第一个满足CCA 安全性和主密钥安全的AB-PRE 方案。此后,Luo 等人错误!未找到引用源。提出了一个基于密文策略的AB-PRE 方案,其具有单向、复用以及非交互性的特性。Seo 等人错误!未找到引用源。构造出一个高效AB-PRE 方案,其能够指定用户解密重加密密文。Liang 等人错误!未找到引用源。构造的另一个AB-PRE 方案能够实现单向访问控制和CCA 安全性。同时,AB-PRE 方案可以应用于基于云的数据共享错误!未找到引用源。错误!未找到引用源。和家庭自动化错误!未找到引用源。。
错误!未找到引用源。Sur 等人错误!未找到引用源。在无证书公钥密码系统错误!未找到引用源。的基础上首次提出了无证书代理重加密(CL-PRE )的概念,并基于Libert-Quisquater 构造出
第一个CL-PRE 方案。CL-PRE 与ID-PRE 一样不需要公钥证书,同时,CL-PRE 消除了ID-PRE 中的密钥托管问题,是一种性能优良、便于应用的代理重加密系统。
随后,基于Green-Ateniese 错误!未找到引用源。,Zhu 等人错误!未找到引用源。在随机预言机模型下提出了一个CCA 安全的CL-PRE 方案。Xu 等人错误!未找到引用源。错误!未找到引用源。在云存储数据共享环境下构造出CPA 安全的CL-PRE 方案。2013年,Guo 等人错误!未找到
引用源。指出文献错误!未找到引用源。错误!未找到引用源。中方案容易遭受攻击,并进一步构造出RCCA 安全的CL-PRE 方案。Yang 等人错误!未找到引用源。构造出第一个不依靠双线性对的CL-PRE 方案,且满足CCA 安全性。目前为止,CL-PRE 方案多被用于云计算中错误!未找到引用源。错误!未找到引用源。。
在AsiaCCS 2009会议上,Weng 等人错误!未找到引用源。第一次介绍了条件代理重加密(C-PRE )的概念,当且仅当密文满足委托者设置的条件时,代理者才可将该密文转换为被委托者的密文。他们构造出一个高效、CCA 安全的C-PRE 方案错误!未找到引用源。,支持一些简单的条件。Fang 等人错误!未找到引用源。形式化定义了匿名C-PRE ,并
提出条件代理广播重加密的概念。Fang 等人错误!未找到引用源。构造出支持细粒度不依靠随机预言机构造出语义安全于选择密文攻击的C-PRE 方案。Chu 等人错误!未找到引用源。
转换策略的C-PRE 方案,其中委托者与被委托者交互产生条件代理重加密密钥。在随机预言机模型下,Zhao 等人错误!未找到引用源。提出基于属性的C-PRE 方案,该方案可抵抗选择密文攻击。Vivek 等人错误!未找到引用源。通过减少双线性对操作的数量构造出一个更加高效的C-PRE 方案。
在CT-RSA 2009上,密钥隐私代理重加密(key-private PRE,K-PRE )的概念由Ateniese 等人错误!未找到引用源。提出,并构造出一个满足CPA 安全性的具体方案,即代理者即使拥有代理重加密密钥,也无法或者委托者和被委托者的身份信息。随后,一个语义安全于选择密文攻击的密钥隐私PRE 被Shao 等人错误!未找到引用源。提出。2010年,Yau 错误!未找到引用源。和Shao 等人错误!未找到引用源。分别提出了带关键字的代理重加密(PRE with keyword research,PRES )的概念,并构造出具体方案。
1.3 主要研究内容
代理重加密体制是一种具备密文安全转换功能的新型公钥加密体制,从1998年其概念提出伊始就一直是密码学和信息安全领域的研究热点,且被广泛应用于诸多领域。鉴于代理重加密的学术与应用价值,本文对代理重加密进行了充分的研究,本文的主要研究内容与研究成果如下:
(1) 代理重加密体制的理论与技术不断地丰富和发展,从而积累了大量研究成
果。本文将就代理重加密的研究成果进行整理,从定义、特性、安全模型与研究进展等方面阐述目前的研究现状,并且本文将从特性、计算开销、存储开销及安全性等方面对现有方案进行比较和简要评述;
(2) 本文将简要阐述无证书公钥加密相对于基于身份公钥密钥和传统公钥密
码的诸多优势。然后,基于无证书公钥加密体制,本文将提出无证书代理重加密体制的形式化定义与一个更强的安全模型,然后,将提出一个新的
可证明适应性选择密文安全的无证书代理重加密方案。随后,本文将对本
文所提出新的无证书代理重加密方案与其它无证书代理重加密方案进行
对比分析;
(3) 本文将讨论代理重加密体制在云计算环境下的应用。本文将利用新提出的
无证书代理重加密方案设计一个云数据安全共享协议。然后,本文将对该
云数据共享协议进行安全性分析,并将分析云计算环境下数据拥有者、云
服务提供商以及数据接收者在计算开销与通信开销方面的性能情况;
(4) 在密码体系中,密钥泄露问题日益严峻,且逐渐成为一种最具破坏性的攻
击类型。为了解决代理重加密算法中的密钥泄露问题,本文将引入密钥隔
离密码技术,提出基于证书的密钥隔离代理重加密体制的概念,该密码体
制将具备密钥隔离安全性。随后,本文将构造出第一个基于证书的密钥隔
离代理重加密方案,并对该方案的正确性进行分析。
1.4 论文组织结构
第一章为绪论,主要介绍了代理重加密的研究背景与研究意义,综述了当前代理重加密的研究现状,分析了代理重加密方案的特性、性能与安全性对比情况。
第二章为预备知识,主要介绍了密码学中得而复杂性理论、可证明安全理论。还介绍了公钥密码体制和代理重加密体制的形式化定义与安全模型。此外,本章还对代理重加密体制存在的密钥泄露问题进行了讨论。
第三章为无证书代理重加密方案设计,本章基于无证书公钥密码体制提出了一个可证明CCA 安全的无证书代理重加密方案,并对该方案进行了安全分析以及性能对比分析。
第四章为基于CL-PRE 的云数据共享协议设计,主要简述了协议系统模型和设计目标,并基于第三章提出的无证书代理重加密方案设计了一个云计算环境下的数据共享协议,随后,本章对该协议的安全性与性能进行了分析。
第五章为首个基于证书的密钥隔离代理重加密方案设计,本章考虑了代理重加密存在的密钥泄露问题,首次提出了基于证书的密钥隔离代理重加密的概念,并构造了第一个基于证书的密钥隔离代理重加密方案。随后,本章对该方案的正确性进行了分析。
第六章为总结与展望,本章对本文研究工作进行了总结,指出了本文研究的不足之出以及本领域的后续研究工作。
密码学
【密码学02】密码系统原理及数学背景 上一篇文章【密码学】四大主题简单介绍 一文提到要实现信息传输的保密性、完整性,以及身份鉴别和抗抵赖,使用的技术手段有:
1) 密码技术(加密与解密)。
2) 哈希技术,即散列技术。
3) 随机数。
4) 时间戳。
下面先讨论密码技术。
下图是一个典型的密码系统,展示了密码技术的应用场景:
明文:P 密文:C 加密密钥:K1 解密密钥:K2 加密方法:E 解密方法:D 加密与解密的关系可以用公式简洁地表示:
C = EK1(P) 表示用加密密钥K1通过加密方法E 对明文P 进行加密得到密文C 。 P = DK2(C) 表示用解密密钥K2通过解密方法D 对密文C 进行解密得到明文P 。 D K2(EK1(P))= P 由上面两个式子可以得到这个式子。
由此可见,实际上,密码算法E 和D 都是数学函数。
关于密码学,有两个基本原则:
1) 消息必须包含一定的冗余度。
2) 必须采取措施对抗重放攻击。
另外,关于密码系统的设计,还有一个原则叫做Kerckhoff 原则:
“密码算法必须公开,只有密钥需要保密。”
这个原则体现了一个思想:让入侵者知道密码算法没有关系,所有的秘密都隐藏在密钥中。对密码算法保密是不明智的,因为密码算法的设计很困难,一旦算法原理泄露了,必须得花费大量精力重新设计。但密钥可以随时更换。
每个密码算法,都有其数学背景,依赖某一种数学理论。下面是一些常见密码算法的数学理论依据:
1) 信息论
由香农(Claude Elmwood Shannon) 于1948年创立的现代信息论为安全的密码系统定义了一个精确的数学模型。
2) 复杂性理论
复杂性理论提供了分析密码算法的“计算复杂性”的方法。它通过对密码算法进行比较,来确定一个密码算法的安全性。密码算法的“计算复杂性”通常用时间复杂度和空间复杂度两个变量来度量。
3) 数论
数论中的模运算、素数、最大公因子、求模逆元、费尔马定理、中国剩余定理、迦罗瓦域理论等等,是很多密码学算法的数学基础。
4) 因子分解
对一个数进行因子分解就是找出它的素数因子。因子分解是数论中最古老的问题,分解一个数很简单,却是一个耗时的过程。一些经典的因子分解算法有:数域筛选法、二次筛选法、椭圆曲线法等。
5) 计算有限域中的离散对数
计算离散对数是数学中公认的难题。计算离散对数与因子分解有紧密关系,如果能解决离散对数问题,就能解决因子分解问题。
【密码学03】对称密码算法
前一篇文章【密码学02】密码系统原理及数学背景 提到了密码算法。每个密码算法都基于相应的数学理论。密码学发展至今,已经产生了大量优秀的密码算法,通常分为两类:对称密码算法和非对称密码算法。
对称密码算法是指有了加密密钥就可以推算出解密密钥,有了解密密钥就可以推算出加密密钥的的算法。还是用公式表示比较简洁:
E K1(P)= C
D K2(C)= P
其中E 为加密算法,D 为解密算法,P 为明文,C 为密文,K1为加密密钥,K2为解密密钥。在对称密码算法中,有了K1,就可以推算出K2,而有了K2,也可以推算出K1。实际应用的大多数对称密码算法中,K1与K2相同。因此对称密码算法的加密与解密关系如下: E K (P)= C
D K (C)= P
加密与解密都使用密钥K 。
之所以叫对称加密算法,就是加密与解密的密钥相同。
常见的对称密码算法有以下这些:
1) DES,数据加密标准。由IBM 于1970年代开发。DES 算法使用的密钥长度表示为64位(bit),但每个第8为都用作奇偶校验,所以对于使用者而言,密钥长度是56位。DES 将消息分成64位长的分组,一次加密一个分组,最后一个分组如果不满64位,需要按照某种策略填满64位,如下图所示。
DES 由于密钥太短,而且密钥空间中存在弱密钥,因此现在已经不再安全了。1977年斯坦福大学的两位密码学大师Diffie 和Helman 设计了一台机器,只要给定一小段明文和匹配的密文,一天之内即可推算出密钥。
2) 三重DES ,DES 的增强版本。如下图所示,还是利用DES 密码算法,但是利用三次,加密过程为“加密-解密-加密”,解密过程为“解密-加密-解密”。
用公式可以表示为:
E K1(DK2(EK3(P))) = C //加密
D K1(EK2(DK3(C))) = P //解密
由于三次过程使用的密钥不一样,所以相当于增加了密钥长度。实际应用中,K1和K3是相
同的,也就是外层的两次加密和两次解密使用相同的密钥。这样,三重DES 的密钥长度就相当于K1+K2的长度,即112位(DES的密钥长度为56位) 。采用“加密-解密-加密”模式的理由是为了与DES 保持兼容,只要设置K1=K2=K3,三重DES 不就和DES 一样了吗?只是多了两道运算步骤而已。
三重DES 只是DES 的一个变种,还有其它变种,例如DESX 、CRYPT(3)、GDES 、RDES 、s n DES 等等。
3) AES,高级加密标准。也叫Rijndael 算法,由两位比利时密码学家发明,参与了NIST (美国标准和技术委员会)1997年组织的公开密码学竞赛,最终以优异的技术特性胜出成为加密标准。AES 以前一篇文章提到的迦罗瓦域理论为数学基础。AES 也是分块对数据加密,只是块的长度并不像DES 那样定死为64位。Rijndael 的密钥长度可以从128位起以32位为间隔递增到256位。
Rijndael 算法完全公开、安全性好、运算速度极快。如果取密钥长度为128位,想用穷举法破解密钥,就算有一台内含1000亿个处理器的计算机,并且每个处理器每秒处理100亿个密钥,也要运行100亿年才能搜索完整个密钥空间。
4) 其它对称密码算法,有IDEA 、Lucifer 、Madryga 、NewDES 、FEAL 、REDOC 、LOKI 、RC2、MMB 、GOST 、CAST 、Blowfish 、SAFER 、3-WAY 、RC5、等等,现在的密码算法真是太多了。IDEA 是International Data Encryption Algorithm(国际数据加密算法)的缩写,该算法设计者是James Massey和Xuejia Lai(来学嘉)博士。来学嘉是瑞士籍华人,1954年出生,西安电子科大的硕士毕业生。James Massey是来学嘉的导师。
IDEA 算法安全性比DES 好(和AES 差不多) ,能抵抗差分密码分析的攻击,而DES 不行。
IDEA 的加密速度比DES 快,加密数据速率可达到177MB/秒,也和AES 差不多。
【密码学04】非对称密码算法
上一篇【密码学03】对称密码算法 介绍了对称密码算法,其主要特性就是加密解密密钥能互相推算,而实际应用中绝大多数对称加密算法的加密密钥和解密密钥是相同的。正因为如此,加密者指定一个密钥后,必须得想方设法把密钥分发出去给解密者,同时还得小心翼翼确保密钥不被泄露。这是对称密码算法固有的一个矛盾,如何解决呢?
还是前面提到的斯坦福两位密码学大师Diffie 和Helman ,1976年提出了一种全新的密码系统概念:非对称密码算法。下面看看非对称密码算法的特性。
与对称密码算法相反,非对称密码算法的加密密钥和解密密钥不相同,而且从加密密钥推算出解密密钥极其困难。简单来说,非对称密码算法的特性如下:
1) E K1(P) =C //E:加密算法,K1:加密密钥,P :明文,C :密文,下同。 D K2(C) = P //D:解密算法,K2:解密密钥。
综合上面两个式子,可得:
D K2(EK1(P)) = P
2) 从K1 推断出K2极其困难。如果密钥长度足够长,银河系中的任何一种生物都应该不可能轻易从K1推出K2,或者从K2推算K1。
3) 某些优秀的非对称密码算法还具有如下特性,但不是所有的算法都具备:
E K1(DK2(P)) = P
也就是加密函数E 与解密函数D 互为反函数,解密函数可以当成加密函数来用,加密函数也可以当成解密函数来用。这个特性非常迷人。
具备前面两个特性以后,加密密钥就可以放心地公之于众了。 Alice 要用非对称密码算法秘密地传送消息给Bob ,过程是怎么样的呢?首先Bob 自己要生成一对密钥BK1和BK2,他可以任意选择一个密钥比如BK1公布给所有人包括Alice ,他自己保留BK2不让任何人知道。Alice 知道Bob 公开的密钥BK1后,就可以用BK1加密明文P 得到密文C ,然后传送给Bob 。她不用担心别人能解密消息,因为BK1加密的消息只有BK2才能解密,而BK2只有Bob 才知道,想从BK1推算出BK2几乎不可能。Bob 收到消息,用私密的BK2解密即可得到明文。反过来,Bob 要传送消息给Alice ,Alice 也要先生成一对密钥AK1和AK2,并按照同样的过程进行。
由于非对称密码算法可以把加密密钥公开,因此也叫做公开密钥密码算法,简称公钥密码算法,或公钥算法。公钥算法的确是非常优雅地解决了密钥既要保密又要公开的矛盾。下面是一些常见的公钥密码算法。
1) RSA,是MIT (麻省理工学院)三个密码学大师Rivest 、Shamir 、Adleman 于1978年共同发表,因此名字就是三个人名的首字母。RSA 是最优秀的公钥算法,它满足上面提到的全部三个特性。RSA 算法的数学基础是【密码学02】密码系统原理及数学背景 一文提到的因子分解。RSA 算法经受住了密码分析学家们三十年来的大量攻击,虽然密码分析学家们不能证明RSA 是安全的,但也不能证明RSA 是不安全的。RSA 已经被广泛使用,为整个地球村的信息安全尤其是电子商务的安全做出了极大贡献。
2) El Gamal,该算法的数学基础是【密码学02】密码系统原理及数学背景 一文中提到的“计算有限域中的离散对数”的难题。El Gamal算法也是非常优秀的公钥密码算法。
3) 其它公钥密码算法还有很多,例如背包算法、Rabin 算法、Pohlig-Hellman 算法、McEliece
算法、基于椭圆曲线的算法、LUC 算法等等。
关于背包算法,Tanenbaum 的《Computer Networks》(4th )中讲述了一个有趣的故事:背包算法设计这Merkle 曾悬赏100美金破解该算法,RSA 组合中的S ,即Shamir 迅速破解算法并领走奖金。Merkle 于是增强了算法,再次悬赏破解,奖金加到1000美金。RSA 组合中的R ,即Rivest 又迅速破解领走奖金。此后Merkle 就没再悬赏了,因此RSA 组合中的另外一个人A ,即Adleman 也就没能拿到预期的10000美金了。从这个故事可以看出RSA 这个信息安全领域的黄金组合的确超级牛叉!
公钥密码算法非常优雅,但是几乎所有的公钥算法都有一个问题:速度太慢。RSA 算法的速度是DES 的1000分之一,并且密钥越长,速度会急剧变慢。因此实际应用中密码系统都是把公钥密码算法与对称密码算法结合在一起使用。
【密码学05】加密模式
大多数密码算法都是将明文切成固定长度的多个块,以块为单位进行加密,而不是逐个字节地加密数据。不管什么样的密码算法,任何时候当同样的明文块从算法前端输入,同样的密文块就从后端输出。入侵者可以充分发掘这种特性来协助攻破密码系统。下面举个例子来说明。
下面这个表描述的是三个人的年终奖金额度。
老板授权秘书MM 整理好这张表后,秘书MM 将其加密,然后提交给财务部门。为了清楚地描述问题,这里假设这张表的每个字段都是64位,而且刚好秘书MM 用的加密算法的加密块长度也是64位,那么加密结果可能就是像下面这个样子:
假设在秘书MM 发送这段密文之前,不巧让Trudy 看到了。尽管Trudy 看不懂这个表的内容,但是当秘书MM 抱怨就两个字段的表为什么么要定死每个字段长度为64位的时候,Trudy 获得了足够的信息。她知道由于自己刚和老板吵过嘴,奖金肯定没有其它人高,于是她尝试将这些密文块的顺序调整了一下,变成下面这个样子:
仅仅是调整一下密文块的顺序,财务部解密消息的时候完全察觉不到有任何异常。尽管Trudy 还是不知道奖金是多少,但是可以很有把握地相信自己的奖金会比原来高。
为了对抗这种问题,需要采取某种加密模式,需要把各个密文块关联起来,使得密文任何一处有异常更改,都会导致整个密文作废。常见的加密模式有以下这。
1) 电子密码本模式:ECB。这个不用再介绍了,就上面讲的有问题的这种模式,每块明文都对应自己的密文块,互不相干。虽然有问题,但它也是一种模式,呵呵。
2) 密码块链模式:CBC。每个纯文本块在加密前,通过按位“异或”操作与前一个块的密码文本结合。这样确保了即使纯文本包含许多相同的块,这些块中的每一个也会加密为不同的密码文本块。在加密块之前,初始化向量通过按位“异或”操作与第一个纯文本块结合。如果密码文本块中有一个位出错,相应的纯文本块也将出错。此外,后面的块中与原出错位的位置相同的位也将出错。下图是CBC 加密模式示意图。
3) 密码反馈模式。将少量递增的纯文本处理成密码文本,而不是一次处理整个块。该模式使用在长度上为一个块且被分为几部分的移位寄存器。例如,如果块大小为 8 个字节,并且每次处理一个字节,则移位寄存器被分为 8 个部分。如果密码文本中有一个位出错,则一个纯文本位出错,并且移位寄存器损坏。这将导致接下来若干次递增的纯文本出错,直到出错位从移位寄存器中移出为止。CFB 加密模式示意图如下。
4) 输出反馈模式。将少量递增的纯文本处理成密码文本,而不是一次处理整个块。此模式与 CFB 相似;这两种模式的唯一差别是移位寄存器的填充方式不同。如果密码文本中有一
个位出错,纯文本中相应的位也将出错。但是,如果密码文本中有多余或者缺少的位,则那个位之后的纯文本都将出错。
5) 流密码模式。用一个密钥加密一个初始向量生成一个输出块,然后用同样的密钥对这个输出块进行加密以得到第二个输出块,再用同样的密钥对这个输出块进行加密得到第三个输出块,以此类推。所有这些块的序列叫做密钥流。逐块输出密钥流时,就逐块与明文异或,输出的就是密文。
6) 计数器模式。用一个密钥加密一个初始向量生成输出块,然后将初始向量加1再用同样的密钥加密输出第二个输出块,以此类推。输出的块序列也是密钥流,逐块输出密钥流时,就逐块与明文异或,输出的就是密文。
7) CTS(密码文本窃用模式) 。处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。除了最后两个纯文本块外,对于所有其他块,此模式与CBC 模式的行为相同。
【密码学06】数据块填充模式
大多数密码算法都是块密码算法,需要将明文消息切成固定大小的块,一块一块地进行加密。例如DES 就需要将消息切割成一个个64位的块。如果消息长度不是64的整数倍,最后一个消息块就不够64位,这时就要对最后一个消息块进行填充。填充本身是很简单的事情,问题在于有很多种可行的填充方式,如果加密时以某种方式填充,解密时就得理解这种填充方式并去除填充内容,否则很可能解密出来得到的数据就是脏数据。
某些加密标准指定了特定的填充方案。下面简单描述一下这些模式的工作原理。
假定块长度为8字节,要加密的明文数据长度为9字节。那么消息被切成两个块,第二块只有1个字节,需要填充7个字节。假定9字节的明文数据如下:
F1 F2 F3 F4 F5 F6 F7 F8 F9
以下是常见的四种填充方式:
1) Zeros填充:全部填充为0的字节,结果如下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一块
F9 00 00 00 00 00 00 00 //第二块
2) X923 填充: 填充为0的字节序列,最后一个字节记录填充的总字节数,结果如下: F1 F2 F3 F4 F5 F6 F7 F8 //第一块
F9 00 00 00 00 00 00 07 //第二块
2) PKCS7 填充: 每个填充的字节都记录了填充的总字节数,结果如下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一块
F9 07 07 07 07 07 07 07 //第二块
3) ISO10126 填充: 填充随机字节序列,最后一个字节记录填充的总字节数,结果如下: F1 F2 F3 F4 F5 F6 F7 F8 //第一块
F9 7D 2A 75 EF F8 EF 07 //第二块
密码学
一、选择题 1、1949年,( A )发表题为《保密系统的通信理论》的文章,为密码系统建立了理论基础,从此密码学成了一门科学。A 、Shannon B 、Diffie C 、Hellman D 、Shamir
2、一个密码系统至少由明文、密文、加密算法、解密算法和密钥5部分组成,而其安全性是由( D )决定的。
A 、加密算法B 、解密算法C 、加解密算法 D 、密钥 3、计算和估计出破译密码系统的计算量下限,利用已有的最好方法破译它的所需要的代价超出了破译者的破译能力(如时间、空间、资金等资源),那么该密码系统的安全性是( B )。A 无条件安全B 计算安全C 可证明安全D 实际安全 4、根据密码分析者所掌握的分析资料的不同,密码分析一般可分为4类:唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击,其中破译难度最大的是( D )。
A 、唯密文攻击 B 、已知明文攻击 C 、选择明文攻击 D 、选择密文攻击
5、字母频率分析法对(B )算法最有效。A 、置换密码 B 、单表代换密码 C 、多表代换密码 D 、序列密码 6、(D )算法抵抗频率分析攻击能力最强,而对已知明文攻击最弱。A 仿射密码B 维吉利亚密码C 轮转密码D 希尔密码 7、维吉利亚密码是古典密码体制比较有代表性的一种密码,其密码体制采用的是(C )。
A 置换密码B 单表代换密码C 多表代换密码D 序列密码
8、在( C )年,美国国家标准局把IBM 的Tuchman-Meyer 方案确定数据加密标准,即DES 。 A 、1949 B 、1972 C 、1977 D 、2001
9、密码学历史上第一个广泛应用于商用数据保密的密码算法是( B )。 A 、AES B 、DES C 、IDEA D 、RC6 10、在DES 算法中,如果给定初始密钥K ,经子密钥产生的各个子密钥都相同,则称该密钥K 为弱密钥,DES 算法弱密钥的个数为(B )。A 、2 B 、4 C 、8 D 、16
11、差分分析是针对下面(A )密码算法的分析方法。A 、DES B 、AES C 、RC4 D 、MD5
12、AES 结构由一下4个不通的模块组成其中( A )是非线性模块。A 、字节代换B 、行位移C 、列混淆 D 、轮密钥加 14、适合文件加密,而且有少量错误时不会造成同步失败,是软件加密的最好选择,这种分组密码的操作模式是指( D )。 A 、电子密码本模式 B 、密码分组链接模式 C 、密码反馈模式 D 、输出反馈模式
15、m 序列本身是适宜的伪随机序列产生器,但只有在( A )下,破译者才不能破解这个伪随机序列。 A 、唯密文攻击 B 、已知明文攻击 C 、选择明文攻击 D 、选择密文攻击 16、Geffe 发生器使用了( C )个LFSR 。A 、1 B 、2 C 、3 D 、4 17、J-K 触发器使用了( B )个LFSR 。 A 、1 B 、2 C 、3 D 、4
18、PKZIP 算法广泛应用于( D )程序。A 、文档数据加密 B 、数据传输加密 C 、数字签名 D 、文档数据压缩 19、A5算法的主要组成部分是3个长度不同的线性移位寄存器,即A 、B 、C 。其中A 有(A )位,B 有( D )位,C 有( E )位。A 、19 B 、20 C 、21 D 、22 E 、23
20、SEAL 使用了4个( B )位寄存器。A 、24 B 、32 C 、48 D 、56 21、按目前的计算能力,RC4算法的密钥长度至少应为( C )才能保证安全强度。
A 、任意位 B 、64位 C 、128位 D 、256位 22、目前,使用最广发的序列密码是( A )。A 、RC4 B 、A5 C 、SEAL D 、PKZIP
23、下面(A )不是Hash 函数的等价提法。A 、压缩信息函数 B 、哈希函数 C 、单向散列函数 D 、杂凑函数 25、下面( B )不是Hsha 函数具有的特性。A 、单向性 B 、可逆性 C 、压缩性 D 、抗碰撞性 26、现代密码学中很多应用包含散列运算,而应用中不包含散列运算的是( A )。 A 、消息机密性 B 、消息完整性 C 、消息认证码 D 、数字签名
27、下面( C )不是Hash 函数的主要应用。A 、文件校验B 、数字签名C 、数据加密D 、认证协议 28、MD5算法以( D )位分组来处理输入文本。A 、64 B 、128 C 、256 D 、512 29、MD5的主循环有(B )轮。A 、3 B 、4 C 、5 D 、8
30、SHA1接收任何长度的输入消息,并产生长度为(B )bit 的Hash 值。A 、64 B 、160 C 、128 D 、512 31、分组加密算法(如AES )与散列函数算法(如SHA )的实现过称最大不同是( D )。 A 、分组 B 、迭代 C 、非线性 D 、可逆
32、生日攻击是针对( D )密码算法的分析方法。A 、DES B 、AES C 、RC4 D 、MD5 33、设Hash 函数的输出长度为n bit,则安全的Hash 函数寻找碰撞的复杂度应该为( C )。
A 、O (P (n ))B 、O(2n ) C 、O (2n-1)D 、O (2n/2)
34、MD5的压缩函数中,512bit 的消息被分为16块输入到步函数,每一块输入( B )次。A 、3 B 、4 C 、5 D、8 35、下列( D )算法不具有雪崩效应。A 、DES 加密B 、序列密码的生成C 、哈希函数D 、RSA 加密
36、若Alice 想向Bob 分发一个会话密钥,采用ElGamal 公钥加密算法,那么Alice 应该选用的密钥是( C )。
A 、Alice 的公钥 B 、Alice 的私钥 C 、Bob 的公钥 D 、Bob 的私钥 37、设在RSA 的公钥密码体制中,公钥为(e,n )=(13,35),则私钥d=( B )。A 、11 B 、13 C 、15 D 、17 38、在现有的计算能力条件下,对于非对称密码算法Elgamal ,被认为是安全的最小密钥长度是( D )。
A 、128位 B 、160位 C 、512位 D 、1024位
39、在现有的计算能力条件下,对于椭圆曲线密码算法,被认为是安全的最小密钥长度是( B )。
A 、128位 B 、160位 C 、512位 D 、1024位
40、指数积分法针对下面( C )密码算法的分析方法。A 、背包密码体制 B 、RSA C 、ElGamal D 、ECC 41、16模20的逆元是(D ) A 3 B 4 C 5 D 不存在 42、下面(D )不是代数系统构R (R ,+,·)成一个环的必要条件。A (a+b)+c=a+(b+c), B a+b=b+a C (a ·b )·c=a·(b ·c ) D 对于R 中的任何非零元a ,存在逆元a 负一次方属于R ,使a ·a 的负一次方=1 43、下列整数中属于Blum 数的是(A )A 21 B 28 C 35 D 42
44、雅可比符号J (384,443)=(D )A 1 B ﹣1 C 0 D 以上结果都不对 45、下面的描述中(A )是错误的A 互信息量等于先验的不确定性减去尚存的不确定性。 B 互信息量不能为负值 C 当X 表示信道的输入,Y 表示信道的输出时,条件熵H (X 丨Y )表示X 未被Y 所泄露的信息量的均值。 D 任何两个事件之间的互信息量不可能大于其中任一事件的自信息量
46、计算复杂性是密码分析技术中分析计算量和研究破译密码的固有难度的基础,算法的运行时间为难解的是(C )。
A 、O (1) B 、O (n ) C 、(n 的平方) D 、O (2的n 次方) 二、填空题 1、1976年W.Diffie 和M.Hellman 在 2、密码学的发展过程中,两个质的飞跃分别指。 3、密码学是研究信息及信息系统安全的科学,密码学又分为学。 4、一个保密系统一般是5部分组成的。
5、密码体制是指实现加密和解密功能的密码方案,从使用密钥策略上,可分为和 。 6、对称密码体制又称为密码体制,它包括密码和
7、在1949年香农发表《保密系统的通信理论》之前,密码学算法主要通过字符间的这些密码体制属于传统密码学范畴。
8、传统密码体制主要有两种,分别是指
9、置换密码又叫和
10、代换是传统密码体制中最基本的处理技巧,按照一个明文字母是否总是被一个固定的字母代替进行划分,代换密码主要分为两类:单表代换和多表代换密码。
11、一个有6个转轮密码机是一个周期长度为 12、分组密码主要采用
13、在今天看来,DES 算法已经不再安全,其主要原因是。
14、轮函数是分组密码结构的核心,评价轮函数设计质量的三个主要指标是。 15、DES 的轮函数F 是由三个部分:和组成的。 16、DES 密码中所有的弱密钥半弱密钥四分之一弱密钥和八分之一弱密钥全部加起来一共有个安全性较差的密钥。 17、关于DES 算法,密钥的长度(即有效位数)是DES 在选择明文攻击下所需的工作量减半。 18、分组密码的加解密算法中最关键部分是非线性运算部分,那么,DES 加密算法的非线性预算部分是指AES 加密算法的非线性运算部分是指。
19、在AES 。
20、在高级加密标准AES 规范中,分组长度只能是位,密钥的长度可以是 19、DES 与AES 运算AES 面向字节运算。
20、序列密码的起源可以追溯到 。
21、序列密码结构可分为和两个主要组成部分。
22、序列密码的安全核心问题是。 23、序列密码的工作方式一般分为是
24、一般地,一个反馈移位寄存器由两部分组成: 。
26、选择合适的n 级线性反馈函数可使序列的周期达到最大值,并具有m 序列特性,但敌手知道一段长为 n 的明密文对时即能破译这n 级线性反馈函数。
27、门限发生器要求:LFSR 的数目是LFSR 的长度到最大周期。
28、Hash 函数就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出称为。 29、Hash 函数的单向性是指。
31、MD5算法的输入是最大长度小于bit 的消息,输出为 bit 的消息摘要。
32、MD5的分组处理是由4轮构成的,每一轮处理过程类似,只是使用的16个步函数组成,每个步函数相投,但为了消除输入数据的规律性而选用的 逻辑函数 (非线性函数)不同。
33、SHA1的分组处理是有80步构成的,每20步之间的处理差异在于使用的和而每步的32bit 消息字生成也有所差异,其中前 16 步直接来自消息分组的消息字,而余下的 4 步的消息字是由前面的4个值相互异或后再循环移位得到的。
34、与以往攻击者的目标不同,散列函数的攻击不是恢复原始的明文,而是寻找攻击方法是 生日攻击,中途相遇攻击 。
35、消息认证码的作用是 和。 36、MD5、SHA1、SHA256使用的寄存器长度为bit ,SHA512使用的寄存器长度为38、公钥密码体制的思想是基于计算。 39、年,W.Diffie 和M.Hellman 在一文中提出了公钥密码的思想,从而开创了现代密码学的新领域。 40、公钥密码体制的出现,解决了对称密码体制很难解决的一些问题,主要体现一下三个方面:管理问题 和 数字签名问题 。
41、RSA 的数论基础是,在现有的计算能力条件下,RSA 被认为是安全的最小密钥长度是 42、公钥密码算法一般是建立在对一个特定的数学难题求解上,那么RSA 算法是基于ElGamal 算法是基于 有限域乘法群上离散对数 的困难性。
43、基于身份的密码体制,李永用户公开的信息作为公钥来解决用户公钥的真实性问题,但在实际应用中,这种体制存在以下两方面不足: 用户私钥的安全性 , 这种体制的应用范围 。
44、Rabin 公钥密码体制是1979你M.O.Rabin 在论文《Digital Signature Public-Key as Factorization》中提出的一种新的公钥密码体制,它是基于 合数模下求解平方根的困难性 (等价于分解大整数)构造的一种公钥密码体制。 45、1984年,Shamir 提出了一种的思想,方案中不使用任何证书,直接将用户的身份作为公钥,以此来简化公钥基础设施PKI 中基于公钥证书维护的过程。
46、模运算是等价运算,这是因为模运算具有 47、设m 为一个非0,非±1的整数,若a 对模m 的逆存在。
48、设E 是一个域,F 是E 的一个子集,如果F 关于E 上的运算自身也构成一个域,则称F 为E 的,E 为F 的49、1949年,香农在《Bell Systems Technical Journal 》上发表题为密通信问题作了全面的阐述,建立了保密通信系统的数学理论,它对后来密码学的发展产生了巨大影响。
50、自然语言的字符之间不是毫无关联的,为了衡量自然语言信源符号间的依赖程度,本文引入和的概念。
51杂度来度量。 三、简答题
1、信息安全中常用的攻击分别指什么?分别使用什么密码技术能抵御这些攻击?
答:常用的攻击形式有:中断、截取、篡改、伪造和重放五类。其中截取属被动攻击,其余属主动攻击。
对于被动攻击,可用数据加密技术进行数据保护,其重点是防止而不是检测;对于主动攻击,可采取适当措施加以检测,并从攻击引起的破坏或时延中予以回复。
2、公钥密码体制与对称密码体制相比,有哪些优点和不足?
答: 优点:I. 密钥的分发相对容易;II. 密钥管理简单;III. 可以有效地实现数字签名。
缺点:I. 与对称密码体制相比,非对称密码体制加解密速度较慢;II. 同等安全强度下,非对称密码体制要求的密钥位数要多一些;III. 密文长度往往大于明文长度。 3、简述密码体制的原则。
答:密码系统的安全性不应取决于不易改变的算法,而应取决于可以随时改变的密钥。加密和解密算法的安全性取决于密钥的安全性,而加密/解密的过程和细节是公开的,只要密钥是安全的,则攻击者就无法推导出明文。 4、简答题及计算题
求置换
的逆置换。
6==(1 5 6 8 3 7 4 2),6的逆==(1 2 4 7 3 8 6 5)
5、用维吉尼亚密码加密明文“please keep this message in secret”其中使用的密钥为“computer ”试求其密文。 K=computer 所以k=(2,14,12,15,20,19,4,17)
p 2R
l e 4
a 0
s 18
e 4
k 104O
e 417V
e 426G
p t h 722W
i 82C
s m 4Q
e 417V
s 2U
s a 0
g 6
e 4
i 81B
n 417R
s 179J
e 426G
c 216Q
r e t 9
151115193D
5F
18121818
6G
131817213D
1412152019Z
Q
P
M
X
1412152019
L
1412152019
122124M
V
Y
14121520
1913T
N
172516151223142111162120
得到的密文是:RZQPMXOVGDFWCLQVUGMVYBRJGQDTN
6、用Playfair 密码加密明文“hide the gold in the tree stump”密钥是“cryptography ”试求其密文。 由密钥得出的矩阵如下:
P=hide the gold in the tree stump,所以密文为:IQEFPBMEDUEKYSGIPCIMKMCZRQ (ee 中间加q )
7、用Hill 密码加密明文“hill ”, 使用的密钥是: K= C=(7,8,11,11)=(269,268,268,258)mod26=(mod26)=(9,8,8,24)
密文为:JIIY
8、题目:已知一下密文是由仿射密码得到的试求其明文。
“FMXVEDKAPHFERBNDKRXRSREFMORUDSDKDVSHVUFEDKAPRKDLYEVLRHHRH ” 解答:统计得出:
A :2 B:1 C :0 D:7 E:5 F:4 G:0 H:5 I:0 J:0 K:5L:2 M:2 N:1 O:1 P:2 Q:0 R:8 S:3 T:0 U:2 V:4 W:0 X:2 Y:1 Z:0
根据统计规律我们猜想R 是e 加密得到的,D 是t 加密得到的,因为t ,e 出现频率较高,得到同余方程组(4a+b)mod26=17,(19a+b)mod26=13 得到a=6,b=19仿射密码要求gcd (a ,26)=1,所以此解错误。再次猜想R 是e 加密的得到的,k 是t 加密得到的,从而得到a=3,b=5,将此解带入密文测试发现k=(3,5)正确,推出解密函数d (y )=9y-19得到解密结果: algorithmsarequitegeneraldefinitionsofarithmeticprocesses 9、简述单表代换密码和多表代换密码的基本思想及其优缺点
10、用C 语言编写欧几里德算法的程序。 #include unsigned int Gcd( unsigned int M, unsigned int N ) { unsigned int Rem; while( N > 0 ) { Rem = M % N; M = N; N = Rem; } return M; } void main() { int temp; int a,b; scanf("%d",&a); scanf("%d",&b); printf("thegreatest common factor of %d and %d is ",a,b); printf("%d\n",Gcd(a,b)); } 11、用欧几里德算法计算gcd (1024,888)。 gcd (8,0);gcd (1024,888)=8 12、利用欧拉定理可简化大指数的幂运算,计算2gcd (2,99)=1 φ(99)=φ(9*11)=φ(32*11)=9*(1-1/3)*11=66 1000000=16666*60+40 2 1000 000 1000 000 1024=888*1+136 ,gcd (888,136);888=136*6+72,gcd (136,72);136=72*1+64, gcd(72,64);72=64*1+8,gcd (64,8);64=8*8+0 mod99 mod99≡2 16666*60+40 mod99≡2 40 mod99≡1024mod99≡34mod99≡67mod99≡34 4 42 13、设Z 2[x]的两个元a(x)=2x4+2,b(x)=x5+2,求gcd[a(x),b(x)]=g(x),并找出s(x),t(x)使g(x)=s(x)a(x)+t(x)b(x)。 x 5+2≡2x(2x4+2)+(2x+2) 2x 4+2≡(x3+2x2+x+2)(2x+2)+1 1≡2x 4+2-(x3+2x2+x+2)(2x+2) ≡2x 4+2-(x3+2x2+x+2)[(x5+2)-2x(2x4+2)] ≡(2x4+4x3+2x2+4x+1)(2x4+2)+(2x3+x2+2x+1)(x5+2) ≡(2x4+x3+2x2+x+1)(2x4+2)+(2x3+x2+2x+1)(x5+2) 所以,g(x)=1,s(x)=2x4+x3+2x2+x+1,t(x)=2x3+x2+2x+1。 14、(韩信点兵问题)有兵一队,若列成五行纵队,则末行一人;成六行纵队,则末行五人;成七行纵队,则末行四人;成十一行纵队,则末行十人,求兵数。 x ≡1mod5,x ≡5mod6,x ≡4mod7,x ≡10mod11 m 1 =5, m2 =6,m3 =7,m4 =11;a 1 =1, a2 =5,a3 =4,a4 =10 M=5*6*7*11=2310,M 1 =6*7*11=462, M2 =5*7*11=385, M3 =5*6*11=330,M4 =5*6*7=210 Mb ≡1modm ,462b 1≡1mod5;b 1≡3mod5,385b 2≡1mod6;b 2≡1mod6,330b 3≡1mod7;b 3≡1mod7,210b 4≡1mod11;b 4≡1mod11 1*3*462+5*1*385+4*1*330+1*10*210≡2111mod2310,兵数2111mod2310。 。。)是半群。 15、设在Z +中,为a 。b=a+b+a. b,a,b ∈Z + ,这里+ ,. 分别为数的加法和乘法,证明(Z +,证明:①封闭性 。)满足封闭性。 ∵a,b ∈Z + ∴a+b+a. b ∈Z + ∴a 。b ∈Z + ∴(Z +,②结合律 。c=(a+b+a.b)。c=(a+b+a.b)+c+(a+b+a.b)*c=a+b+c+ac+bc+ab+abc (a 。b ) a 。(b。c)=a。(b+c+b. c)=a+b+c+b. c+a*(b+c+b. c)=a+b+c+ac+bc+ab+abc 。∴(a 。b )c=a。(b。c) 16、设密文空间共含有5个信息mi,(1≤i ≤5), 并且p(m1)=p(m2)=1/4,p(m3)=1/8,p(m4)=p(m5)=3/16,求H (m )。 H(x)=-∑p(xi)log(p(xi)) (i=1,2,3,4) =-(2*(1/4log1/4)+1/8log1/8+2*(3/16log3/16))=23/8-3/8log3 17、请给出一个NP 完全类问题的例子。 旅行商问题 (TSP Travelling Salesman Problem)该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。可以用回溯法和贪心算法解决。还有子集和问题 ,Hamilton 回路,最大团问题等。 18、分组密码的设计应满足的要求是什么? 答:①分组要足够长。假设n 为分组长度,则要使分组代换字母表中的元素个数2n 足够大,以防止明文穷举攻击。 ②密钥长度要足够长,以防止密钥穷举攻击。但密钥又不能过长,这不利于密钥的管理且影响加解密的速度。 ③由密钥确定的置换算法要足够复杂,足以抵抗各种已知的攻击,如查分攻击和线性攻击等,使攻击者除了利用穷举攻击外,无其他更好的攻击方法。 ④加密解密运算简单,易于软件和硬件的快速实现。为了便于软件编程和通过逻辑电路实现,算法中的运算应尽量简单,如二进制加法或移位运算,参与运算的参数长度也应选择在8的整数倍,可以充分发挥计算机中字节运算的优势。 ⑤一般无数据扩展,即明文和密文长度相同。在采用同态置换和随机话加密技术时可引入数据扩展。 ⑥差错传播尽可能的小。 设计密码时,①②③的安全性为必要条件,同时还需考虑④⑤⑥。 归纳起来,一个分组密码在实际应用中需要在安全性和实用性之间寻求一种平衡,使算法在足够安全的同时,又具有尽可能短的密钥,尽可能小的存储空间以及尽可能快的运行速度。 19、简述分组密码设计的准则。 答:①分组长度。分组长度越长意味着安全性越高,但是会影响加密解密的速度。建议使用分组长度128位。②密钥长度。密钥越长同样意味着安全性越高,但会影响加密和解密的速度。通常使用的密钥长度为128位。③轮函数F 。在设计中,轮函数要遵循雪崩效应准则和位独立准则。④迭代的轮数。一般而言,决定迭代轮数的准则是:是密码分析的难度大于简单穷举攻击的难度。⑤子密钥的生成方法:实现简单,便于硬件实现,子密钥的生成不影响迭代轮函数的执行;不存在简单关系;种子密钥的所有比特对每个子密钥比特影响大致相同;没有弱密钥或弱密钥容易避开;保证密钥和密文符合位独立准则和雪崩效应。④工作模式应易于实现。 20、简要说明散列(哈希)函数的特点。 答:哈希函数有如下特点:输入数字串与输出数字串具有唯一的对应关系; 输入数字串中任何变化会导致输出数字串也发生变化; 从输出数字串不能够反求出输入数字串。 21、数字签名算法中,对消息的Hash 值签名,而不对消息本身签名有哪些好处? 答:由于安全的Hash 函数具有抗碰撞性,所以利用消息散列值实现数字签名,能够满足消息的完整性,防伪造性以及不可否认性等特点,而且签名短,更容易管理,有利于签名的扩展。 23、密钥序列生成器是序列密码算法的核心,请说出至少5点关于密钥序列生成器的基本要求。 ①种子密钥K 的长度足够大,一般应在128位以上; ②KG 生成的密钥序列{ki }具极大周期; ③{ki }具有均匀的n 元分布; ④利用统计分析方法由{ki }提取关于KG 结构或K 的信息在计算上不可行; ⑤混乱性,即{ki }的每一比特位均与K 的大多数比特有关; ⑥扩散性,即K 的任一比特的改变要引起{ki }在全貌上的变化; ⑦序列密钥{ki }不可预测,密文和相应明文的部分信息,不能确定整个{ki }。 24、公钥密码体制与对称密码体制相比有哪些优点和不足? 答:对称密码:一般要求: 1、加密解密用相同的密钥 2、收发双方必须共享密钥 ;安全性要求: 1、密钥必须保密 2、没有密钥,解密不可行 3、知道算法和若干密文不足以确定密钥 公钥密码:一般要求:1、加密解密算法相同,但使用不同的密钥 2、发送方拥有加密或解密密钥,而接收方拥有另一个密钥;安全性要求: 1、两个密钥之一必须保密 2、无解密密钥,解密不可行 3、知道算法和其中一个密钥以及若干密文不能确定另一个密钥 25、RSA 算法中n =11413,e =7467,密文是5859,利用分解11413=101×113,求明文。 解:n =p ?q =101?113=11413,?(n ) =(p -1)(q -1) =(100-1)(113-1) =11088显然,公钥e=7467,满足1<e <?(n ) ,且满足 -1 gcd(e , ?(n )) =1,通过公式d ?e ≡1mod11088求出d ≡e m o d ?(n =) ,3由解密算法m ≡c d mod n 得 m ≡c d mod n =58593mod11413=1415 26、在RSA 算法中,对素数p 和q 的选取的规定一些限制,例如:①p 和q 的长度相差不能太大,相差比较大;②P-1和q-1都应有大的素因子;请说明原因。 答:对于p ,q 参数的选取是为了起到防范的作用,防止密码体制被攻击 ①p ,q 长度不能相差太大是为了避免椭圆曲线因子分解法。 ②因为需要p ,q 为强素数,所以需要大的素因子 27、 Z 11上的椭圆曲线E :y 2 =x 3+x +6,且m=3。 ①请确定该椭圆曲线上所有的点; ②生成元G=(2,7),私钥 P B =2n B =(5,2) ,明文消息编码到P m =(9,1)上,加密是选取随机数k=3,求加解密过程。 y 2=x 3+x +6(mod11),现以x=0为例子。 解:①取x=0,1,?,10 并计算 23 y =0+0+6(mod11)=6mod11,没有模11的平方根,所以椭圆上不存在横坐标为0 的点;同理依次可以得到椭圆上的 因为x=0, 点有(2 , 4) (2,7) (3 , 5) (3,6) (5,9) (5 , 2) (7 , 9) (7 ,2) (8 , 8) (8 , 3) (10 , 9) (10 , 2) 23y =x +x +6(mod11),G =(2,7),P B =(5,2)}。 ②密钥生成:由题得B 的公钥为{E: 计算机与信息工程学院 《密码学设计课程设计》报告 (2015/2016学年 第 一学期) 题 目: 系 别: 专 业: 班 级: 学 号: 姓 名: 2015年12月1日 摘 要 DES 算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM 公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES 运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。数据总是通过介质传送,所以数据常常出现被截取、中断、篡改、伪造等安全性问题。随着数字签名、身份验证、数据加密技术的应用,数据安全问题得到了缓解,尤其是数据加密技术使网络数据传输更加安全。 本文详细分析并实现DES 算法的加密和解密规则,指出了DES 算法中存在的缺陷,对降低DES 算法加密强度的原因进行了分析,针对DES 算法存在的安全隐患给予了简单说明,指出了DES 加密算法的使用误区。本文分析了DES 加密算法的基本原理,分别从初始变换、DES 的迭代过程、密钥变换和逆置换等四个方面加以研究,并且用Visual C ++语言实现了它的模拟应用。 关键词:加密;解密; DES算法; Visual C ++ 目录 1、前言 . ............................................................ 3 1.1 背景 ......................................................... 3 2、 DES算法简介 .................................................... 3 2.1 概述 .......................................................... 3 2.2 算法特点 ...................................................... 3 2.3算法原理 ...................................................... 3 2.4 算法分析 ...................................................... 4 2.5算法工作流程 .................................................. 6 3、结果验证 . ........................................................ 7 3.1 验证过程 ...................................................... 7 4、实验总结 . ........................................................ 8 5、参考文献 . ........................................................ 9 附录 . ............................................................... 9 1、前言 1.1背景 数据加密标准(DES ,Data Encryption Standard )是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法。美国国家标准局(NBS )于1973年向社会公开征集一种用于政府机构和商业部门的加密算法,经过评测,最终选择了IBM 公司提出的一种加密算法。经过一段时间的试用,美国政府于1977年颁布DES 。DES 是分组密码的典型代表,也是第一个被公布出来的标准算法,曾被美国国家标准局(现为国家标准与技术研究所NIST )确定为联邦信息处理标准(FIPS PUB 46),使用广泛,特别使在金融领域,曾是对称密码体制事实上的世界标准。DES 自从公布以来,已成为金融界及其他各种行业最广泛应用的对称密钥密码系统。DES 是分组密码的典型代表,也是第一个被公布出来的标准算法。原来规定DES 算法的使用期为10年,可能是DES 尚未受到严重威胁,更主要是新的数据加密标准研制工作尚未完成,或意见尚未统一,所以当时的美国政府宣布延长它的使用期。因而DES 超期服役到2000年。近三十年来,尽管计算机硬件及破解密码技术的发展日新月异,若撇开DES 的密钥太短,易于被使用穷举密钥搜寻法找到密钥的攻击法不谈,直到进入20世纪90年代以后,以色列的密码学家Shamir 等人提出一种“差分分析法”,以后日本人也提出了类似的方法,这才称得上对它有了攻击的方法。严格地说Shamir 的“差分分析法”也只是理论上的价值。至少到目前为止是这样,比如后来的“线形逼迫法”,它是一种已知明文攻击,需要243≈4.398×1012个明、密文对,在这样苛刻的要求下,还要付出很大的代价才能解出一个密钥。不管是差分攻击还是线性攻击法,对于DES 的安全性也仅仅只做到了“质疑”的地步,并未从根本上破解DES 。也就是说,若是能用类似Triple-DES 或是DESX 的方式加长密钥长度,仍不失为一个安全的密码系统。 早在DES 提出不久,就有人提出造一专用的装置来对付DES ,其基本思想无非是借用硬件设备来实现对所有的密钥进行遍历搜索。由于电子技术的突飞猛进,专门设备的造价大大降低,速度有质的飞跃,对DES 形成了实际的威胁。DES 确实辉煌过,它的弱点在于专家们一开始就指出的,即密钥太短。美国政府已经征集评估和判定出了新的数据加密标准AES 以取代DES 对现代分组密码理论的发展和应用起了奠基性的作用,它的基本理论和设计思想仍有重要参考价值。 安全性是分组密码最重要的设计原则,它要求即使攻击者知道分组密码的内部结构,仍不能破译该密码,这也意味着,不存在针对该密码的某种攻击方法,其工作量小于穷密钥搜索。但是随着密码分析技术的发展,使得对于具有更多轮的分组密码的破译成为可能。 现如今,依靠Internet 的分布式计算能力,用穷举密钥搜索攻击方法破译已成为可能。数据加密标准DES 已经达到它的信任终点。但是作为一种Feistel 加密算法的例子仍然有讨论的价值。 2、 DES算法简介 2.1 概述 DES 是 D a t a E n c r y p t i o n S t a n d a r d(数据加密标准)的缩写。它是由IBM 公司研制的一种加密算法,美国国家标准局于19 7 7 年 公布把它作为非机要部门使用的 数据加密标准,二十年来,它一直活跃在国际保密通信的舞台上 ,扮演了十分重要的角色 。 DES 是一个分组加密算法,它以6 4位为分组对数据加密。同时DES 也是一个对 称算法 ,加密和解密用的是同一个算法 。它的密匙长度是56位(因为每个第8 位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变 。 其中有极少量的数被认为是弱密匙 ,但是很容易避开他们 。所以保密性依赖于密钥 。 2.2 算法特点 DES 算法具有极高安全性,到目前为止,除了用穷举搜索法对DES 算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。然而,这并不等于说DES 是不可破解的。而实际上,随着硬件技术和Intemet 的发展,其破解的可能性越来越大,而且,所需要的时间越来越少。 为了克服DES 密钥空间小的缺陷,人们又提出了三重DES 的变形方式。 2.3算法原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的第8位作为奇偶校验位),产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 轮循环,使用异或,置换,代换,移位操作四种基本运算。 DES 的工作原理可用下图(a)表示。需要进行加密处理的明文(plaintext)被分成64位(64-bit)的块,DES 的目标就是对这64位的明文56位的密钥(初始Key 值为64位,但DES 算法规定,其中第8、16、......64位是奇偶校验位,不参与DES 运算,故Key 实际可用位数便只有56位) 进行加密处理,生成对应的64位的密文(ciphertext)。为讨论方便,以下假设初始明文就是64位的。 DES加密过程可分为19步。第1步是对64位明文进行 置换操作;最后1步则是对前面一步的64位数进行反向置换操作。倒数第2位是将前面一步的64位数的前32位与后32位进行交换。剩下的16位操作功能是一样的,只是每一位所使用的密钥K 是不同的。 DES 的工作原理 2.4算法分析 (1) 初始置换IP 和初始逆置换IP-1 初始置换和初始逆置换为互逆运算,初始置换发生在加/解密运算前,初始逆置换发生在加/解密运算后。初始置换和初始逆置换的变换分别如表3.1和表3.2所示。这里表格的数字是指数据所在的位置。 初始置换IP 初始逆置换IP-1 (2)扩展置换 32位的右半部分明文数据首先要进行扩展置换,扩展置换将32位的输入数据扩展成为48位的输出数据,它有三个目的:第一, 它产生了与子密钥同长度的数据以进行异或运 算;第二,它提供了更长的结果,使得在以后的子加密过程中能进行压缩;第三,它产生雪崩效应(avalanche effect ), 这也是扩展置换最主要的目的,使得输入的一位将影响两个替换,所以输出对输入的依赖性将传播的更快(雪崩效应)。扩展置换的置换方法与初始置换相同,只是置换表不同,扩展置换表如下所示。 扩展置换表 (3)16轮循环 经过了初始置换的64位明文数据在中间分成2部分,每部分32位,左半部分和右半部分分别记为L0和R0。然后,L0和R0进入第一轮子加密过程。R0经过一系列的置换得到32位输出,再与L0做逐位异或(XOR )运算。其结果成为下一轮的R1,R0则成为下一轮的L1,如此连续运作16轮。我们可以用下列两个式子来表示其运算过程: 16轮循环 2.5算法工作流程 des加密流程 3、结果验证 3.1 验证过程 1. 编辑代码,运行代码得到如图4-1的运行结果 图4-1 2.输入数据进行测试。 (1)输入纯字母进行测试,运行结果如图4-2所示。 图4-2 (2)输入纯数字进行测试,运行结果如图4-3所示。 图4-3 (3)输入数字与字母进行测试,运行结果如图4-4所示。 图4-4 (4)输入数字、字母、特殊字符进行测试,运行结果如图4-5所示 图4-5 4、实验总结 通过本次的课程设计,我对DES 加密算法的有关知识有了进一步的了解,刚刚开始我并不知道如何去完成这次的课程设计,但通过我去网上查询有关的资料,我最终知道该从哪里下手去写这篇课程设计。通过本次的课程设计,我知道了自己身上的不足和自己知识的欠缺。本次课程设计,我不断的调试代码,花了较多的时间,最终成功的把代码调试好,心中充满着喜愉,通过本课程设计,我增加了许多的知识,对DES 算法的使用有了更进一步的了解。通过本次的课程设计,发现自己在数据结构方面的了解不足,在调试代码中,发现有较多的错误,这些错误的产生都是因为我对知识的认识不够深入而产生的。通过本次的课程设计,我对如何去设计DES 算法有了一定的了解。 5、参考文献 [1]张延伟 杨金岩,Verilog HDL 程序设计实例详解,人民邮电出版社,2008,258-276 [2]Tomst Denis ,Simon Johnson ,沈晓斌,程序员密码学,机械工业出版社,2006,16-31 [3] 毛明,大众密码学,高等教育出版社,2003,5-13 [4] Ranjan Bose ,吴传坤,信息论编码与密码学,机械工业出版社,2005,18-35 [5] 宋震等. 密码学. 中国水利水电出版社,2002 [6] 冯登国,吴文玲. 分组密码的设计与分析. 清华大学出版社,2000 [7]张焕国, 冯秀涛, 覃中平, 等. 演化密码与DES 的演化研究[J].计算机学报,2003,26(12). [8]沈昌祥, 张焕国, 冯登国, 等. 信息安全综述[J].中国科学(E辑:信息科学),2007(2). [9]谷利泽, 郑世慧, 杨义先. 现代密码学教程[M].北京:北京邮电大学出版社,2009 [10]章照止. 现代密码学基础(第一版). 北京邮电大学出版社 2004,(3) [11]叶阮健. 曹英. 张长富. 经典密码学与现代密码学,2004 [12]赖溪松 韩亮. 计算机密码学及其应用 . 国防科技大学, 2001 附录 #include void reader(char str[30],char s[8]) //读取明文和密钥 { FILE *fp; fp=fopen(str,"r"); if(fp==NULL) { printf("明文读取失败!\n"); } else { fscanf(fp,"%s",s); } fclose(fp); } void To2Bin(char p[8],int b[64]) //将字节转换成二进制流 { int i,k=0; for(i=0;i<8;i++) {="" int="" j="0x80;" for(;j;j="">>=1) { if(j&p[i]) { b[k++]=1; } else { b[k++]=0; } } } } int IP_Table[64] = //初始置换(IP) { 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6 }; int E_Table[] = { //扩展变换E 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0 }; int S_Box[8][4][16] = { //8个s 盒 { {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7}, { 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8}, { 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0}, {15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13} }, { {15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10}, { 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5}, { 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15}, {13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9} }, { {10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8}, {13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1}, {13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7}, { 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12} }, { { 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15}, {13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9}, {10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4}, { 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14} }, { { 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9}, {14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6}, {4, 2, 1, 11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14}, {11,8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3} }, { {12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11}, {10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8}, { 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6}, { 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13} }, { { 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1}, {13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6}, { 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2}, { 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12} }, { {13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7}, { 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2}, { 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8}, { 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11} } }; int IP_1_Table[64] = //逆初始置换IP^-1 { 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25, 32, 0, 40, 8, 48, 16, 56, 24 }; int P_Table[32] = //置换运算P { 15,6,19,20, 28,11,27,16, 0,14,22,25, 4,17,30,9, 1,7,23,13, 31,26,2,8, 18,12,29,5, 21,10,3,24 }; int PC_1[56] = { 56,48,40,32,24,16,8, //密钥置换PC_1 0,57,49,41,33,25,17, 9,1,58,50,42,34,26, 18,10,2,59,51,43,35, 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13,5,60,52,44,36,28, 20,12,4,27,19,11,3 }; int PC_2[48] = //密钥置换PC_2 { 13,16,10,23,0,4, 2,27,14,5,20,9, 22,18,11,3,25,7, 15,6,26,19,12,1, 40,51,30,36,46,54, 29,39,50,44,32,47, 43,48,38,55,33,52, 45,41,49,35,28,31 }; void Replacement(int arry1[],int arry2[],int arry3[],int num) //置换函数(初始IP ,逆初始IP , { int i,tmp; for(i=0;i while(i<16) {="" int="" j;="" lif_move(c[i],c[i+1],move_times[i]);="" lif_move(d[i],d[i+1],move_times[i]);="" for(j="">16)><28;j++) {="" k2[j]="C[i+1][j];" k2[j+28]="D[i+1][j];" }="" replacement(k2,pc_2,k[i],48);="" 密钥置换pc_2="" i++;="" }="" }="" void="" s_compress(int="" arry[],int="" shc[])="" s盒压缩变换,其中数组shc="" 存放经过s="" 盒的结果="" {="" int="" h,l;="" 行,列="" int="" sha[8];="" 存放经过s="" 盒的十进制结果="" int="" i,j;="" int="" temp[4];="" for(i="">28;j++)><8;i++) s盒压缩变换="" {="" h="arry[(1+(i*6))-1]*2" +="" arry[(6+(i*6))-1];="" l="arry[(2+(i*6))-1]*8" +="" arry[(3+(i*6))-1]*4="" +="" arry[(4+(i*6))-1]*2="" +="" arry[(5+(i*6))-1];="" sha[i]="S_Box[i][h][l];" }="" for(i="">8;i++)><8;i++) {="" for(j="3;j">=0;j--) { temp[j]=sha[i]%2; sha[i]=sha[i]/2; } for(j=0;j<4;j++) {="" shc[4*i+j]="temp[j];" }="" }="" }="" void="" to10(int="" a[],="" int="" b[],int="" n)//二进制转十进制="" {="" int="" i,j;="" int="" temp;="" int="" arry[16][4];="" for(i="">4;j++)> int arry[8][8]; int t=1,k; for(i=0;i } k++; } for(i=0;i<32;i++) {="" c0[i]="R[16][i];" c0[i+32]="L[16][i];" }="" replacement(c0,ip_1_table,c1,64);="" 逆初始置换="" }="" void="" changekey(int="" a[16][48])="" {="" int="" i,j;="" int="" tmp[16][48];="" for(i="">32;i++)><16;i++) {="" for(j="">16;i++)><48;j++) {="" tmp[i][j]="a[i][j];" }="" }="" for(i="">48;j++)><16;i++) {="" for(j="">16;i++)><48;j++) {="" k[i][j]="tmp[15-i][j];" }="" }="" }="" void="" decryption(int="" c1[],int="" m[])="" {="" int="" c0[64],t[64];="" int="" i,k;="" int="" arry[32];="" changekey(k);="" replacement(c1,ip_table,c0,64);="" 初始ip="" for(i="">48;j++)><32;i++) {="" l[0][i]="c0[i];" r[0][i]="c0[i+32];" }="" k="1;">32;i++)><17) {="" f_function(r[k-1],arry,k-1);="" for(i="">17)><32;i++) {="" l[k][i]="R[k-1][i];" r[k][i]="L[k-1][i]^arry[i];" }="" k++;="" }="" for(i="">32;i++)><32;i++) {="" t[i]="R[16][i];" t[i+32]="L[16][i];" }="" replacement(t,ip_1_table,m,64);="" 逆初始置换="" }="" void="" print()="" 输出函数="" {="" int="">32;i++)> int a[12],b[12],d[3][16]; int p[64],q[64]; for(i=0;i<32;i++) {="" p[i]="L[15][i];" p[32+i]="R[15][i];" q[i]="R[16][i];" q[i+32]="L[16][i];" }="" to10(k[14],a,48);="" to10(k[15],b,48);="" to10(c,d[0],64);="" to10(p,d[1],64);="" to10(q,d[2],64);="" printf("\n\t\t15轮密钥:");="" for(i="">32;i++)><12;i++) {="" printf("%x",a[i]);="" }="" printf("\t15轮结果:");="" for(i="">12;i++)><16;i++) {="" printf("%x",d[1][i]);="" }="" printf("\n\t\t16轮密钥:");="" for(i="">16;i++)><12;i++) {="" printf("%x",b[i]);="" }="" printf("\t16轮结果:");="" for(i="">12;i++)><16;i++) {="" printf("%x",d[2][i]);="" }="" printf("\n\t\t最后结果:");="" for(i="">16;i++)><16;i++) {="" printf("%x",d[0][i]);="" }="" }="" int="" main()="" {="" int="" num,i,t;="" char="" s1[8],s2[8];="" int="" m[64];="" m存放二进制明文/密文="" int="" d[64];="" 存放二进制密钥="" int="" s[8];="" show1();="" printf("\t\t请输入您要选择的操作:");="" while(1)="" {="" scanf("%d",&num);="" switch(num)="" {="" case="" 1:="" system("cls");="" 调用清屏函数="" show2();="" {="" scanf("%d",&num);="" if(num="=1)" {="" while(strlen(s1)!="8)" {="" printf("\t\t请输入明文(8):");="">16;i++)> } To2Bin(s1,m); //将明文转换成二进制流 while(strlen(s2)!=8) { printf("\t\t请输入密钥(8):"); scanf("%s",s2); } To2Bin(s2,d); //将密钥转换成二进制 SubKey(d); Encryption(m,c); print(); printf("\n\t\t按0将此密文解密,1返回上一层,2返回主界面, 其他键退出....."); scanf("%d",&t); if(t==0) { int s[8]; int a[64]; Decryption(c,a); To102(a,s,64); printf("\n\t\t解密结果:"); for(i=0;i<8;i++) {="" printf("%c",s[i]);="" }="" printf("\n\t\t按1加密,2解密,3退出");="" }="" else="" if(t="=1)" {="" system("cls");="" show2();="" }="" else="" if(t="=2)" {="" system("cls");="" show1();="" }="" else="" {="" exit(0);="" }="" }="" else="" if(num="=2)" {="" char="" str1[20],str2[20];="" printf("\t\t请输入明文文件名:");="" scanf("%s",str1);="" reader(str1,s1);="" to2bin(s1,m);="" printf("\t\t请输入密钥文件名:");="" scanf("%s",str2);="" reader(str2,s2);="" to2bin(s2,d);="" subkey(d);="" encryption(m,c);="" print();="" printf("\n\t\t按0将此密文解密,1将密文存入文件,2返回主界面,="" 其他键退出.....");="" scanf("%d",&t);="" if(t="=0)" {="" int="" a[64];="" decryption(c,a);="" to102(a,s,64);="">8;i++)> for(i=0;i<8;i++) {="" printf("%c",s[i]);="" }="" printf("\n\t\t按1加密,2解密,3退出");="" }="" else="" if(t="=1)" {="" int="" a[16];="" char="" str[30];="" file="" *fw;="" printf("\n\t\t请输入文件名:");="" scanf("%s",str);="" fw="fopen(str,"w");" if(fw="=NULL)" {="" printf("\n\t\t文件打开失败!\n");="" }="" else="" {="" to10(c,a,64);="" for(i="">8;i++)><16;i++) {="" fprintf(fw,"%x",a[i]);="" }="" }="" fclose(fw);="" printf("\n\t\t密文保存成功!="" 按1加密,2解密,3退出");="" }="" else="" if(t="=2)" {="" system("cls");="" show1();="" }="" else="" {="" exit(0);="" }="" }="" else="" if(num="=3)" {="" system("cls");="" exit(0);="" }="" else="" {="" printf("\n\t\t输入不正确,请重新输入:");="" }="" }="" break;="" case="" 2:="" {="" system("cls");="" printf("\n\n\t\t------------------des解密----------------");="" while(strlen(s1)!="8)" {="" printf("\n\n\n\t\t请输入密文(8):");="" scanf("%s",s1);="" }="" to2bin(s1,m);="" while(strlen(s2)!="8)" {="" printf("\t\t请输入密钥(8):");="" scanf("%s",s2);="" }="" to2bin(s2,d);="" subkey(d);="">16;i++)> print(); printf("\n\t\t按1返回上一层,2返回主界面, 其他键退出....."); scanf("%d",&t); if(t==1) { system("cls"); printf("\n\n\t\t---------------DES解密-------------"); while(strlen(s1)!=8) { printf("\n\n\t\t请输入密文(8):"); scanf("%s",s1); } To2Bin(s1,m); while(strlen(s2)!=8) { printf("\t\t请输入密钥(8):"); scanf("%s",s); } To2Bin(s2,d); SubKey(d); Decryption(m,c); print(); } else if(t==2) { system("cls"); show1(); } else { exit(0); } } break; case 3: system("cls"); exit(0); default: printf("输入不正确,请重新输入:"); } } return 0; }密码学