问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用C实现3DES算法..

发布网友 发布时间:2022-04-18 23:52

我来回答

2个回答

热心网友 时间:2022-04-19 01:21

//功能:实现DES及3DES加解密的算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "des.h"

//函数声明
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag);
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag);

//主函数
int main(int argc, char** argv)
{
char src16[16+1],key16[16+1],key48[48+1],dest16[16+1];

if(argc != 3)
{
fprintf(stderr,"Usage: [%s -e|-d s|3]\n",argv[0]);
exit(1);
}

if(strcmp(argv[2],"-s") == 0)
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'e');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'d');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else
return -1;
}
else if(strcmp(argv[2],"-3") == 0)
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf(stderr,"Please input the string that you want to encrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'e');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr,"Please input the string that you want to decrypt(16 hex number):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr,"Please input the Key string(16 hex number):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'d');
fprintf(stderr,"Result: [%s]\n",dest16);
}
else
return -1;
}
else
return -1;

return 0;
}

//做DES加密或解密运算
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag)
{
int i,j;
unsigned char subKey[16][48+1],byte8[8+1],bits[64+1],strTmp[64+1];
unsigned char L0[32+1],R0[32+1],Lx[32+1],Rx[32+1];

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))
return -1;
if(strSrc == NULL || strKey == NULL)
return -2;

if(flag == 'e' || flag == 'E')
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);

Des_GenSubKey(bits,subKey);

BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);

for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32);
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}
else
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);

Des_GenSubKey(bits,subKey);

BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);

for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[15-i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32);
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}

return 0;
}

//做3DES加密或解密运算
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag)
{
unsigned char strBCDKey[32+1],strByteKey[16+1];
unsigned char strMidDest1[16+1],strMidDest2[16+1];
unsigned char strLKey[16+1],strMKey[16+1],strRKey[16+1];

if(!( flag == 'e' || flag == 'E' || flag == 'd' || flag == 'D'))
return -1;
if(strSrc == NULL || strKey == NULL)
return -2;

if(strlen(strKey) < 32)
return -3;

if(flag == 'e' || flag == 'E')
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey,strBCDKey+16,16);

Do_DES(strSrc,strLKey,strMidDest1,'e');
Do_DES(strMidDest1,strRKey,strMidDest2,'d');
Do_DES(strMidDest2,strLKey,strMidDest1,'e');

memcpy(strDest,strMidDest1,16);
}
else
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);

memset(strLKey,0,sizeof(strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey,strBCDKey+16,16);

Do_DES(strSrc,strLKey,strMidDest1,'d');
Do_DES(strMidDest1,strRKey,strMidDest2,'e');
Do_DES(strMidDest2,strLKey,strMidDest1,'d');

memcpy(strDest,strMidDest1,16);
}

return 0;
}

热心网友 时间:2022-04-19 02:39

3DES算法C语言实现,有注释! http://tech.cuit.e.cn/forum/thread-2448-1-1.html
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不吃惊!冇我符!初生之犊不畏虎。有靠山?勿乱估:未曾痛过不知苦!能解... 不识惊!冇我符!初生之犊不畏虎。 有靠山,勿乱估。未曾通过不知苦... ...不识惊!冇我符!初生之犊不畏虎。有靠山?勿乱估。末曾痛过不知苦... 不识惊!冇我符! 初生之犊不畏虎。 有靠山?勿乱估。 未曾痛过不知苦... ...有靠山?勿乱估。未曾痛过不知苦?猜生肖!答案加理由。 跪求各位大仙,算命准的帮帮我 各位大神,网友大哥。我今天抽了支签,第十四签,请各位帮忙解一下。谢谢... 跪求各位有懂的帮忙解一下这个签!!! 紫金所为什么这么牛气? 战争机器5中文配音怎么设置 苹果mini怎么下裁应用宝和清理用的软件 不知道什么时候被安装了应用宝!在软件卸载里面还找不到!要怎么彻底清除? 穿越火线点射屏幕太抖该怎么调啊? 我的电脑玩穿越火线为什么画面抖动是什么回事? 玩穿越火线一开枪屏幕就会抖动,这个要怎么解决 用altium designer做pcb时怎样确定圆心以及角度? dxp中,直接画pcb板时如何在板子上画些弧角 Altium Designer 9自定义走线角度无法调整,不知什么原因只能通过空格键调90度和45度, 用AD09画(2D线)线条 为什么不能走任意角度? pcb中只能画45度和90度,如何画30度的线 如何将altium designer画线设置为45度角 altium designer怎样画任意角度线, 按shift+空格也没用,只能在90度和45度之间切换,求高手帮忙啊!! 重新办移动sim卡需要本人吗 手机录的音怎么屏蔽音乐只要对话 智能人机交互系统是利用自然语言实现+(+)与(+)的自然交流。其中的一个重要设+_百度问一问 人机交互技术的发展历史 泸州老窖1573多少钱一瓶 人机交互的简介 国窖一五七三五十二度水晶瓶装多少钱一瓶 智能人机交互系统是什么? 为什么荣耀手机不能将图片置顶? 大家帮助下,华为荣耀20的手机上方什么都不显示了怎么办? 拼多多买电视尺寸不符符怎么办? 拼多多手机上图现在尺寸不对怎么回事 拼多多所选素材与当前场景要求大小不符- 问一问 卖家申请退款选大小尺寸与商品描述不符,又撤销好评了,对店铺有影响吗? 买家退款原因选的是&quot;大小尺寸与商品描述不符&quot;卖家拒绝后淘宝会怎么处理? 买家申请大小尺寸与商品描述不符,对店铺有没有影响 申请大小尺寸不符退款对卖家有影响吗 大小尺寸与商品描述不符算品质退款吗 拼多多商家发的货尺寸不符,申请退货退款到付,商家拒收了怎么办办? 中国中心城市排名七城市组成第二方阵指的是什么? iphone 充不进电 维修多少钱 哪位大侠有python版本的3DES(双倍长32位密钥)的加解密算法源码帮忙提供一 有没有什么类似闲鱼之类的软件,就是可以让别人用花呗分期购买我的商品的那种软件 AJ专柜可以用花呗付款吗? 做梦梦到绿色花纹蛇在地上,两天了做着同一个梦,第三天梦到别人往我身上扔蛇,这是几个意思啊? 做梦梦见我爸往我身上扔蛇,还咬流血了 梦见自己弟弟总是扔蛇在我身上 金融学专业硕士那个学校不考数学?