加密解密设计试验.docx
- 文档编号:9100663
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:25
- 大小:28.66KB
加密解密设计试验.docx
《加密解密设计试验.docx》由会员分享,可在线阅读,更多相关《加密解密设计试验.docx(25页珍藏版)》请在冰豆网上搜索。
加密解密设计试验
郑州轻工业学院本科
实验报告
设计题目:
加密解密设计
学生姓名:
王相逢
系别:
计算机与通信工程学院
专业:
网络运维
班级:
13-02
学号:
0240
指导教师:
吉星、程立辉
2016年04月18日
1目的
数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。
2题目
使用C#编程语言,进行数据的加密与解密。
系统基本功能描述如下:
1、实现DES算法加密与解密功能。
2、实现TripleDES算法加密与解密功能。
3、实现MD5算法加密功能。
4、实现RC2算法加密与解密功能。
5、实现TripleDES算法加密与解密功能。
6、实现RSA算法加密与解密功能。
3加密知识
●加密的基本概念
"加密",是一种限制对网络上传输数据的访问权的技术。
原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。
将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
加密的基本功能包括:
1.防止不速之客查看机密的数据文件;
2.防止机密数据被泄露或篡改;
3.防止特权用户(如系统管理员)查看私人数据文件;
4.使入侵者不能轻易地查找一个系统的文件。
数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。
数据加密可在网络OSI七层协议(OSI是OpenSystemInterconnect的缩写,意为开放式系统互联。
国际标准组织(国际标准化组织)制定了OSI模型。
这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:
①链路加密:
通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。
根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。
②节点加密:
是对链路加密的改进。
在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。
③端对端加密:
网络层以上的加密称为端对端加密。
是面向网络层主体。
对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。
●数据加密的应用
1、媒体加密:
DRM
2、文件加密:
文本加密、pdf、word
3、数据加密:
ASP.NET(C#)中的数据加密
4、硬件加密:
加密狗
●加密技术发展趋势
①私用密钥加密技术与公开密钥加密技术相结合:
鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。
②寻求新算法:
跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。
如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。
它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。
此种加密算法加密强度高、速度快、计算开销低。
③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。
它可以集成到微机的主极上。
●加密技术的分类
加密类型可以简单地分为四种:
1.根本不考虑解密问题,如:
MD5;
2.私用密钥加密技术:
对称式加密(SymmetricKeyEncryption):
对称式加密方式对加密和解密使用相同的密钥。
通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。
如:
RC4、RC2、DES和AES系列加密算法。
3.公开密钥加密技术:
非对称密钥加密(AsymmetricKeyEncryption):
非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。
公共密钥可以广泛的共享和透露。
当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。
如:
RSA
4.数字证书。
(Certificate):
数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。
4步骤
4.1主框架
根据功能描述可知,建立主界面窗体如下所示。
设置主窗体的IsMdiContainer为True;添加menuStrip控件,并设置其相应菜单属性。
4.2设计类
根据需求分析,定义Security类用于描述各种加密算法,具体方法是:
1、右击“解决方案资源管理器”的项目,新建文件夹“app_code”2、选择“项目”——》“添加类”,输入类的名称:
4.3各种具体加密算法
4.3.1对称加密之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字节的整数倍。
加密解密过程
上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。
1、生成key和IV
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);
4.3.2非对称加密之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;
C#代码实现需引用using;
///
///RSA加密
///
///
///
///
publicstaticstringRSAEncrypt(stringpublickey,stringcontent)
{
publickey=@"
RSACryptoServiceProviderrsa=newRSACryptoServiceProvider();
byte[]cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes=rsa.Encrypt(,false);
returnConvert.ToBase64String(cipherbytes);
}
///
///RSA解密
///
///
///
///
publicstaticstringRSADecrypt(stringprivatekey,stringcontent)
{
privatekey=@" /hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==
RSACryptoServiceProviderrsa=newRSACryptoServiceProvider();
byte[]cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes=rsa.Decrypt(Convert.FromBase64String(content),false);
return;
4.3.3ASP.NET(C#)常用加密类调用的讲解
1、C#常用加密解密类库代码如下:
///
///MD5加密静态方法
///
///
///
publicstaticstringMD5Encrypt(stringEncryptString)
{
if(string.IsNullOrEmpty(EncryptString)){throw(newException("密文不得为空"));}
MD5m_ClassMD5=newMD5CryptoServiceProvider();
stringm_strEncrypt="";
try
{
m_strEncrypt=BitConverter.ToString(m_ClassMD5.ComputeHash("-","");
}
catch(ArgumentExceptionex){throwex;}
catch(CryptographicExceptionex){throwex;}
catch(Exceptionex){throwex;}
finally{m_ClassMD5.Clear();}
returnm_strEncrypt;
}
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 加密 解密 设计 试验