热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

加密算法之DES

MatchTwoArray.cpp:定义控制台应用程序的入口点。#includestdafx.h#include<iostream>#include&l

// MatchTwoArray.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
#include
#include
#include
using namespace std;


enum {ENCRYPTION,DECRYPTION};
bool Using_DES(char *Out,char *In,long textlen,int keylen,const char *Key,bool Type = ENCRYPTION);


// 初始置换(initial permutation)IP列表
const static char IP_TABLE[64] = {
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
};

// 扩展置换(expansion operation)E列表
static const char 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
};

//密钥置换PC1列表
const static char 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
};


// 密钥置换中每轮移动的位数
const static char LOOP_TABLE[16] = {
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};


// 压缩置换PC2列表
const static char 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
};

// S-盒代替(substitution box)
const static char S_BOX[8][4][16] = {
// S盒1
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,
// S盒2
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,
// S盒3
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,
// S盒4
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,
// S盒5
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,
// S盒6
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,
// S盒7
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,
// S盒8
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
};
// P-盒置换(straight permutation )或称为直接置换
const static char P_TABLE[32] = {
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
};
// 末置换(final permutation)IP^-1列表
const static char IPF_TABLE[64] = {
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
};
//-----------------------------------------------------------------------------------
typedef bool (*SUBKEY_P)[16][48];
//-----------------------------------------------------------------------------------
static void DES(char Out[8], char In[8], const SUBKEY_P pskey, bool Type);//标准DES加/解密
static void SETKEY(const char* Key, int len);// 设置密钥
static void Set_SubKey(SUBKEY_P pskey, const char Key[8]);// 设置子密钥
static void F_FUNCTION(bool In[32], const bool Ki[48]);// f 函数完成扩展置换、S-盒代替和P盒置换
static void S_BOXF(bool Out[32], const bool In[48]);// S-盒代替函数
static void TRANSFORM(bool *Out, bool *In, const char *Table, int len);// 变换函数
static void XOR(bool *InA, const bool *InB, int len);//异或函数
static void CYCLELEFT(bool *In, int len, int loop);// 循环左移函数
static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组函数
static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组函数
//-----------------------------------------------------------------------------------
static bool SubKey[1][16][48];// 子密钥
static char T[256], deskey[16];
//-----------------------------------------------------------------------------------
//以下是各个函数的定义
//-----------------------------------------------------------------------------------
//加密/解密函数
//
bool Using_DES(char *Out, char *In, long textlen, int keylen,const char *Key, bool Type)
{
if( !( Out && In && Key && (textlen=(textlen+7)&0xfffffff8) ) )
return false;
SETKEY(Key, keylen);
for(long i=0,j=textlen>>3; i DES(Out, In, &SubKey[0], Type); // 1次DES
return true;
}
void ByteToBit(bool *Out, const char *In, int bits)
{
for(int i=0; i Out[i] = (In[i>>3]>>(i&7)) & 1;
}

// 字节组转换成位组函数
void BitToByte(char *Out, const bool *In, int bits)
{
memset(Out, 0, bits>>3);
for(int i=0; i Out[i>>3] |= In[i]<<(i&7);
}

// 循环左移函数
void CYCLELEFT(bool *In, int len, int loop)
{
memcpy(T, In, loop);
memcpy(In, In+loop, len-loop);
memcpy(In+len-loop, T, loop);
}

// 设置子密钥
void Set_SubKey(SUBKEY_P pskey, const char Key[8])
{
static bool K[64], *KL=&K[0], *KR=&K[28];
ByteToBit(K, Key, 64);
TRANSFORM(K, K, PC1_TABLE, 56);
for(int i=0; i<16; ++i)
{
CYCLELEFT(KL, 28, LOOP_TABLE[i]);
CYCLELEFT(KR, 28, LOOP_TABLE[i]);
TRANSFORM((*pskey)[i], K, PC2_TABLE, 48);
}
}

// 设置密钥
void SETKEY(const char* Key, int len)
{
memset(deskey, 0, 24);
memcpy(deskey, Key, len>24?24:len);
Set_SubKey(&SubKey[0], &deskey[0]);
}
void S_BOXF(bool Out[32], const bool In[48])
{
for(char i=0,j,k; i<8; ++i,In+=6,Out+=4)
{
j = (In[0]<<1) + In[5];
k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];
ByteToBit(Out, &S_BOX[i][j][k], 4);
}
}

// f 函数完成扩展置换、S-盒代替和P盒置换
void F_FUNCTION(bool In[32], const bool Ki[48])
{
static bool MR[48];
TRANSFORM(MR, In, E_TABLE, 48);
XOR(MR, Ki, 48);
S_BOXF(In, MR);
TRANSFORM(In, In, P_TABLE, 32);
}
// 变换函数
void TRANSFORM(bool *Out, bool *In, const char *Table, int len)
{
for(int i=0; i T[i] = In[ Table[i]-1 ];
memcpy(Out, T, len);
}
void XOR(bool *InA, const bool *InB, int len)
{
for(int i=0; i InA[i] ^= InB[i];
}

//标准DES加/解密
void DES(char Out[8], char In[8], const SUBKEY_P pskey, 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 == ENCRYPTION )
{
for(int i=0; i<16; ++i)
{
memcpy(tmp, Ri, 32);
F_FUNCTION(Ri, (*pskey)[i]);
XOR(Ri, Li, 32);
memcpy(Li, tmp, 32);
}
}
else
{
for(int i=15; i>=0; --i)
{
memcpy(tmp, Li, 32);
F_FUNCTION(Li, (*pskey)[i]);
XOR(Li, Ri, 32);
memcpy(Ri, tmp, 32);
}
}
TRANSFORM(M, M, IPF_TABLE, 64);
BitToByte(Out, M, 64);
}


void main()
{

char text[]="The Test of DES !\n"
"姓名:许同学学号:0123456789\n"
"华中科技大学\n"
"合肥电大站\n"
"Email: abc@.com\n"
"Tel:027-0000000";

char key[]="Tddfdf ",buf[255];
memset(buf, 0, sizeof(buf));
strcpy(buf, text);
puts("\n加密前文本:");
puts(buf);
printf("加密前文本长度:%d\n",sizeof(text));
puts("\n密钥:");
puts(key);
printf("密钥文本长度:%d\n",sizeof(key));
Using_DES(buf, buf, sizeof(text), sizeof(key), key, ENCRYPTION);
puts("\n加密后:");
puts(buf);
Using_DES(buf, buf, sizeof(text),sizeof(key), key, DECRYPTION);
puts("\n解密后文本:");
puts(buf);
getchar();
}

 

 

 

 

 
 
  
 
 
 
 
  

推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
MR付的世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有