数据加密解密实训报告.docx
《数据加密解密实训报告.docx》由会员分享,可在线阅读,更多相关《数据加密解密实训报告.docx(39页珍藏版)》请在冰豆网上搜索。
数据加密解密实训报告
郑州轻工业学院
生产实习报告
名称:
指导教师:
姓名:
学号:
班级:
提交日期:
1.目的
数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。
2.题目
使用C#编程语言,实现数据的加密与解密。
3.功能描述
系统基本功能描述如下:
1、实现DES算法加密与解密功能。
2、实现TripleDES算法加密与解密功能。
3、实现MD5算法加密功能。
4、实现RC2算法加密与解密功能。
5、实现TripleDES算法加密与解密功能。
6、实现RSA算法加密与解密功能。
4.需求分析
4.1用户需求
数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。
用户能够通过此项目操作几种类型的加密解密,并能得到正确的结果。
4.2功能需求
"加密",是一种限制对网络上传输数据的访问权的技术。
原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。
将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
加密的基本功能包括:
1.防止不速之客查看机密的数据文件;2.防止机密数据被泄露或篡改;3.防止特权用户(如系统管理员)查看私人数据文件;4.使入侵者不能轻易地查找一个系统的文件。
加密类型可以简单地分为四种:
1.根本不考虑解密问题,如:
MD5;
2.私用密钥加密技术:
对称式加密(SymmetricKeyEncryption):
对称式加密方式对加密和解密使用相同的密钥。
通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。
如:
RC4、RC2、DES和AES系列加密算法。
3.公开密钥加密技术:
非对称密钥加密(AsymmetricKeyEncryption):
非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。
公共密钥可以广泛的共享和透露。
当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。
如:
RSA
4.数字证书。
(Certificate):
数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。
本次要做的项目需要实现前三种加密类型,包括:
MD5、DES、TripleDES、RC2、AES、RSA,并为用户提供每个加密方法实现的选择界面和每种加密解密方法的具体操作界面。
在此项目中应该定义一个类,包含几种加密解密的算法,供其调用。
5.设计说明
根据功能描述可知,建立主界面窗体如下所示:
图1主窗体界面
设置主窗体的IsMdiContainer为True;添加menuStrip控件,并设置其相应菜单属性。
5.1设计加密类
根据需求分析,定义Security类用于描述各种加密算法,具体方法是:
1、右击“解决方案资源管理器”的项目,新建文件夹“app_code”
2、选择“项目”——》“添加类”,输入类的名称:
图2添加Security类
5.2各种加密算法
5.2.1MD5加密
对MD5算法简要的叙述可以为:
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5中四个32位被称作链接变量(ChainingVariable)的整数参数,他们分别为:
A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。
循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:
A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。
第一轮进行16次操作。
每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。
再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。
最后用该结果取代a、b、c或d中之一。
5.2.2对称加密之DES和TripleDES加密与解密
对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。
因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
单钥密码系统的安全性依赖于以下两个因素:
第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
DES(DataEncryptionStandard)和TripleDES是对称加密的两种实现。
DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
DES使用的密钥key为8字节,初始向量IV也是8字节。
TripleDES使用24字节的key,初始向量IV也是8字节。
两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。
如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。
所以加密后的密文长度一定为8字节的整数倍。
图3Des加密解密过程
上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。
1、生成key和IV
System.Security.Cryptography.TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。
TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:
KeySize(加密密钥长度,以位为单位)=192(24字节)
BlockSize(加密处理的数据块大小,以位为单位)=64(8字节)
FeedbackSize(加密数据块后返回的数据大小,以位为单位)=64(8字节)
TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。
默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。
生成key和IV的代码很简单:
TripleDESCryptoServiceProvidertDESalg=newTripleDESCryptoServiceProvider();
byte[]keyArray=tDESalg.Key;
byte[]IVArray=tDESalg.IV;
生成的key和IV在加密过程和解密过程都要使用。
2、字符串明文转成某一代码页对应的编码字节流
待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。
还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。
在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。
//待加密的字符串
stringplainTextString="Hereissomedatatoencrypt.这里是一些要加密的数据。
";
//使用utf-8编码(也可以使用其它的编码)
EncodingsEncoding=Encoding.GetEncoding("utf-8");
//把字符串明文转换成utf-8编码的字节流
byte[]plainTextArray=sEncoding.GetBytes(plainTextString);
3、加密操作
加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。
同时要给定加密使用的key和IV。
//把字符串明文转换成utf-8编码的字节流
byte[]plainTextArray=sEncoding.GetBytes(plainTextString);
publicstaticbyte[]EncryptString(byte[]plainTextArray,byte[]Key,byte[]IV)
{
//建立一个MemoryStream,这里面存放加密后的数据流
MemoryStreammStream=newMemoryStream();
//使用MemoryStream和key、IV新建一个CryptoStream对象
CryptoStreamcStream=newCryptoStream(mStream,
newTripleDESCryptoServiceProvider().CreateEncryptor(Key,IV),
CryptoStreamMode.Write);
//将加密后的字节流写入到MemoryStream
cStream.Write(plainTextArray,0,plainTextArray.Length);
//把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区
cStream.FlushFinalBlock();
//把解密后的数据流转成字节流
byte[]ret=mStream.ToArray();
//关闭两个streams.
cStream.Close();
mStream.Close();
returnret;
}
4、解密操作
解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。
//调用解密方法,返回已解密数据的byte[]
byte[]finalPlainTextArray=DecryptTextFromMemory(Data,keyArray,IVArray);
publicstaticbyte[]DecryptTextFromMemory(byte[]EncryptedDataArray,byte[]Key,byte[]IV)
{
//建立一个MemoryStream,这里面存放加密后的数据流
MemoryStreammsDecrypt=newMemoryStream(EncryptedDataArray);
//使用MemoryStream和key、IV新建一个CryptoStream对象
CryptoStreamcsDecrypt=newCryptoStream(msDecrypt,
newTripleDESCryptoServiceProvider().CreateDecryptor(Key,IV),
CryptoStreamMode.Read);
//根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]
byte[]DecryptDataArray=newbyte[EncryptedDataArray.Length];
//把解密后的数据读入到DecryptDataArray
csDecrypt.Read(DecryptDataArray,0,DecryptDataArray.Length);
msDecrypt.Close();
csDecrypt.Close();
returnDecryptDataArray;
}
有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。
所以加密后的密文长度一定是8的整数倍。
这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。
比如上例中要加密的明文是:
“Hereissomedatatoencrypt.这里是一些要加密的数据。
”
转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。
这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:
"Hereissomedatatoencrypt.这里是一些要加密的数据。
\0\0\0\0\0\0"
5、从编码字节流转成字符串明文
//使用前面定义的Encoding,utf-8的编码把byte[]转成字符串
plainTextString=sEncoding.GetString(finalPlainTextArray);
5.2.3RC2加密与解密
RC2是由著名密码学家RonRivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。
它的输入和输出都是64比特。
密钥的长度是从1字节到128字节可变,但目前的实现是8字节(1998年)。
此算法被设计为可容易地在16位的微处理器上实现。
在一个IBMAT机上,RC2加密算法的执行可比DES算法快两倍(假设进行密钥扩展)。
5.2.4AES加密与解密
对称密码体制的发展趋势将以分组密码为重点。
分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。
密钥扩展算法将b字节用户主密钥扩展成r个子密钥。
加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。
混乱和密钥扩散是分组密码算法设计的基本原则。
抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。
AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。
AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。
1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。
1999年3月完成了第二轮AES2的分析、测试。
2000年10月2日美国政府正式宣布选中比利时密码学家JoanDaemen和VincentRijmen提出的一种密码算法RIJNDAEL作为AES.
在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。
但是DES迟早要被AES代替。
流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。
AES加密数据块和密钥长度可以是128比特、192比特、256比特中的任意一个。
AES加密有很多轮的重复和变换。
大致步骤如下:
1、密钥扩展(KeyExpansion),2、初始轮(InitialRound),3、重复轮(Rounds),每一轮又包括:
SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(FinalRound),最终轮没有MixColumns。
5.2.5非对称加密之RSA加密和解密的讲解
RSA公钥加密算法是1977年由RonRivest、AdiShamirh和LenAdleman在(美国麻省理工学院)开发的。
RSA取名来自开发他们三者的名字。
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。
RSA算法基于一个十分简单的数论事实:
将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。
即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。
RSA的缺点主要有:
A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
B)分组长度太大,为保证安全性,n至少也要600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个
长度还在增加,不利于数据格式的标准化。
目前,SET(SecureElectronicTransaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。
C)RSA密钥长度随着保密级别提高,增加很快。
这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。
它易于理解和操作,也很流行。
算法的名字以发明者的名字命名:
RonRivest,AdiShamir和LeonardAdleman。
早在1973年,英国国家通信总局的数学家CliffordCocks就发现了类似的算法。
但是他的发现被列为绝密,直到1998年才公诸于世。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:
A=B^e1modn;B=A^e2modn;
e1和e2可以互换使用,即:
A=B^e2modn;B=A^e1modn;
图4RSA加密解密过程
C#代码实现需引用usingSystem.Security.Cryptography;
///
///RSA加密
///
///
///
///
publicstaticstringRSAEncrypt(stringpublickey,stringcontent)
{
publickey=@"5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=AQAB";
RSACryptoServiceProviderrsa=newRSACryptoServiceProvider();
byte[]cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes=rsa.Encrypt(Encoding.UTF8.GetBytes(content),false);
returnConvert.ToBase64String(cipherbytes);
}
///
///RSA解密
///
///
///
///
publicstaticstringRSADecrypt(stringprivatekey,stringcontent)
{
privatekey=@"5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=AQAB/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==
6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==
ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=";
RSACryptoServiceProviderrsa=newRSACryptoServiceProvider();
byte[]cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes=rsa.Decrypt(Convert.FromBase64String(content),false);
returnEncodin