• 大小: 17KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-15
  • 语言: C/C++
  • 标签: S盒  C语言  密码算法  

资源简介

S盒的C语言加解密实现,环境VC++6.0,内含注释解析

资源截图

代码片段和文件信息

#include “stdafx.h“
#include “stdlib.h“
#include “string.h“
#include “memory.h“

void show1() //主界面
{
printf(“%d“ ‘1‘);
printf(“\n\n\n\t\t*************** DES加密解密系统 ******************\n\n“);
printf(“\t\t--------------------------------------------------\n“);
//printf(“\t\t--------------------------------------------------\n“);
printf(“\t\t**************************************************\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t\t1.加密\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t\t2.解密\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t\t3.退出\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t--------------------------------------------------\n“);
}

void show2() //加密界面
{
printf(“\n\n\n\t\t****************** DES加密 **********************\n\n“);
printf(“\t\t--------------------------------------------------\n“);
printf(“\t\t**************************************************\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t请选择明文和密钥的输入方式:\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t1.直接输入\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t2.从文件读取\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t**\t\t3.退出\t\t\t\t**\n“);
printf(“\t\t**\t\t\t\t\t\t**\n“);
printf(“\t\t--------------------------------------------------\n“);
printf(“\t\t\t选择:“);
}

void reader(char str[30] char s[8])  //读取明文和密钥
{
FILE *fp;
fp = fopen(str “r“);
if (fp == NULL)
{
printf(“明文读取失败!\n“);
}
else
{
fscanf(fp “%s“ s);
}
fclose(fp);
}

void To2Bin(char p[8] int b[64])    //将字节转换成二进制流
{
int i k = 0;

for (i = 0; i<8; i++)
{
int j = 0x80;   //完全正确,因为在数组中就是从高到低存放的
for (; j; j >>= 1)
{
if (j&p[i])
{
b[k++] = 1;
}
else
{
b[k++] = 0;
}
}
}
}



int IP_Table[64] =            //初始置换(IP)

{
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
56 48 40 32 24 16 8 0
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
};


int E_Table[] = {      //扩展变换E(个人认为此E,IP,IP逆表优于ppt上的,从0开始便于取遍数组所有元素)
31 0 1 2 3 4
3 4 5 6 7 8
7 8 9 10 11 12
11 12 13 14 15 16
15 16 17 18 19 20
19 20 21 22 23 24
23 24 25 26 27 28
27 28 29 30 31 0
};
//S盒需要根据需要确定————————————————————————————————————————————                                   
int S_Box[8][4][16] = { //8个s盒
{
{ 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 }
}

{
{ 15 1 8 14 6 11 3 4 9 7 2 13 12 0

评论

共有 条评论