密码学3DESC++实现

合集下载

IPSec加密算法:了解DES、3DES、AES等常用方法(九)

IPSec加密算法:了解DES、3DES、AES等常用方法(九)

IPSec加密算法:了解DES、3DES、AES等常用方法随着信息技术的发展,网络安全问题日益凸显,尤其是在数据传输过程中,加密算法的重要性不容忽视。

IPSec(Internet Protocol Security)作为一种网络层安全协议,为数据传输提供了保密性、完整性和身份验证等保障。

而在IPSec中,加密算法则是实现这些保护功能的核心。

一、对称加密算法之DES最早应用于IPSec协议的加密算法是DES(Data Encryption Standard,数据加密标准)。

DES采用对称加密的方式,即发送方和接收方使用相同的密钥进行加密和解密。

DES的密钥长度为56位,明文的块长度为64位。

然而,随着计算机技术的进步,DES的密钥长度过短,易受到暴力破解的攻击。

为了增强安全性,人们对DES进行了改进,产生了3DES算法。

二、对称加密算法之3DES3DES(Triple Data Encryption Algorithm,三重数据加密算法)是对DES的改进版本。

它通过对明文进行三次加密,使用不同的密钥,提高了加密强度。

3DES的密钥长度可以为112位或168位,相对于DES来说更加安全。

尽管3DES在安全性上有所提升,但由于其运算速度相对较慢,逐渐被更加高效的加密算法所取代。

其中,AES成为了现代互联网传输中广泛应用的加密算法。

三、对称加密算法之AESAES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,也是目前应用最为广泛的加密算法。

AES使用的密钥长度可以为128位、192位或256位,提供了更高的安全性。

与DES和3DES相比,AES在加密速度和安全性上都有较大的提升。

这得益于AES采用的分组加密方式,将明文分成多个固定长度的块,通过不同的加密运算来实现加密过程。

由于AES的运算速度快,安全性强,因此被广泛应用在数据传输、存储介质加密以及云计算等领域。

实验五 对称密码基本加密实验-DES、3DES

实验五 对称密码基本加密实验-DES、3DES

实验五 对称密码基本加密实验-DES 、3DES【 实验目的】理解对称密码体制和分组密码算法的基本思想理解 DES 、3DES 等算法的基本原理掌握上述密码算法的输入输出格式和密钥格式掌握上述密码算法的加解密过程和实现方法【实验原理】对称密码体制使用相同的加密密钥和解密密钥,其安全性主要依赖于密钥的保密性。

分组密码是对称密码体制的重要组成部分,其基本原理为:将明文消息编码后的序列m 0,m 1,m 2,…,m i 划分为长度为L(通常为64或128)位的组m=(m 0,m 1,m 2,…,m L-1),每组分别在密钥k=(k 0,k 1,k 2,…,k t-1)(密钥长度为t)的控制下变换成等长的一组密文输出序列c=(c 0,c 1,c 2,…,c L-1)。

分组密码的模型如下图所示: 加密算法m=(m 0,m 1,m 2,…,m L-1)明文分组密文分组c=( c 0,c 1,c 2,…,c L-1)012t-1012t-1m=(m 0,m 1,m 2,…,m L-1)明文分组加密算法分组密码实际上是在密钥的控制下,从一个足够大和足够好的置换子集中简单而迅速地选出一个置换,用来对当前输入的明文分组进行加密变换。

现在所使用的对称分组加密算法大多数都是基于Feistel 分组密码结构的,遵从的基本指导原则是Shannon 提出的扩散和混乱,扩散和混乱是分组密码的最本质操作。

分组密码与流密码的对比:分组密码以一定大小的分组作为每次处理的基本单元,而流密码则以一个元素(如一个字母或一个比特)作为基本的处理单元;流密码使用一个随时间变化的加密变换,具有转换速度快、低错误传播的优点,软硬件实现简单,缺点是低扩散、插入及修改不敏感;分组密码使用的是一个不对时间变化的固定变换,具有扩散性好、插入敏感等优点,缺点是加解密处理速度慢、存在错误传播。

一、 DES 算法数据加密标准(Data Encryption Standard,DES)中的算法是第一个也是最重要的现代对称加密算法,其分组长度为64比特,使用的密钥长度为56比特(实际上函数要求一个64位的密钥作为输入,但其中用到的有效长度只有56位,剩余8位可作为奇偶校验位或完全随意设置),DES 加解密过程类似,加解密使用同样的算法,唯一不同的是解密时子密钥的使用次序要反过来。

3des原理

3des原理

3des原理3DES(Triple Data Encryption Standard)是一种对称加密算法,它是DES算法的一个加强版本。

DES算法由IBM研发并于1977年正式发布,但随着计算机技术的发展,DES算法的密钥长度为56位已经不足以提供足够的安全性。

因此,为了增强DES算法的安全性,人们提出了3DES算法。

3DES算法的原理是通过将数据进行三次DES加密来实现加密过程。

具体而言,将明文分成64位的数据块,并使用一个128位(或192位)的密钥进行加密。

首先,将明文通过第一个密钥进行加密,得到中间结果;然后,将中间结果通过第二个密钥进行解密;最后,将解密后的结果再次通过第三个密钥进行加密,得到最终的密文。

解密过程与加密过程相反,即先使用第三个密钥进行解密,再使用第二个密钥进行加密,最后使用第一个密钥进行解密。

3DES算法的安全性主要来自于其密钥长度的增加。

由于3DES使用了三个不同的密钥,因此密钥空间变得非常大,即128位密钥长度的3DES算法有2^128种可能的密钥组合,这极大地增加了破解的难度。

而且,即使是已经破解了DES算法的攻击方法,也无法直接应用于3DES算法,因为3DES算法中的密钥长度更长。

然而,3DES算法也存在一些问题。

首先,由于3DES算法的加密过程需要进行三次DES运算,因此速度较慢,对于大量数据的加密处理可能会影响系统性能。

其次,由于3DES算法的密钥长度较长,密钥管理变得更加困难,容易出现密钥泄露或丢失的情况。

此外,随着计算机技术的发展,一些更加高效的加密算法如AES (Advanced Encryption Standard)已经取代了3DES算法成为更常用的加密算法。

3DES算法作为DES算法的加强版本,在一定程度上增强了数据的安全性。

通过使用三个不同的密钥进行加密和解密,3DES算法大大增加了破解的难度,提高了数据的保密性。

然而,由于其运算速度较慢和密钥管理的困难,人们逐渐转向使用更加高效和安全的加密算法。

3DES加密算法

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}}}}。

基于Base64与3DES结合的图像加密解密算法实现

基于Base64与3DES结合的图像加密解密算法实现

1概述互联网的高速发展与迅速普及,给人们生活带来了很多便利,比如丰富人们的交流方式、提供海量数据等。

享受着各种好处的同时,也面临着诸多挑战:过度依赖网络、网络犯罪率增大,以及信息的泄露、假冒。

因此,信息安全越来越受到人们的重视。

经过多年的发展,信息安全技术已从最初的加密技术发展到如今的隐藏技术。

但在实际应用过程中,简单的隐藏算法容易受到入侵者的攻击,提取有用信息的难度较低。

所以,为了使信息的传输更安全和隐蔽,在信息隐藏操作之前,需要将保密信息根据特定规则被加密,然后隐藏在传输载体中进行传输。

利用这种加密传输方法,即使入侵者在载波中提取信息,也难以区分加密之前内容,从而能有效保护有用信息。

互联网上的数据很容易被篡改。

任何人都可以通过网络轻松获取其他人的信息,特别是通过普通PC 机获取图像、音乐、动画等。

因此,保护网络数据,尤其是图像数据,成为了一项非常紧迫和关键的任务。

图像数据加密技术的难度高在于,相比文本数据,数据样本多、冗余度高、像素邻域内相关性强等特点被用于描述图像数据,因此图像在加密时效率低、可逆性弱,除此之外,入侵者还可以基于图像数据样本量进行分析。

图像数据的加密解密规则是,将图像数据以明文的身份被保存下来,设置密钥,通过加密算法实现加密,完成传输后,使用对应的解密算法对传输后的数据进行解密,得到结果,实现安全传输。

2理论基础2.1Base64在计算机中任何数据都是按A SCII 码存储的,而A SCII 码的128~255之间的值是不可见字符。

而在网络上交换数据时,从A 到B ,通常有多个路由设备。

由于不同设备处理字符的方式不同,这些不可见字符可能处理不当,不利于传输。

所以就先把数据通过Base64编码方式,变为常规可见的字符,大大降低了由于网络传输通过不同设备处理引起的误差。

Base64编码是基于64个字符A -Z,a-z ,0-9,+,/的编码方式,因为2的6次方正好为64,所以就用6bit 就可以表示出64个字符,eg:000000对应A ,000001对应B 。

IPSec加密算法:了解DES、3DES、AES等常用方法(三)

IPSec加密算法:了解DES、3DES、AES等常用方法(三)

IPSec加密算法:了解DES、3DES、AES等常用方法随着互联网的发展,数据的安全性成为了一项十分重要的议题。

在数据传输过程中,确保数据的机密性和完整性是至关重要的。

为了实现这一目的,各种加密算法被提出并广泛应用。

本文将介绍几种常用的加密算法,包括DES、3DES和AES,以帮助读者了解IPSec加密算法。

一、对称密钥加密算法对称密钥加密算法使用相同的密钥对数据进行加密和解密。

其中最经典的算法之一是DES(Data Encryption Standard)。

DES使用56位密钥对数据进行加密,每64位明文被切分为8个8位的块,通过16个不同的循环进行加密和解密。

尽管DES在过去数十年中广泛使用,但由于其密钥长度较短,易于暴力破解,因此现在已经不再推荐使用。

为了加强DES的安全性,3DES(Triple Data Encryption Standard)于1999年被提出。

3DES使用三个不同的密钥对数据进行加密,每个密钥长度为56位,因此总密钥长度为168位。

由于密钥长度的增加,3DES的安全性得到了提高,但同时也带来了计算开销的增加。

二、高级加密标准(AES)AES是目前应用最广泛的对称密钥加密算法之一。

它在2001年被美国政府确定为新的数据加密标准,可用于保护各种敏感数据。

AES支持不同长度的密钥,包括128位、192位和256位等。

更长的密钥长度意味着更高的安全性,但同时也会增加加密和解密的计算开销。

AES算法使用一系列的轮函数来进行密钥扩展和数据变换。

它将明文划分为块,并使用多个循环执行变换操作,包括字节代替、行位移、列混淆和轮密钥加等操作。

通过这些操作的迭代运算,AES能够提供较高的安全性和较快的加密速度。

除了对称密钥加密算法外,还存在非对称密钥加密算法,如RSA和椭圆曲线加密算法。

非对称密钥加密算法使用一对密钥,包括公钥和私钥,用于加密和解密数据。

这些算法通常用于密钥交换和数字签名等应用。

C#实现3Des加密解密

C#实现3Des加密解密

C#实现3Des加密解密3Des对每个数据块进⾏了三次的DES加密算法,是DES的⼀个更安全的变形。

⽐起最初的DES,3DES更为安全。

都是感觉⼀⽬了然的摘过来。

下⾯是加密解密的源码。

ECB模式的。

1public class _3DESEncrypt2 {34public static string Encrypt3DES(string a_strString, string a_strKey)5 {6 TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();7 DES.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a_strKey, "md5").Substring(0, 24));8 DES.Mode = CipherMode.ECB;9 ICryptoTransform DESEncrypt = DES.CreateEncryptor();10byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(a_strString);11return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));12 }1314public static string Decrypt3DES(string a_strString, string a_strKey)15 {16 TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();17 DES.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a_strKey, "md5").Substring(0, 24));18 DES.Mode = CipherMode.ECB;19 DES.Padding = System.Security.Cryptography.PaddingMode.PKCS7;20 ICryptoTransform DESDecrypt = DES.CreateDecryptor();21string result = "";22try23 {24byte[] Buffer = Convert.FromBase64String(a_strString);2526 result = ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));2728//MemoryStream msDecrypt = new MemoryStream(Buffer);29//CryptoStream csDecrypt = new CryptoStream(msDecrypt,30// DES.CreateDecryptor(DES.Key, DES.IV),31// CryptoStreamMode.Read);3233//// Create buffer to hold the decrypted data.34//byte[] fromEncrypt = new byte[Buffer.Length];3536//// Read the decrypted data out of the crypto stream37//// and place it into the temporary buffer.38//csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);39//result = System.Text.Encoding.Default.GetString(fromEncrypt);40 }41catch (Exception e)42 {43 }44return result;4546 }47 }⾥⾯加解密都是在DES的基础上实现、区别在于3Des的Key值是24位、DES⽽是8位。

des 3des加密原理

des 3des加密原理

des 3des加密原理D E S (D a t a E n c r y p t i o n S t a n d a r d)是一种对称加密算法,广泛应用于信息安全领域。

然而,由于D E S加密算法使用56位密钥,密钥空间相对较小,易受到暴力破解攻击。

为了提高安全性,人们开发了3D E S(T r i p l e D a t a E n c r y p t i o nS t a n d a r d)算法。

本文将详细介绍3D E S的原理与工作流程。

1.3D E S的概述3D E S算法是DE S算法的增强版,它使用3个56位密钥对数据进行加密。

因此,3D E S的密钥长度为168位,相对于D E S的56位密钥,安全性大幅提升。

3D E S采用了多次D E S算法的级联作用,分为两个步骤:加密和解密。

在加密阶段,明文会经过三次D E S算法,每次使用一个不同的密钥,最后生成密文。

在解密阶段,密文通过三次D E S算法逆向操作,使用相同的密钥,得到原始的明文。

2.3D E S加密过程(1)密钥生成在3D E S加密过程中,首先需要生成三个56位的密钥。

可以使用随机数生成器生成密钥,或者通过密钥管理系统分发密钥。

(2)初始置换(I n i t i a l P e r m u t a t i o n)在加密前,明文需要经过初始置换I P(I n i t i a l P e r m u t a t i o n)。

该置换步骤根据一个预定义的置换表,将明文重新排序。

这一步骤不仅加强了数据的混淆性,还增加了密码分析的难度。

(3)加密轮(E n c r y p t i o n R o u n d s)在3D E S加密过程中,明文会经过16个加密轮。

每个加密轮都使用一个不同的子密钥对数据进行处理。

具体过程如下:-通过子密钥生成算法,生成每个加密轮所需的子密钥。

子密钥的生成是3D E S算法的核心步骤,它通过密钥编排算法将三个56位的主密钥扩展为48位的子密钥。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JI A N G S U U N I V E R S I T Y 2017-2018学年第1学期密码学课程设计学院名称:计算机科学与通信工程学院班级学号:学生姓名:指导老师:一、实验要求:问题描述:编程实现3DES算法。

从DES原理出发,设计3DES加解密过程;通过编程调试以实现3DES 算法;利用由学生本人的学号姓名等信息组成若干密钥,以及明文样本进行加解密测试;最后作总结。

要求:(1)设计良好的交互界面,如要求用户输入密钥、明文字符串、得到相应的解密字符串等。

(2)程序设计,编写相应程序并调试。

(3)试用验证,记录每次操作过程和系统的结果。

(4)分析相应的问题。

(5)编写课程设计报告。

二、实验过程及分析:算法简介:3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。

它相当于是对每个数据块应用三次DES加密算法。

由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

算法介绍: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指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:3DES加密过程为:C=Ek3(Dk2(Ek1(M)))3DES解密过程为:M=Dk1(EK2(Dk3(C)))代码实现:我是先用C++将单重DES的算法编译出来,然后再进行三重DES算法,界面是利用MFC编写的一个简单的交互界面,实现对明文的加解密操作,主要的困难是在算法的编写上,在密文的输出形式上花费了许多时间,因为要实现三重加密,而每次明文的输入都必须是字符数组的类型,而第二三次的明文是利用前一次的密文,所以所输出的密文也必须是字符数组类型,有些转换的小问题费了一些功夫;在实现界面的时候CString类型对char类型的数组转换也出了一些问题,不过实验了几个不同的方式还是成功的解决了类型转换的问题,之后就是简单的调用加解密函数进行操作就好了。

实验结果:三、实验代码:头文件des.h:#include<iostream>#include<stdio.h>#include<string.h>#include <bitset>#include<fstream>using namespace std;int IP_Table[64] = { //IP置换矩阵58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,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 };int E_Table[48] = { //扩展矩阵32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 };int P_Table[32] = { // P 盒16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 };int IPR_Table[64] = { //逆IP置换矩阵40, 8, 48, 16, 56, 24, 64, 32, 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 };int PC1_Table[56] = { //密钥第一次置换矩阵57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 };int PC2_Table[48] = { // 密钥第二次置换矩阵14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 };int S_Box[8][4][16] = { //8个S盒三维数组// S114, 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,// S215, 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,// S310, 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,// S47, 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, // S52, 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, // S612, 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, // S74, 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, // S813, 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 };//把CHAR转换为INTstatic void CharToBit(const char input[], int output[], int bits) { int i, j;for (j = 0; j<8; j++) {for (i = 0; i<8; i++) {output[8 * j + 7 - i] = (input[j] >> i) & 1;}}};//把INT转换为CHARstatic void BitToChar(const int intput[], char output[], int bits) { int i, j;for (j = 0; j<8; j++) {for (i = 0; i<8; i++) {output[j] = output[j] * 2 + intput[i + 8 * j];}}};//异或操作static void Xor(int *INA, int *INB, int len) {int i;for (i = 0; i<len; i++) {*(INA + i) = *(INA + i) ^ *(INB + i);}};//初始IP置换,64->64,左右分别32static void IP(const int input[64], int output[64], int table[64]) { int i;for (i = 0; i<64; i++) {output[i] = input[table[i] - 1];//减1操作不可少!!}};//E扩展32->48static void E(const int input[32], int output[48], int table[48]) { int i;for (i = 0; i<48; i++) {output[i] = input[table[i] - 1];}};//P置换,static void P(const int input[32], int output[32], int table[32]) { int i;for (i = 0; i<32; i++) {output[i] = input[table[i] - 1];}};//逆IPstatic void IP_In(const int input[64], int output[64], int table[64]) { int i;for (i = 0; i<64; i++) {output[i] = input[table[i] - 1];}};//PC_1,用于密钥置换static void PC_1(const int input[64], int output[56], int table[56]) { int i;for (i = 0; i<56; i++) {output[i] = input[table[i] - 1];}};//PC_2static void PC_2(const int input[56], int output[48], int table[48]) { int i;for (i = 0; i<48; i++) {output[i] = input[table[i] - 1];}};//S盒压缩static void S(const int input[48], int output[32], int table[8][4][16]) {int i = 0;int j = 0;int INT[8];for (; i<48; i += 6) {INT[j] = table[j][(input[i] << 1) + (input[i + 5])][(input[i + 1] << 3) + (input[i + 2] << 2) + (input[i + 3] << 1) + (input[i + 4])];j++;}for (j = 0; j<8; j++) {for (i = 0; i<4; i++) {output[4 * j + 3 - i] = (INT[j] >> i) & 1;}}};//完成DES算法轮变换,就是f函数的内部实现,就是一个异或而已static void F_func(int input[32], int output[32], int subkey[48]) {int len = 48;int temp[48] = { 0 };int temp_1[32] = { 0 };E(input, temp, E_Table);//32->48Xor(temp, subkey, len);S(temp, temp_1, S_Box);//48->32P(temp_1, output, P_Table);//位数不变};//秘钥循环左移static void RotateL(const int input[28], int output[28], int leftCount) {int i;int len = 28;//因为不是位运算,所以可以不用unsignedfor (i = 0; i<len; i++) {output[i] = input[(i + leftCount) % len];}};//子密钥生成static void subKey_fun(const int input[64], int Subkey[16][48]) {//注意输入和输出的位数,int只存放01,密钥为18位16轮int loop = 1, loop_2 = 2;int i, j;int c[28], d[28];int pc_1[56] = { 0 };int pc_2[16][56] = { 0 };int rotatel_c[16][28] = { 0 };int rotatel_d[16][28] = { 0 };PC_1(input, pc_1, PC1_Table);for (i = 0; i<28; i++) {c[i] = pc_1[i];//Ld[i] = pc_1[i + 28];//R}int leftCount = 0;for (i = 1; i<17; i++) {if (i == 1 || i == 2 || i == 9 || i == 16) {//左移一位leftCount += loop;RotateL(c, rotatel_c[i - 1], leftCount);RotateL(d, rotatel_d[i - 1], leftCount);}else {//左移两位leftCount += loop_2;RotateL(c, rotatel_c[i - 1], leftCount);RotateL(d, rotatel_d[i - 1], leftCount);}}for (i = 0; i<16; i++) {for (j = 0; j<28; j++) {pc_2[i][j] = rotatel_c[i][j];pc_2[i][j + 28] = rotatel_d[i][j];}}for (i = 0; i<16; i++) {PC_2(pc_2[i], Subkey[i], PC2_Table);}};//加密实现static void DES_Efun(char input[8], char key_in[8], int output[64]) {int Ip[64] = { 0 };//存储初始置换后的矩阵int output_1[64] = { 0 };int subkeys[16][48];int chartobit[64] = { 0 };int key[64];int l[17][32], r[17][32];CharToBit(input, chartobit, 8);//转换为64个二进制数IP(chartobit, Ip, IP_Table);//IP初始置换!CharToBit(key_in, key, 8);subKey_fun(key, subkeys);for (int i = 0; i<32; i++) {l[0][i] = Ip[i];r[0][i] = Ip[32 + i];}for (int j = 1; j<16; j++) {//前15轮的操作for (int k = 0; k<32; k++) {l[j][k] = r[j - 1][k];}F_func(r[j - 1], r[j], subkeys[j - 1]);Xor(r[j], l[j - 1], 32);}int t = 0;for (t = 0; t<32; t++) {//最后一轮的操作,合并了将l,r swap r[16][t] = r[15][t];}F_func(r[15], l[16], subkeys[15]);Xor(l[16], l[15], 32);for (t = 0; t<32; t++) {output_1[t] = l[16][t];output_1[32 + t] = r[16][t];}IP_In(output_1, output, IPR_Table);};//解密实现static void DES_Dfun(int input[64], char key_in[8], char output[8]) { int Ip[64] = { 0 };//存储初始置换后的矩阵int output_1[64] = { 0 };int output_2[64] = { 0 };int subkeys[16][48];//int chartobit[64]={0};int key[64];int l[17][32], r[17][32];IP(input, Ip, IP_Table);//IP初始置换CharToBit(key_in, key, 8);subKey_fun(key, subkeys);for (int i = 0; i<32; i++) {l[0][i] = Ip[i];r[0][i] = Ip[32 + i];}for (int j = 1; j<16; j++) {//前15轮的操作for (int k = 0; k<32; k++) {l[j][k] = r[j - 1][k];}F_func(r[j - 1], r[j], subkeys[16 - j]);Xor(r[j], l[j - 1], 32);}int t = 0;for (t = 0; t<32; t++) {//最后一轮的操作r[16][t] = r[15][t];}F_func(r[15], l[16], subkeys[0]);Xor(l[16], l[15], 32);for (t = 0; t<32; t++) {output_1[t] = l[16][t];output_1[32 + t] = r[16][t];}IP_In(output_1, output_2, IPR_Table);BitToChar(output_2, output, 8);};void IntToChar(int input[64], char output[8]){int a = 0x0; //定义一个16进制的二进制数用来存放input的一组四位数for (int i = 0; i < 64; i++){a = a * 2;a = a + input[i];if (i % 8 == 7){if (a<0xa)output[i / 8] = (char)(a + 0x30); //四组十六位二进制数转化为字符类型if (a>0x9)output[i / 8] = (char)(a + 0x40 - 9);a = 0;}}}void change(int in[64], char temp[8]) //天星转换术{bitset<64> m;for (int i = 0; i < 64; i++){m[i] = in[i];}fstream file1;file1.open("d://temp.txt", ios::binary | ios::out);file1.write((char*)&m, sizeof(m));file1.close();file1.open("d://temp.txt", ios::binary | ios::in);file1.getline(temp, 64);file1.close();}int main() {//cout << (char)0x31 << endl;int output[64] = { 0 };char MIN[9] = { 0 };char MI[9] = { 0 };cout << "请输入明文\n";cin >> MIN;cout << "请输入秘钥\n";cin >> MI;DES_Efun(MIN, MI, output);cout << "密文如下\n";char miwen[64];change(output, miwen);cout << miwen << endl;cout << "解密功能\n";DES_Dfun(output, MI, MIN);cout << "明文如下:\n";for (int i = 0; i<8; i++) {cout << MIN[i];}cout << "\n";return 0;}MFC窗口文件tipDlg.cpp :#include "stdafx.h"#include "tip.h"#include "tipDlg.h"#include "afxdialogex.h"#include"des.h"#include <string>#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CtipDlg 对话框CtipDlg::CtipDlg(CWnd* pParent /*=NULL*/): CDialog(IDD_TIP_DIALOG, pParent), a(0), b(0), c(0), ming(_T("")), mi(_T("")), miwen1(_T("")), 解密明文(_T("")), jiemimw(_T("")), jmmw(_T("")), mi2(_T("")), mi3(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CtipDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT4, ming);DDX_Text(pDX, IDC_EDIT6, mi);DDX_Text(pDX, IDC_EDIT7, miwen1);DDX_Text(pDX, IDC_EDIT1, jmmw);DDX_Text(pDX, IDC_EDIT2, mi2);DDX_Text(pDX, IDC_EDIT3, mi3);}BEGIN_MESSAGE_MAP(CtipDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON2, &CtipDlg::OnBnClickedButton2) ON_EN_CHANGE(IDC_EDIT4, &CtipDlg::OnEnChangeEdit4)ON_EN_CHANGE(IDC_EDIT7, &CtipDlg::OnEnChangeEdit7)ON_BN_CLICKED(IDC_BUTTON1, &CtipDlg::OnBnClickedButton1) END_MESSAGE_MAP()// CtipDlg 消息处理程序BOOL CtipDlg::OnInitDialog(){CDialog::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。

相关文档
最新文档