C c# 可以通信的DES加密算法

haixing511 2009-07-10 09:33:55

我想找个算法DES,c#加密后C解密 ,或者C加密后c#解密。
或者有用c#写的自己的DES算法,而不是调用NET的库函数的。

...全文
294 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zonerr 2009-09-17
  • 打赏
  • 举报
回复
学习学习
hzg_1998 2009-07-10
  • 打赏
  • 举报
回复
Mode 设置成ECB,一般就可以了
haixing511 2009-07-10
  • 打赏
  • 举报
回复
看来楼上的同志和我遇到过同样的痛苦
游北亮 2009-07-10
  • 打赏
  • 举报
回复
网上肯定找不到的,我那时也找了半天,后来实在没办法,才随便找了个js版本的,自己花一晚上硬改成C#的
所以你想要,只能自己去找一个版本自己改
或者掏钱……

[Quote=引用 7 楼 haixing511 的回复:]
有没有UNIX 下的C语言写的DES 和对应的c#的DES
[/Quote]
haixing511 2009-07-10
  • 打赏
  • 举报
回复
有没有UNIX 下的C语言写的DES 和对应的c#的DES
伊羽 2009-07-10
  • 打赏
  • 举报
回复
http://www.cnblogs.com/evlon/archive/2007/11/12/956889.html
haixing511 2009-07-10
  • 打赏
  • 举报
回复
现在的关键是用c#写的DES 用C的解不了。所以我的问题是这个。
游北亮 2009-07-10
  • 打赏
  • 举报
回复
我改过一个js,把js的改成C#
参考:
http://blog.csdn.net/youbl/archive/2009/06/24/4295225.aspx

你可以自己改成C的
猪猪猪爱的 2009-07-10
  • 打赏
  • 举报
回复
C不会了~~
haixing511 2009-07-10
  • 打赏
  • 举报
回复
能不能给我对应的C语言的代码呢?
猪猪猪爱的 2009-07-10
  • 打赏
  • 举报
回复

//默认密钥向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string Encode(string encryptString, string encryptKey)
{
encryptKey = encryptKey.PadRight(8, ' ');
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());

}


/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string Decode(string decryptString, string decryptKey)
{
try
{
decryptKey = decryptKey.PadRight(8, ' ');
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();

MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return "";
}

}
柳晛 2009-07-10
  • 打赏
  • 举报
回复
类似3DES可以么?我以前写过,也是矩阵加密。
/************************************************************************ 
*
*  文件名:《暗算加密 v0.01》
*
*  文件描述:加密软件
*
*  创建人: 柳 晛, 2007年3月7日
*
*  版本号:0.01
*
*  修改记录:尚未修改记录
*
************************************************************************/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

void main()

{
/* 数组KEY[0~2]存储用户输入的密钥,数组date存储明文数据 */
char KEY[4][512]={0}, temp, date[4004][256]={0};
/* 数组key存储矩阵密钥,数组h存储密钥长度,i、j、x、y、ki都是计数器,fi记录明文串的长度 */
int key[3][256]={0}, h[3], i, j, x, y, ki=0, fi=0;
/* 文件指针fp1指向明文文件,fp2、fp3指向临时文件,fp4指向密文文件 */
FILE *fp1, *fp2, *fp3, *fp4;

printf("/************************************************************************\n*\n*  文件名:《暗算加密 v0.01》\n*\n*  文件描述:加密软件\n*\n*  创建人: 柳 晛, 2007年3月7日\n*\n*  版本号:0.01\n*\n*  QQ:252620084\tE-mail:Hack95@Gmail.com\n*\n*  http://hi.baidu.com/hack95\n*\n************************************************************************/\n");

if((fp1=fopen("a.txt","r"))==NULL)
{
printf("Error:a.txt文件找不到或无法打开!\n\n请将明文文件重命名为a.txt并放在本软件同一目录中。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}

if((fp2=fopen("TEMP1.dat","w+"))==NULL)
{
printf("Error:临时存储文件TEMP1.dat无法建立!\n\n如果该文件无法正常建立,将不能执行加密运算。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}
if((fp3=fopen("TEMP2.dat","w+"))==NULL)
{
printf("Error:临时存储文件TEMP2.dat无法建立!\n\n如果该文件无法正常建立,将不能执行加密运算。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}
if((fp4=fopen("读论语有感.txt","w+"))==NULL)
{
printf("Error:读论语有感.txt文件无法建立!该文件存储加密之后的数据。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}

/* 以下3行代码测量明文字符串的长度 */
fseek(fp1,0,SEEK_END);
fi=ftell(fp1);
printf("明文文件a.txt共%d字节\n\n任何一把密钥的非重复字符数不得少于%d个\n",fi,fi/4000+2);

/* 以下4行代码将明文串传送到TEMP1.bat文件中 */
fseek(fp1,0,SEEK_SET);
fseek(fp2,0,SEEK_SET);
for(i=0;i<fi;i++)
fputc(fgetc(fp1),fp2);

fclose(fp1);/* 关闭fp1 */





/* ★ 75~124行代码用来处理用户输入的密钥 ★ */

while(ki<3)
{
printf("\n请输入第%d把密钥:",ki+1);
gets(KEY[ki]);
printf("请确认第%d把密钥:",ki+1);
gets(KEY[3]);

if(KEY[3][1]==0||KEY[3][0]==KEY[3][1]||strcmp(KEY[ki],KEY[3])!=0)
printf("\nError:密钥设置过于简单or密钥确认错误,请重新输入第%d把密钥!\n\n提示:每把密钥至少需要两位非重复字符。\n如:aa、aaa则不可,ab、abc或更复杂的密钥才认为是合法密钥。\n",ki+1);

else
{
h[ki]=strlen(KEY[ki]);

/* 以下10行代码过滤用户重复输入的密钥字符 */
for(i=0;i<h[ki];i++)
for(j=i+1;j<h[ki];)
if(KEY[ki][i]==KEY[ki][j])
{
h[ki]--;
for(x=j;x<=h[ki];x++)
KEY[ki][x]=KEY[ki][x+1];
}
else
j++;

/* 以下9行代码对用户输入的密钥进行由小到大排序 */
strcpy(KEY[3],KEY[ki]);/* 排序前备份过滤好的KEY */
for(i=0;i<h[ki];i++)
for(j=i+1;j<h[ki];j++)
if(KEY[ki][i]>KEY[ki][j])
{
temp=KEY[ki][i];
KEY[ki][i]=KEY[ki][j];
KEY[ki][j]=temp;
}

/* 以下4行代码判断出数字矩阵的密钥并存入key */
for(i=0;i<h[ki];i++)
for(j=0;j<h[ki];j++)
if(KEY[ki][i]==KEY[3][j])
key[ki][j]=i;

/* for(i=0;i<h[ki];i++)
printf("%d,",key[ki][i]);
printf("\n"); 这3行代码验证前方密钥处理过程是否正确*/

ki++;/* 一把密钥处理完毕,ki累加进入下一把密钥的处理过程 */
}
}





/* ★ 132~158行代码利用key 对数据进行变位加密 ★ */

for(ki=0;ki<3;ki++)/* 该循环控制循环体内部依次使用第1、第2、第3把密钥 */
{
for(x=0;x<h[ki];x++)/* 该循环使每把密钥对数据加密多次,次数等于密钥的长度 */
{
/*以下4行代码将明文串按照密钥规定的矩阵传送至数组date中*/
fseek(fp2,0,SEEK_SET);
for(i=0;!feof(fp2);i++)
for(j=0;j<h[ki];j++)/* 用当前key的长度h[ki]来限制横向填充到date数组中的串 */
date[i][j]=fgetc(fp2);

/* for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
printf("%c",date[i][j]);
printf("\n");
}这六行代码验证前方date数组是否填充正确*/

/* 以下6行代码实现向TEMP1.dat临时文件中存放加密过程中的数据 */
fseek(fp2,0,SEEK_SET);
for(i=0;i<h[ki];i++)
{
y=key[ki][i];/* 将当前key第i个密钥的值存入y */
for(j=0;date[j][y]>0;j++)/* 循环将date按照key规定的顺序纵向存储 */
fputc(date[j][y],fp2);
}
}
}




/* ★ 165~201行代码利用key 对数据进行按位异或加密 ★ */

/* 以下24行代码将密钥串连起来,与明文数据长度相同,准备逐一异或运算 */
fseek(fp3,0,SEEK_SET);
i=0; j=0;
for(x=0;x<fi;x++)
{
if(KEY[i][j]>0)
{
fputc(KEY[i][j],fp3);
j++;
}
else
{
i++; j=0;
if(KEY[i][j]>0)
{
fputc(KEY[i][j],fp3);
j++;
}
else
{
i=0;
fputc(KEY[i][j],fp3);
j++;
}
}
}

/* 以下8行代码用来进行异或运算并将最终结果存盘 */
fseek(fp2,0,SEEK_SET);
fseek(fp3,0,SEEK_SET);
fseek(fp4,0,SEEK_SET);
for(i=0;i<fi;i++)
{
temp=fgetc(fp2)^fgetc(fp3);
fputc(temp,fp4);
}
fclose(fp4);





/* ★ 208~218行代码将临时文件TEMP1.dat、TEMP2.dat销毁 ★ */
fseek(fp2,0,SEEK_SET);
fseek(fp3,0,SEEK_SET);
for(i=0;i<fi;i++)
{
fputc('*',fp2);
fputc('*',fp3);
}
fclose(fp2);
fclose(fp3);
unlink("TEMP1.dat");
unlink("TEMP2.dat");

}

/************************************************************************ 
*
*  文件名:《暗算解密 v0.01》
*
*  文件描述:解密软件
*
*  创建人: 柳 晛, 2007年3月7日
*
*  版本号:0.01
*
*  修改记录:尚未修改记录
*
************************************************************************/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

void main()

{
/* 数组KEY存储用户输入的密钥,数组date存储待解密数据 */
char KEY[4][512]={0}, temp, date[4004][256]={0};
/* 数组key存储矩阵密钥,数组h存储密钥长度,i、j、x、y、ki都是计数器,fi记录密文串长度 */
int key[3][256]={0}, h[3], i, j, x, y, ki=0, fi=0;
/* 文件指针fp1指向明文文件,fp2、fp3指向临时文件,fp4指向密文文件 */
FILE *fp1, *fp2, *fp3, *fp4;

printf("/************************************************************************\n*\n*  文件名:《暗算解密 v0.01》\n*\n*  文件描述:解密软件\n*\n*  创建人: 柳 晛, 2007年3月7日\n*\n*  版本号:0.01\n*\n*  QQ:252620084\tE-mail:Hack95@Gmail.com\n*\n*  http://hi.baidu.com/hack95\n*\n************************************************************************/\n");

if((fp4=fopen("读论语有感.txt","r"))==NULL)
{
printf("Error:“读论语有感.txt”文件无法打开!\n\n请将密文文件重命名为“读论语有感.txt”并放在本软件同一目录中。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}
if((fp3=fopen("TEMP2.dat","w+"))==NULL)
{
printf("Error:临时存储文件TEMP2.dat无法建立!\n\n如果该文件无法正常建立,将不能执行解密运算。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}
if((fp2=fopen("TEMP1.dat","w+"))==NULL)
{
printf("Error:临时存储文件TEMP1.dat无法建立!\n\n如果该文件无法正常建立,将不能执行解密运算。\n\n按Enter键退出该软件。");
getchar();
exit(0);
}
if((fp1=fopen("a.txt","w+"))==NULL)
{
printf("Error:明文文件a.txt无法建立\n\n明文数据无法存盘\n\n按Enter键退出该软件。");
getchar();
exit(0);
}

/* 以下3行代码测量待解密字符串的长度 */
fseek(fp4,0,SEEK_END);
fi=ftell(fp4);
printf("密文文件“读论语有感.txt”共%d字节\n\n",fi);

/* 以下4行代码将待解密串传送到TEMP2.bat文件中 */
fseek(fp4,0,SEEK_SET);
fseek(fp3,0,SEEK_SET);
for(i=0;i<fi;i++)
fputc(fgetc(fp4),fp3);

fclose(fp4);





/* ★ 74~116行代码用来处理用户输入的密钥 ★ */

while(ki<3)
{
printf("\n请输入第%d把密钥:",ki+1);
gets(KEY[ki]);

h[ki]=strlen(KEY[ki]);

/* 以下10行代码过滤用户重复输入的密钥字符 */
for(i=0;i<h[ki];i++)
for(j=i+1;j<h[ki];)
if(KEY[ki][i]==KEY[ki][j])
{
h[ki]--;
for(x=j;x<=h[ki];x++)
KEY[ki][x]=KEY[ki][x+1];
}
else
j++;

/* 以下9行代码对用户输入的密钥进行由小到大排序 */
strcpy(KEY[3],KEY[ki]);/* 排序前备份过滤好的KEY */
for(i=0;i<h[ki];i++)
for(j=i+1;j<h[ki];j++)
if(KEY[ki][i]>KEY[ki][j])
{
temp=KEY[ki][i];
KEY[ki][i]=KEY[ki][j];
KEY[ki][j]=temp;
}

/* 以下4行代码判断出数字矩阵的密钥并存入key */
for(i=0;i<h[ki];i++)
for(j=0;j<h[ki];j++)
if(KEY[ki][i]==KEY[3][j])
key[ki][j]=i;

/* for(i=0;i<h[ki];i++)
printf("%d,",key[ki][i]);
printf("\n"); 这3行代码验证前方密钥处理过程是否正确*/

ki++;/* 一把密钥处理完毕,ki累加进入下一把密钥的处理过程 */

}



/* ★ 122~157行代码利用key 对数据进行按位异或解密 ★ */

/* 以下24行代码将密钥串连起来,与待解密数据长度相同,准备逐一异或运算 */
fseek(fp1,0,SEEK_SET);
i=0; j=0;
for(x=0;x<fi;x++)
{
if(KEY[i][j]>0)
{
fputc(KEY[i][j],fp1);
j++;
}
else
{
i++; j=0;
if(KEY[i][j]>1)
{
fputc(KEY[i][j],fp1);
j++;
}
else
{
i=0;
fputc(KEY[i][j],fp1);
j++;
}
}
}

/* 以下8行代码用来进行异或运算并存储在TEMP1.dat */
fseek(fp3,0,SEEK_SET);
fseek(fp2,0,SEEK_SET);
fseek(fp1,0,SEEK_SET);
for(i=0;i<fi;i++)
{
temp=fgetc(fp1)^fgetc(fp3);
fputc(temp,fp2);
}





/* ★ 165~194行代码利用key 对数据进行变位解密 ★ */

for(ki=0;ki<3;ki++)/* 该循环控制循环体内部依次使用第1、第2、第3把密钥 */
{
for(x=0;x<h[ki];x++)/* 该循环使每把密钥对数据解密多次,次数等于密钥的长度 */
{
/* 以下11行代码实现将TEMP1.dat存放的密文按照key存读入date数组中 */
fseek(fp2,0,SEEK_SET);
for(i=0;i<h[ki];i++)
{
y=key[ki][i];/* 将当前key第i个密钥的值存入y,y控制调用date数组的第几列 */
for(j=0;j<(int)fi/h[ki];j++)/* 循环将date按照key规定的顺序纵向读取 */
{
date[j][y]=fgetc(fp2);
if(y<fi%h[ki])
date[++j][y]=fgetc(fp2);
}
}

/* 以下4行代码实现将排到date中的密文按照解密顺序写入TEMP1.dat文件 */
fseek(fp2,0,SEEK_SET);
for(i=0;date[i][j];i++)
for(j=0;j<h[ki];j++)
fputc(date[i][j],fp2);
}
}

/* 以下4行代码实现解密后文件的存盘操作 */
fseek(fp2,0,SEEK_SET);
fseek(fp1,0,SEEK_SET);
for(i=0;i<fi;i++)
fputc(fgetc(fp2),fp1);





/* ★ 201~211行代码将临时文件TEMP1.dat、TEMP2.dat销毁 ★ */
fseek(fp2,0,SEEK_SET);
fseek(fp3,0,SEEK_SET);
for(i=0;i<fi;i++)
{
fputc('*',fp2);
fputc('*',fp3);
}
fclose(fp2);
fclose(fp3);
unlink("TEMP1.dat");
unlink("TEMP2.dat");

}
haixing511 2009-07-10
  • 打赏
  • 举报
回复
结贴了。我研究的结果是:在c#中把key 和IV 设置成同一个, 并且设置成ECB模式,就可以了

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧