该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看

/*-------------------------------------------------------

Data Encryption Standard 56位密钥加密64位数据

2011.10

--------------------------------------------------------*/

#include

#include

#include "bool.h" // 位处理

#include "tables.h"

void BitsCopy(bool *DatOut,bool *DatIn,int Len); // 数组复制

void ByteToBit(bool *DatOut,char *DatIn,int Num); // 字节到位

void BitToByte(char *DatOut,bool *DatIn,int Num); // 位到字节

void BitToHex(char *DatOut,bool *DatIn,int Num); // 二进制到十六进制 64位 to 4*16字符

void HexToBit(bool *DatOut,char *DatIn,int Num); // 十六进制到二进制

void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num); // 位表置换函数

void LoopMove(bool *DatIn,int Len,int Num); // 循环左移 Len长度 Num移动位数

void Xor(bool *DatA,bool *DatB,int Num); // 异或函数

void S_Change(bool DatOut[32],bool DatIn[48]); // S盒变换

void F_Change(bool DatIn[32],bool DatKi[48]); // F函数

void SetKey(char KeyIn[8]); // 设置密钥

void PlayDes(char MesOut[16],char MesIn[8]); // 执行DES加密

void KickDes(char MesOut[8],char MesIn[16]); // 执行DES解密

int main()

{

int i=0;

char MesHex[16]={0}; // 16个字符数组用于存放 64位16进制的密文

char MyKey[8]={0}; // 初始密钥 8字节*8

char YourKey[8]={0}; // 输入的解密密钥 8字节*8

char MyMessage[8]={0}; // 初始明文

/*-----------------------------------------------*/

printf("Welcome! Please input your Message(64 bit):\n");

gets(MyMessage); // 明文

printf("Please input your Secret Key:\n");

gets(MyKey); // 密钥

while(MyKey[i]!='\0') // 计算密钥长度

{

i++;

}

while(i!=8) // 不是8 提示错误

{

printf("Please input a correct Secret Key!\n");

gets(MyKey);

i=0;

while(MyKey[i]!='\0') // 再次检测

{

i++;

}

}

SetKey(MyKey); // 设置密钥 得到子密钥Ki

PlayDes(MesHex,MyMessage); // 执行DES加密

printf("Your Message is Encrypted!:\n"); // 信息已加密

for(i=0;i<16;i++)

{

printf("%c ",MesHex[i]);

}

printf("\n");

printf("\n");

printf("Please input your Secret Key to Deciphering:\n"); // 请输入密钥以解密

gets(YourKey); // 得到密钥

SetKey(YourKey); // 设置密钥

KickDes(MyMessage,MesHex); // 解密输出到MyMessage

printf("Deciphering Over !!:\n"); // 解密结束

for(i=0;i<8;i++)

{

printf("%c ",MyMessage[i]);

}

printf("\n");

system("pause");

/*------------------------------------------------*/

}

/*-------------------------------

把DatIn开始的长度位Len位的二进制

复制到DatOut后

--------------------------------*/

void BitsCopy(bool *DatOut,bool *DatIn,int Len) // 数组复制 OK

{

int i=0;

for(i=0;i

{

DatOut[i]=DatIn[i];

}

}

/*-------------------------------

字节转换成位函数

每8次换一个字节 每次向右移一位

和1与取最后一位 共64位

--------------------------------*/

void ByteToBit(bool *DatOut,char *DatIn,int Num) // OK

{

int i=0;

for(i=0;i

{

DatOut[i]=(DatIn[i/8]>>(i%8))&0x01;

}

}

/*-------------------------------

位转换成字节函数

字节数组每8次移一位

位每次向左移 与上一次或

---------------------------------*/

void BitToByte(char *DatOut,bool *DatIn,int Num) // OK

{

int i=0;

for(i=0;i

{

DatOut[i]=0;

}

for(i=0;i

{

DatOut[i/8]|=DatIn[i]<

}

}

/*----------------------------------

二进制密文转换为十六进制

需要16个字符表示

-----------------------------------*/

void BitToHex(char *DatOut,bool *DatIn,int Num)

{

int i=0;

for(i=0;i

{

DatOut[i]=0;

}

for(i=0;i

{

DatOut[i] = DatIn[i*4]+(DatIn[i*4+1]<<1)

+(DatIn[i*4+2]<<2)+(DatIn[i*4+3]<<3);

if((DatOut[i]%16)>9)

{

DatOut[i]=DatOut[i]%16+'7'; // 余数大于9时处理 10-15 to A-F

} // 输出字符

else

{

DatOut[i]=DatOut[i]%16+'0'; // 输出字符

}

}

}

/*---------------------------------------------

十六进制字符转二进制

----------------------------------------------*/

void HexToBit(bool *DatOut,char *DatIn,int Num)

{

int i=0; // 字符型输入

for(i=0;i

{

if((DatIn[i/4])>'9') // 大于9

{

DatOut[i]=((DatIn[i/4]-'7')>>(i%4))&0x01;

}

else

{

DatOut[i]=((DatIn[i/4]-'0')>>(i%4))&0x01;

}

}

}

// 表置换函数 OK

void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num)

{

int i=0;

static bool Temp[256]={0};

for(i=0;i

{

Temp[i]=DatIn[Table[i]-1]; // 原来的数据按对应的表上的位置排列

}

BitsCopy(DatOut,Temp,Num); // 把缓存Temp的值输出

}

// 子密钥的移位

void LoopMove(bool *DatIn,int Len,int Num) // 循环左移 Len数据长度 Num移动位数

{

static bool Temp[256]={0}; // 缓存 OK

BitsCopy(Temp,DatIn,Num); // 将数据最左边的Num位(被移出去的)存入Temp

BitsCopy(DatIn,DatIn+Num,Len-Num); // 将数据左边开始的第Num移入原来的空间

BitsCopy(DatIn+Len-Num,Temp,Num); // 将缓存中移出去的数据加到最右边

}

// 按位异或

void Xor(bool *DatA,bool *DatB,int Num) // 异或函数

{

int i=0;

for(i=0;i

{

DatA[i]=DatA[i]^DatB[i]; // 异或

}

}

// 输入48位 输出32位 与Ri异或

void S_Change(bool DatOut[32],bool DatIn[48]) // S盒变换

{

int i,X,Y; // i为8个S盒

for(i=0,Y=0,X=0;i<8;i++,DatIn+=6,DatOut+=4) // 每执行一次,输入数据偏移6位

{ // 每执行一次,输出数据偏移4位

Y=(DatIn[0]<<1)+DatIn[5]; // af代表第几行

X=(DatIn[1]<<3)+(DatIn[2]<<2)+(DatIn[3]<<1)+DatIn[4]; // bcde代表第几列

ByteToBit(DatOut,&S_Box[i][Y][X],4); // 把找到的点数据换为二进制

}

}

// F函数

void F_Change(bool DatIn[32],bool DatKi[48]) // F函数

{

static bool MiR[48]={0}; // 输入32位通过E选位变为48位

TablePermute(MiR,DatIn,E_Table,48);

Xor(MiR,DatKi,48); // 和子密钥异或

S_Change(DatIn,MiR); // S盒变换

TablePermute(DatIn,DatIn,P_Table,32); // P置换后输出

}

void SetKey(char KeyIn[8]) // 设置密钥 获取子密钥Ki

{

int i=0;

static bool KeyBit[64]={0}; // 密钥二进制存储空间

static bool *KiL=&KeyBit[0],*KiR=&KeyBit[28]; // 前28,后28共56

ByteToBit(KeyBit,KeyIn,64); // 把密钥转为二进制存入KeyBit

TablePermute(KeyBit,KeyBit,PC1_Table,56); // PC1表置换 56次

for(i=0;i<16;i++)

{

LoopMove(KiL,28,Move_Table[i]); // 前28位左移

LoopMove(KiR,28,Move_Table[i]); // 后28位左移

TablePermute(SubKey[i],KeyBit,PC2_Table,48);

// 二维数组 SubKey[i]为每一行起始地址

// 每移一次位进行PC2置换得 Ki 48位

}

}

void PlayDes(char MesOut[16],char MesIn[8]) // 执行DES加密

{ // 字节输入 Bin运算 Hex输出

int i=0;

static bool MesBit[64]={0}; // 明文二进制存储空间 64位

static bool Temp[32]={0};

static bool *MiL=&MesBit[0],*MiR=&MesBit[32]; // 前32位 后32位

ByteToBit(MesBit,MesIn,64); // 把明文换成二进制存入MesBit

TablePermute(MesBit,MesBit,IP_Table,64); // IP置换

for(i=0;i<16;i++) // 迭代16次

{

BitsCopy(Temp,MiR,32); // 临时存储

F_Change(MiR,SubKey[i]); // F函数变换

Xor(MiR,MiL,32); // 得到Ri

BitsCopy(MiL,Temp,32); // 得到Li

}

TablePermute(MesBit,MesBit,IPR_Table,64);

BitToHex(MesOut,MesBit,64);

}

void KickDes(char MesOut[8],char MesIn[16]) // 执行DES解密

{// Hex输入 Bin运算 字节输出

int i=0;

static bool MesBit[64]={0}; // 密文二进制存储空间 64位

static bool Temp[32]={0};

static bool *MiL=&MesBit[0],*MiR=&MesBit[32]; // 前32位 后32位

HexToBit(MesBit,MesIn,64); // 把密文换成二进制存入MesBit

TablePermute(MesBit,MesBit,IP_Table,64); // IP置换

for(i=15;i>=0;i--)

{

BitsCopy(Temp,MiL,32);

F_Change(MiL,SubKey[i]);

Xor(MiL,MiR,32);

BitsCopy(MiR,Temp,32);

}

TablePermute(MesBit,MesBit,IPR_Table,64);

BitToByte(MesOut,MesBit,64);

}

java和c 进行des_c语言的des加密,怎么用java解密相关推荐

  1. C加密 java_c语言的des加密,怎么用java解密

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看 /*------------------------------------ ...

  2. c 密解密java文件_c语言的des加密,怎么用java解密

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看 /*------------------------------------ ...

  3. Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)

    问题场景: 业务需要对接接口, 采用DES加密方式加密, 于是google一下go的DES加密方式, go的DES的默认隐藏了ECB模式, 因为go认为ECB不安全, 所以不建议使用,就隐藏了, 然而 ...

  4. 学习Java需要先学C语言吗-不学c直接学java

    C语言是面向过程的,Java是面向对象的,思想不一样,一门语言的基础部分不过是一些关于数的类型,字符的类型的定义.但是就是这些简单的组合,组成复杂的系统. 学Java不一定要C基础,单从语言本身,你买 ...

  5. C语言实现DES加密的简单聊天室

    目录 目录 概述 前言 运行截图 一些问题 正文 服务器端 客户端 头文件 tables.h bool.h 参考资料 概述 前言   我是用linux系统中的vim进行编辑   用gcc进行编译    ...

  6. PHP、JAVA、C#、Object-C 通用的DES加密

    2019独角兽企业重金招聘Python工程师标准>>> PHP: class JoDES {private static $_instance = NULL;/*** @return ...

  7. 【Java工具类】(30)—DES加密工具类

    Java工具类(30)-DES加密工具类 package com.awifi.cloudnative.container.manage.provider.utils;import org.apache ...

  8. java c rsa解秘_Java的RSA加密,.net如何解密

    //这是Java加密的方法 string value="12345678123456781234567812345678"; string publickey="3081 ...

  9. C#与java可以共用的DES加密解密

    C#的DES加密与解密算法我就不写了,主要写一下怎么去解密C#用DES加密后串,大家都知道C#的DES加密密钥长度是8位的,而java是8的倍数位,所以用普通的java中的DES是不行的,要解C#的加 ...

最新文章

  1. copper实现图片的裁剪和上传(1)
  2. 第04章—整合Mybatis
  3. 禅道开源版用户手册_Docker搭建开源版禅道以及项目基本流程介绍
  4. 光驱怎么挂载第二个光驱_重装系统下侦测不到光驱怎么解决?
  5. weblogic部署方式
  6. testng入门教程10 TestNG参数化测试
  7. python 模块定义_在python中定义私有模块函数
  8. MacOS如何控制应用对麦克风和日历日程的访问
  9. 中文字体font-family常用列表
  10. 为软件生成授权的唯一代码 CPUID+主板ID+内存ID
  11. python中string模块各属性以及函数的用法
  12. 阿里云国际版服务器如何搭建区块链应用程序
  13. wParam与 lParam
  14. 记录一下,转换树结构数据
  15. 信息系统监理师考试(三)
  16. 电力-故障分析理论及对称分量法
  17. IBM Storwize v3500存储故障维修支持
  18. 二维随机向量的数学期望E与协方差σ
  19. 【全源码及文档】基于Java面向对象开发的房屋中介管理系统
  20. 关于 Q3DScatter嵌套进设置了Qt::FramelessWindowHint(触摸自定义标题栏)时进行演示时出现渲染黑色区域 的解决方法

热门文章

  1. for foreach循环
  2. iOS开发之iOS程序偏好设置(Settings Bundle)的使用
  3. JDBC第一篇之获得数据库连接
  4. python paramiko模块中设置执行命令超时值
  5. Symbian 编程总结导读
  6. vector机器人 HOW TO MEET VECTOR 如何满足向量
  7. python socket select 错误 Filedescriptor out of range in select 解决方法
  8. golang 获取 命令行参数
  9. 多目录cmake工程 CmakeLists.txt编写
  10. linux 内核编译错误 .size expression for copy_user_generic_c does not evaluate to a constant