3DES算法报告
- 格式:doc
- 大小:105.00 KB
- 文档页数:7
一、实训背景随着信息技术的快速发展,数据安全越来越受到人们的关注。
对称加密算法作为一种重要的加密技术,在保障数据安全方面发挥着重要作用。
本次实训旨在让学生了解对称加密算法的基本原理,掌握其实现方法,并能够运用对称加密算法对数据进行加密和解密。
二、实训目标1. 理解对称加密算法的基本原理和特点;2. 掌握常用的对称加密算法,如AES、DES、3DES等;3. 能够运用对称加密算法对数据进行加密和解密;4. 分析对称加密算法在实际应用中的优势和局限性。
三、实训内容1. 对称加密算法的基本原理对称加密算法是指使用相同的密钥进行加密和解密的加密方法。
其特点是加密和解密速度快,但密钥的分配和管理较为复杂。
对称加密算法的加密和解密过程如下:(1)加密过程:发送方使用密钥对明文进行加密,得到密文;(2)解密过程:接收方使用相同的密钥对密文进行解密,得到明文。
2. 常用对称加密算法(1)AES加密算法:AES是一种高级加密标准,提供128、192、256位密钥长度,具有较好的安全性。
(2)DES加密算法:DES是一种经典的加密算法,使用56位密钥长度,安全性相对较低。
(3)3DES加密算法:3DES是DES的扩展,使用三个密钥进行加密和解密,提高了安全性。
3. 对称加密算法的编程实现本次实训采用Python编程语言,使用pycryptodome库实现对称加密算法的加密和解密功能。
(1)安装pycryptodome库:在Python环境中安装pycryptodome库,可以使用pip命令:pip install pycryptodome。
(2)编写加密和解密代码:以下是一个使用AES加密算法对数据进行加密和解密的示例代码。
```pythonfrom Crypto.Cipher import AESfrom Crypto.Util.Padding import pad, unpad# 密钥和明文key = b'sixteen byte key'plaintext = b'This is a test message.'# 创建AES加密对象cipher = AES.new(key, AES.MODE_CBC)# 加密ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))# 解密decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)print("密文:", ciphertext)print("明文:", decrypted)```4. 对称加密算法的实际应用对称加密算法在实际应用中具有广泛的应用场景,如:(1)数据传输安全:在数据传输过程中,使用对称加密算法对数据进行加密,确保数据传输的安全性;(2)数据存储安全:在数据存储过程中,使用对称加密算法对数据进行加密,防止数据泄露;(3)安全认证:在安全认证过程中,使用对称加密算法对用户密码进行加密,提高认证的安全性。
C#的3DES加密解密算法C#类如下:using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO;namespace ConsoleApplication1{/// <summary>/// 加解密类/// </summary>public class EncryptHelper{//构造⼀个对称算法private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();#region 加密解密函数/// <summary>/// 字符串的加密/// </summary>/// <param name="Value">要加密的字符串</param>/// <param name="sKey">密钥,必须32位</param>/// <param name="sIV">向量,必须是12个字符</param>/// <returns>加密后的字符串</returns>public string EncryptString(string Value, string sKey,string sIV){try{ICryptoTransform ct;MemoryStream ms;CryptoStream cs;byte[] byt;mCSP.Key = Convert.FromBase64String(sKey);mCSP.IV = Convert.FromBase64String(sIV);//指定加密的运算模式mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;//获取或设置加密算法的填充模式mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);//创建加密对象byt = Encoding.UTF8.GetBytes(Value);ms = new MemoryStream();cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);cs.Write(byt, 0, byt.Length);cs.FlushFinalBlock();cs.Close();return Convert.ToBase64String(ms.ToArray());}catch (Exception ex){//MessageBox.Show(ex.Message, "出现异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);return ("Error in Encrypting " + ex.Message);}}/// <summary>/// 解密字符串/// </summary>/// <param name="Value">加密后的字符串</param>/// <param name="sKey">密钥,必须32位</param>/// <param name="sIV">向量,必须是12个字符</param>/// <returns>解密后的字符串</returns>public string DecryptString(string Value, string sKey, string sIV){try{ICryptoTransform ct;//加密转换运算MemoryStream ms;//内存流CryptoStream cs;//数据流连接到数据加密转换的流byte[] byt;//将3DES的密钥转换成bytemCSP.Key = Convert.FromBase64String(sKey);//将3DES的向量转换成bytemCSP.IV = Convert.FromBase64String(sIV);mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);//创建对称解密对象byt = Convert.FromBase64String(Value);ms = new MemoryStream();cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);cs.Write(byt, 0, byt.Length);cs.FlushFinalBlock();cs.Close();return Encoding.UTF8.GetString(ms.ToArray());}catch (Exception ex){//MessageBox.Show(ex.Message, "出现异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);return ("Error in Decrypting " + ex.Message);}}#endregion}}调⽤⽅法如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{class Program{static void Main(string[] args){EncryptHelper helper = new EncryptHelper();//加密string oldValue = "138********";//加密后结果//密钥,必须32位string sKey = "qJzGEh6hESZDVJeCnFPGuxzaiB7NLQM5";//向量,必须是12个字符string sIV = "andyliu1234=";//printstring newValue = helper.EncryptString(oldValue,sKey,sIV);Console.WriteLine("加密后:"+ newValue);//解密string desValue = helper.DecryptString(newValue,sKey,sIV);//Console.WriteLine("解密后:"+ desValue);Console.ReadLine();}}}。
3DES算法密钥长度说明3DES算法(Triple Data Encryption Algorithm)是一种对称加密算法,通过多次应用DES算法来提高密钥长度和安全性。
在3DES算法中,密钥的长度对于保护敏感信息的安全性至关重要。
本文将详细说明3DES算法密钥长度的重要性以及不同密钥长度的应用场景。
一、导言在当今信息技术高速发展的时代,保护敏感信息的安全性变得尤为重要。
加密算法作为一种常见的信息保护手段,广泛应用于各个领域。
而3DES算法作为一种经典的加密算法,其密钥长度对于算法的安全性至关重要。
二、3DES算法简介3DES算法是DES算法的升级版,它在DES算法的基础上引入了三个密钥,以提高密钥长度和抵抗攻击的能力。
在3DES算法中,数据加密和解密的过程分为三个步骤:加密-解密-加密,即EDE模式。
其中,加密和解密的操作都采用了标准的DES算法。
三、密钥长度的重要性在3DES算法中,密钥长度直接决定了算法的安全性。
密钥长度越长,破解的难度就越大,从而提高了敏感信息的保护级别。
因此,正确选择合适的密钥长度对于应用3DES算法来说至关重要。
四、不同密钥长度的应用场景1. 56位单倍长密钥56位单倍长密钥是3DES算法最基本的密钥长度,也是兼容DES算法的密钥长度。
在某些特定的应用场景中,如果只要求相对较低的安全性,并且对算法的兼容性有要求,可以选择使用56位单倍长密钥。
2. 112位双倍长密钥112位双倍长密钥是3DES算法中较为常见的密钥长度。
相对于56位密钥长度来说,112位双倍长密钥提供了更高的安全性。
在大多数普通应用场景中,112位双倍长密钥已经能够满足安全性的要求。
3. 168位三倍长密钥168位三倍长密钥是3DES算法的最高密钥长度,也是最安全的选择。
在对安全性要求较高的场景中,如金融、军事等领域,建议使用168位三倍长密钥来提高数据的保护级别。
五、总结密钥长度是决定3DES算法安全性的重要因素。
3DES加密算法3DES加密算法使⽤原因最近和某财务系统对接,上传相关数据需要使⽤3DES加密传输json格式数据。
给定加密算法“请求报⽂”字段需要使⽤3DES加密,加密⽅式为DES/CBC,输出BASE64编码格式,密钥由服务⽅通过其他⽅式分配。
key="XXXX";XXXX为32位(含⼤⼩写字母A-Z,a-z,数字0-9)mode = CipherMode.CBC; 加密模式CBCiv = "12345678" 偏移量实际代码import java.io.ByteArrayOutputStream;import java.io.Closeable;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESedeKeySpec;import javax.crypto.spec.IvParameterSpec;import rmix.base64.BASE64Decoder;import rmix.base64.BASE64Encoder;public class EncryptUtils {/*** 3DES加密** @param srcData,加密字符串* @return* @throws Exception*///key 由对⽅给定,不唯⼀public static final String PASSWORD_CRYPT_KEY = "SYzUP43duk0KWBc4X1KI4Sqs";//iv偏移量由对⽅给定,不唯⼀public static final String PASSWORD_IV = "12345678";public static String desEncrypt(String srcData)throws Exception {//强随机数⽣成器SecureRandom sr = new SecureRandom();//调⽤给定32位keyDESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());//获取keyfactory 3DES输⼊值为DESedeSecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");//由keyfactory⽣产出securekeySecretKey securekey = keyFactory.generateSecret(dks);//设置模式为CBC PKCS5Padding和PKCS7Padding 没发现区别且参数中只有PKCS5Padding可以调⽤Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");//偏移量对象IvParameterSpec iv = new IvParameterSpec(PASSWORD_IV.getBytes());//初始化加密⽅法cipher.init(Cipher.ENCRYPT_MODE, securekey, iv, sr);byte[] doFinal = cipher.doFinal(srcData.getBytes());//由加密⽅法返回的是byte[] 数组我这⾥输出⽅式为BASE64 需要格式化//hex格式化需要⽤以下代码 apache 下的格式化⽅法//return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));return new String(encode(doFinal));}public static void main(String[] args) {try {String aa = desEncrypt("{\"ywlx\":\"PJFS\",\"ywnm\":\"190390000011\"}");System.out.println(aa + "结束");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** byte数组转换为 Base64字符串*/public static String encode(byte[] data) {return new BASE64Encoder().encode(data);}/*** Base64字符串转换为 byte数组*/public static byte[] decode(String base64) {try {return new BASE64Decoder().decodeBuffer(base64);} catch (IOException e) {e.printStackTrace();}return new byte[0];}/*** 把⽂件内容编码为 Base64字符串, 只能编码⼩⽂件(例如⽂本、图⽚等) */public static String encodeFile(File file) throws Exception {InputStream in = null;ByteArrayOutputStream bytesOut = null;try {in = new FileInputStream(file);bytesOut = new ByteArrayOutputStream((int) file.length());byte[] buf = new byte[1024];int len = -1;while ((len = in.read(buf)) != -1) {bytesOut.write(buf, 0, len);}bytesOut.flush();return encode(bytesOut.toByteArray());} finally {close(in);close(bytesOut);}}private static void close(Closeable c) {if (c != null) {try {c.close();} catch (IOException e) {// nothing}}}}。
3DES加密算法原理3DES (Triple Data Encryption Standard) 是基于DES (Data Encryption Standard) 的加密算法,主要用于保护数据的机密性和安全性。
它使用了三次DES算法来增加加密的强度,在密钥长度上有所改进。
DES算法是一种分组式的对称加密算法,使用一个64位密钥和一个64位的明文分组,输出一个64位的密文分组。
然而,由于DES的密钥长度较短(56位实际用于加密),导致出现一些安全隐患。
为了提高安全性,人们引入了3DES算法。
3DES使用了三次DES加密算法,即加密-解密-加密(EDE)的过程。
首先,明文被加密,然后解密,最后再次加密。
主要目的是通过加密-解密-加密的过程来提高密钥长度,增强安全性。
通过对明文进行两次解密,可以保证算法在兼容旧版本的同时,提供更高的安全性。
下面是3DES加密算法的详细步骤:1.密钥选择:-3DES使用三个相同或不同的密钥:K1,K2和K3、通常情况下,这些密钥可以是56位或112位。
-如果三个密钥相同,则算法变为普通的DES算法。
-如果三个密钥不同,则算法更安全。
2.分组处理:-将明文进行分组,每个明文分组的长度为64位。
3.加密过程:-使用第一个密钥K1对第一个明文分组进行DES加密操作。
-使用第二个密钥K2对第一个加密结果进行DES解密操作。
-使用第三个密钥K3对第二次解密结果进行DES加密操作。
-得到最终的密文分组。
4.解密过程:-使用第三个密钥K3对密文分组进行DES解密操作。
-使用第二个密钥K2对第一次解密结果进行DES加密操作。
-使用第一个密钥K1对第二次加密结果进行DES解密操作。
-得到最终的明文分组。
总的来说,3DES算法的核心就是将明文进行三次的加密和解密操作。
每次操作都使用不同的密钥,使得算法在保持与DES算法兼容的同时,提供更高的安全性。
3DES算法有以下的优点:-3DES算法是一个成熟的加密算法,得到了广泛的应用和研究。
3DES 加密算法的设计与实现宋佳河海大学水文水资源学院,南京(210098)E-mail:********************摘要:数据加密标准DES(Data Encryption Standard)是美国国家标准局于1977 年公布的数据加密标准,二十多年来,它一直在数据加密方面扮演了十分重要的角色,可见其设计思想的缜密和精细。
虽然随着解密技术的发展,DES 的安全性受到了一定的威胁,但其改进的3DES 算法却在很大程度弥补了DES 算法的缺陷,因此在数据加密方面得到了很广泛的应用。
本课题对3DES 算法进行分析和研究,并在此基础上用C 语言实现该算法,最终设计一个能对数据分组和文件进行高效加密的加密软件,为用户提供一种保证数据安全的方法。
关键词:数据加密标准DES;3DES;C 语言;实现中图分类号:TP309.7 文献标识码:A1 引言数据加密标准DES(Date Encryption Standard),是上个世纪70 年代问世的基于64 位明文分组,密钥长度为48×16 的加密标准。
随着计算机网络技术的发展,越来越多的信息都借助于网络来进行传输。
然而,黑客的出现使得信息在网络传输过程中受到各种各样的威胁、干扰和破坏,这不但影响了信息的有效传递,而且也可能由于信息的破坏给用户或者国家造成重大的损失。
为了杜绝或降低这种损失,利用加密技术对数据信息进行加密是一种有效的手段和方法。
而基于数据加密标准的DES(Date Encryption Standard)的三重DES(即3DES)有着高强度加密安全性能,且3DES 设计标准不一而足,有采用2 组密钥三重加密(本文就采取了这种方法),有采用三组加密密钥三重加密的。
然而由于它是基于DES 的三重加密,速度上自然不容乐观,但对DES 以及三重DES 的深入分析和理解,有利于研究和设计更好的密码算法,从而在一定程度上促进密码学的研究和发展。
DES_3DES_AES_IDES_RSA密码算法⽐较
对称加密算法(也叫共享密钥)
类型定义:发送接收使⽤相
同的对称密钥
密钥
长度分组长度循环次
数
安全性
DES数据加密标准,速度较
快,适⽤于加密⼤量数
据的场合;566416依赖密钥受穷举搜
索法攻击
3DES是基于DES的对称算
法,对⼀块数据⽤三个
不同的密钥进⾏三次加
密,强度更⾼;112 1686448军事级,可抗差值
分析和相关分析
AES,对称算法,是下⼀代
的加密算法标准,速度
快,安全级别⾼,⽬前
AES 标准的⼀个实现是
Rijndael 算法128
192
256
6410
12
14
安全级别⾼,⾼级
加密标准
IDEA国际数据加密算法,使
⽤ 128 位密钥提供⾮常
强的安全性128648能抵抗差分密码分
析的攻击
MD5信息-摘要算法
Message-Digest 51285124MD5 算法主要是
为数字签名⽽设计
的
SHA安全散列算法
Secure Hash Algorithm 1605124可实现数字签名,
和MD5相似
⾮对称加密算法(也叫公开密钥)
类型定义:⼀对公开密钥和
私有密钥,
解释举例
RSA基于⼤素数分解(Ron
Rivest,Adi
Shamir,Len Adleman
三位天才的名字)例如:7*d=1mod8的模运算是:(7*d)/ 8....余1 d=7
ECC椭圆曲线密码编码学Elliptic Curves Cryptography。
3、3DES3.1 概述3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。
它相当于是对每个数据块应用三次DES加密算法。
由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
3.2 算法原理使用3条56位的密钥对数据进行三次加密。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准)。
其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:3DES加密过程为:C=Ek3(Dk2(Ek1(P)))3DES解密过程为:P=Dk1(EK2(Dk3(C)))3.3 Java中的3DES实现3DES的在Java的实现与DES类似,如下代码为3DES加密算法、CBC模式、NoPadding 填充方式的加密解密结果,参考代码如下所示:package amigo.endecrypt;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.Security;import java.security.spec.InvalidKeySpecException;import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESedeKeySpec;import javax.crypto.spec.IvParameterSpec;import org.bouncycastle.jce.provider.BouncyCastleProvider;public class ThreeDESUtil {// 算法名称public static final String KEY_ALGORITHM = "desede";// 算法名称/加密模式/填充方式public static final String CIPHER_ALGORITHM = "desede/CBC/NoPadding";/*** CBC加密* @param key 密钥* @param keyiv IV* @param data 明文* @return Base64编码的密文* @throws Exception*/public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exceptio n {Security.addProvider(new BouncyCastleProvider());Key deskey = keyGenerator(new String(key));Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec ips = new IvParameterSpec(keyiv);cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);byte[] bOut = cipher.doFinal(data);for (int k = 0; k < bOut.length; k++) {System.out.print(bOut[k] + " ");}System.out.println("");return bOut;}/**** 生成密钥key对象* @param KeyStr 密钥字符串* @return密钥对象* @throws InvalidKeyException* @throws NoSuchAlgorithmException* @throws InvalidKeySpecException* @throws Exception*/private static Key keyGenerator(String keyStr) throws Exception {byte input[] = HexString2Bytes(keyStr);DESedeKeySpec KeySpec = new DESedeKeySpec(input);SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);return ((Key) (KeyFactory.generateSecret(((java.security.spec.KeySpec) (KeySpec))))); }private static int parse(char c) {if (c >= 'a') return (c - 'a' + 10) & 0x0f;if (c >= 'A') return (c - 'A' + 10) & 0x0f;return (c - '0') & 0x0f;}// 从十六进制字符串到字节数组转换public static byte[] HexString2Bytes(String hexstr) {byte[] b = new byte[hexstr.length() / 2];int j = 0;for (int i = 0; i < b.length; i++) {char c0 = hexstr.charAt(j++);char c1 = hexstr.charAt(j++);b[i] = (byte) ((parse(c0) << 4) | parse(c1));}return b;}/*** CBC解密* @param key 密钥* @param keyiv IV* @param data Base64编码的密文* @return明文* @throws Exception*/public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exceptio n {Key deskey = keyGenerator(new String(key));Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec ips = new IvParameterSpec(keyiv);cipher.init(Cipher.DECRYPT_MODE, deskey, ips);byte[] bOut = cipher.doFinal(data);return bOut;}public static void main(String[] args) throws Exception {byte[] key = "6C4E60E55552386C759569836DC0F83869836DC0F838C0F7".getBytes();byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };byte[] data = "amigoxie".getBytes("UTF-8");System.out.println("data.length=" + data.length);System.out.println("CBC加密解密");byte[] str5 = des3EncodeCBC(key, keyiv, data);System.out.println(new sun.misc.BASE64Encoder().encode(str5));byte[] str6 = des3DecodeCBC(key, keyiv, str5);System.out.println(new String(str6, "UTF-8"));}}测试结果如下所示:data.length=8CBC加密解密-32 6 108 42 24 -112 -66 -344AZsKhiQvt4=amigoxie加密解密在线测试网站的3DES可选择CBC模式,无填充方式选项,采用NoPadding填充方式,加密结果如下所示:ThreeDESUtil的测试代码中打印出的加密后的byte数组为:“-32 6 108 42 24 -112 -66 -34”,正是在线测试网站返回的十六进制“e0 06 6c 2a 18 90 be de”在Java中的十进制表示(Java中byte范围为:-128~127,所以超过127的数会被转换成负数)。
3DES加解密算法报告一、3DES算法简介3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。
数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。
DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。
比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES 指定为过渡的加密标准),是DES的一个更安全的变形。
它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样,设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,3DES加密过程为:C=Ek3(Dk2(Ek1(P)))3DES解密过程为:P=Dk1((EK2(Dk3(C)))二、3DES程序运行界面加密时,指定要加密的文件路径、加密的密钥以及加密后的文件名。
加密后的文件,打开时,显示的是乱码。
解密时指定要解密的文件路径、解密密钥(确保与加密密钥相同)以及解密后文件的名字。
解密后,打开解密后的文件,显示正确的字符,解密成功。
三、3DES程序的函数和类1.void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type) DES加密函数2. bool DES::Execution_3DES(char *Out, char *In, long datalen, const char *Key, int keylen,bool Type) 3DES加密函数3. void CMy3DES_Encryption_DecryptionDlg::OnButton2() 对话框加密按钮函数,调用加密函数4. void CMy3DES_Encryption_DecryptionDlg::OnButton3() 对话框解密按钮函数,调用加密函数进行解密5.void CMy3DES_Encryption_DecryptionDlg::OnButton1() //获取源文件路径和文件名四、3DES程序的主要函数注释1、以下的两个函数为对明文进行加解密,使用两个密钥做三次加密,方式为加密-解密-加密。
函数中调用了DES类中的SDES函数进行标准DES加解密。
在进行加密时,生成加密密钥,把待加密的明文分割成64位的块,把第i-1层加密后的密文作为第i层加密的明文输入,根据用户指定的加密层数进行n层加密,最终生成的密文存放在data所指向的内存中.在进行解密时,生成解密密钥,把待解密文分割成64位的块,把第i-1层解密后的"明文"作为第i层解密的密文输入,根据用户指定的解密层数进行n层解密,最终生成的明文存放在data所指向的内存中.bool DES::Execution_3DES(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type){if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) ) //datalen的长度对齐操作,又判断其是否为0,这些条件加起来实际上就是判断所有参数是否有效。
return false;SetKey(Key, keylen);// 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8){SDES(Out, In, &SubKey[0], Type);SDES(Out, Out, &SubKey[1], !Type);SDES(Out, Out, &SubKey[0], Type);}return true;}void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type){static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];ByteToBit(M, In, 64);Transform(M, M, IP_Table, 64);if( Type == ENCRYPT ){for(int i=0; i<16; ++i){memcpy(tmp, Ri, 32);F_func(Ri, (*pSubKey)[i]);Xor(Ri, Li, 32);memcpy(Li, tmp, 32);}}else{for(int i=15; i>=0; --i){memcpy(tmp, Li, 32);F_func(Li, (*pSubKey)[i]);Xor(Li, Ri, 32);memcpy(Ri, tmp, 32);}}Transform(M, M, IPR_Table, 64);BitToByte(Out, M, 64);}2、本函数实现对由用户输入的文件的加密,函数中使用了判断机制,以判断是否用户指定了要加密的文件、加密的密钥以及加密后密文的文件名等。
在程序的OnInitDialog()中,通过定义一个成员变量m_Path2来保存程序的目录,并把加密后的密文保存到程序的Debug目录下。
在函数中利用了CFile类实现对要加密文件的读,对读出的数据加密后再写入到用户指定的密文文件中,密文文件的格式与要加密的文件是一样的,这不需要由用户指定。
void CMy3DES_Encryption_DecryptionDlg::OnButton2(){UpdateData(TRUE);if(m_SourcePath==""){MessageBox("请选择要加密的文件!","提示",MB_ICONW ARNING);return;}else if(m_Key==""){MessageBox("密钥不能为空!\n请输入!","提示",MB_ICONW ARNING);return;}else if(m_MWFileName==""){MessageBox("请输入加密后,保存文件的名称!","提示",MB_ICONWARNING);return;}m_Path=m_Path+m_MWFileName;m_Path+=".";m_Path=m_Path+m_FileExt;CFile fread(m_SourcePath,CFile::modeRead|CFile::typeBinary);long flength=fread.GetLength();long npacket=flength/8;long last=flength%8;CFile fwrite(m_Path,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);fread.SeekToBegin();fwrite.SeekToBegin();DES MyDES;char inbuff[8],oubuff[8],skey[8];memcpy(skey,(LPCTSTR)m_Key,8);for(long i=0;i<npacket;i++){fread.Read(inbuff,8);MyDES.Execution_3DES(oubuff,inbuff,sizeof(inbuff),skey,sizeof(skey),ENCRYPT);fwrite.Write(oubuff,8);}if(last>0){fread.Read(inbuff,last);MyDES.Execution_3DES(oubuff,inbuff,sizeof(inbuff),skey,sizeof(skey),ENCRYPT);fwrite.Write(oubuff,8);}MessageBox("加密成功!");UpdateData(FALSE);}3、本函数实现对由用户输入的文件的解密,与上一个加密函数基本上是一样的,同样的本函数也使用了判断机制,以判断是否用户指定了要解密的文件、解密的密钥以及解密后文件名字等。
在函数中利用了CFile类实现对要解密文件的读,对读出的数据解密后再写入到用户指定的解密后的文件中,解密后文件的格式与要解密的文件是一样的,这不需要由用户指定。
void CMy3DES_Encryption_DecryptionDlg::OnButton3(){UpdateData(TRUE);if(m_SourcePath==""){MessageBox("请选择要解密的文件!","提示",MB_ICONW ARNING); return;}else if(m_Key==""){MessageBox("密钥不能为空!\n请输入!","提示",MB_ICONW ARNING); return;}else if(m_JMFileName==""){MessageBox("请输入解密后,保存文件的名称!","提示",MB_ICONWARNING);return;}m_Path2=m_Path2+m_JMFileName;m_Path2=m_Path2+".";m_Path2=m_Path2+m_FileExt;CFile fread(m_SourcePath,CFile::modeRead|CFile::typeBinary);long flength=fread.GetLength();long npacket=flength/8;long last=flength%8;CFile fwrite(m_Path2,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);fread.SeekToBegin();fwrite.SeekToBegin();DES MyDES;char inbuff[8],oubuff[8],skey[8];memcpy(skey,(LPCTSTR)m_Key,8);for(long i=0;i<npacket;i++){fread.Read(inbuff,8);MyDES.Execution_3DES(oubuff,inbuff,sizeof(inbuff),skey,sizeof(skey),DECRYPT);fwrite.Write(oubuff,8);}if(last>0){AfxMessageBox("文件可能已损坏!");}MessageBox("解密成功!");UpdateData(FALSE);}4、本函数用来获取源文件路径和文件名,以及由用户指定的要加解密文件的文件名以及该文件的格式,此格式将用于加解密后的文件的格式,这样一来不在需要用户输入文件的格式。