3DES加密算法

lanziqian 2003-08-20 03:27:52
请告诉我c#中3DES加密算法的代码,源代码也可以。谢谢
...全文
107 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArLi2003 2003-08-29
  • 打赏
  • 举报
回复
http://www.zpcity.com/arli/commonprj/cls_DesEncrypt.cs
ArLi2003 2003-08-29
  • 打赏
  • 举报
回复
3des 可以参见 System.Security.Cryptography.TripleDES
lanziqian 2003-08-26
  • 打赏
  • 举报
回复
des的算法我写好了,但是3des怎么写啊,des我就是一个函数encrypt(data),怎么转换成3des,
lanziqian 2003-08-25
  • 打赏
  • 举报
回复
可不可以帮我改一下,我的基础比较差,就输入一个字符串,输出一个加密后的字符串了。拜托帮帮忙。
lanziqian 2003-08-22
  • 打赏
  • 举报
回复
那DES的算法代码怎么写呢,我在网上找了几个,但是运行老是报错,可不可以麻烦你告诉我一下
dwg_cn 2003-08-22
  • 打赏
  • 举报
回复
IV是初始化向量,MSDN里有解释,你就把它当做密钥好了.
dwg_cn 2003-08-22
  • 打赏
  • 举报
回复
把filestream换成memerystream就可以了,当然需要少许改动.
lanziqian 2003-08-22
  • 打赏
  • 举报
回复
我只要字符间加密而已。
lanziqian 2003-08-22
  • 打赏
  • 举报
回复
看啊,但这个是文件输入输出的,
而且我搞不清楚她的tdesIV有什么用。
dwg_cn 2003-08-22
  • 打赏
  • 举报
回复
老兄不看MSDN的吗?

private static void EncryptData(String inName, String outName, byte[] tdesKey, byte[] tdesIV)
{
//Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);

//Create variables to help with read and write.
byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
long rdlen = 0; //This is the total number of bytes written.
long totlen = fin.Length; //This is the total length of the input file.
int len; //This is the number of bytes to be written at a time.

TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, tdes.CreateEncryptor(tdesKey, tdesIV), CryptoStreamMode.Write);

Console.WriteLine("Encrypting...");

//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.WriteLine("{0} bytes processed", rdlen);
}

encStream.Close();
}
xixigongzhu 2003-08-22
  • 打赏
  • 举报
回复
简单的:
处理函数:
private void _HandleData(int[] data1, int keyindex, boolean isenc) {
IPERM(data1);
if (isenc) {
FL(data1, 0 + keyindex);
FR(data1, 2 + keyindex);
FL(data1, 4 + keyindex);
FR(data1, 6 + keyindex);
FL(data1, 8 + keyindex);
FR(data1, 10 + keyindex);
FL(data1, 12 + keyindex);
FR(data1, 14 + keyindex);
FL(data1, 16 + keyindex);
FR(data1, 18 + keyindex);
FL(data1, 20 + keyindex);
FR(data1, 22 + keyindex);
FL(data1, 24 + keyindex);
FR(data1, 26 + keyindex);
FL(data1, 28 + keyindex);
FR(data1, 30 + keyindex);
} else {
FL(data1, 30 + keyindex);
FR(data1, 28 + keyindex);
FL(data1, 26 + keyindex);
FR(data1, 24 + keyindex);
FL(data1, 22 + keyindex);
FR(data1, 20 + keyindex);
FL(data1, 18 + keyindex);
FR(data1, 16 + keyindex);
FL(data1, 14 + keyindex);
FR(data1, 12 + keyindex);
FL(data1, 10 + keyindex);
FR(data1, 8 + keyindex);
FL(data1, 6 + keyindex);
FR(data1, 4 + keyindex);
FL(data1, 2 + keyindex);
FR(data1, 0 + keyindex);
}
FPERM(data1);
int tt = data1[0];
data1[0] = data1[1];
data1[1] = tt;
}

private static void IPERM(int[] data) {
int work;
int left = data[0], right = data[1];
right = rotl(right, 4);
work = (left ^ right) & 0xf0f0f0f0;
left ^= work;
right = rotr(right ^ work, 20);
work = (left ^ right) & 0xffff0000;
left ^= work;
right = rotr(right ^ work, 18);
work = (left ^ right) & 0x33333333;
left ^= work;
right = rotr(right ^ work, 6);
work = (left ^ right) & 0x00ff00ff;
left ^= work;
right = rotl(right ^ work, 9);
work = (left ^ right) & 0xaaaaaaaa;
left = rotl(left^work, 1);
right ^= work;
data[0] = left;
data[1] = right;
}

private static void FPERM(int[] data) {
int work;
int left = data[0], right = data[1];
right = rotr(right, 1);
work = (left ^ right) & 0xaaaaaaaa;
right ^= work;
left = rotr(left ^ work, 9);
work = (left ^ right) & 0x00ff00ff;
right ^= work;
left = rotl(left ^ work, 6);
work = (left ^ right) & 0x33333333;
right ^= work;
left = rotl(left ^ work, 18);
work = (left ^ right) & 0xffff0000;
right ^= work;
left = rotl(left ^ work, 20);
work = (left ^ right) & 0xf0f0f0f0;
right ^= work;
left = rotr(left ^ work, 4);
data[0] = left;
data[1] = right;
}

private void FL(int[] data, int index) {
int l = data[0];
int r = data[1];
int work = rotr(r, 4) ^ this.Key[index];
l ^= Spbox[6][work & 0x3f]
^ Spbox[4][(work >> 8) & 0x3f]
^ Spbox[2][(work >> 16) & 0x3f]
^ Spbox[0][(work >> 24) & 0x3f];
work = r ^ this.Key[index + 1];
l ^= Spbox[7][work & 0x3f]
^ Spbox[5][(work >> 8) & 0x3f]
^ Spbox[3][(work >> 16) & 0x3f]
^ Spbox[1][(work >> 24) & 0x3f];
data[0] = l;
}

private void FR(int[] data, int index) {
int l = data[1];
int r = data[0];
int work = rotr(r, 4) ^ this.Key[index];
l ^= Spbox[6][work & 0x3f]
^ Spbox[4][(work >> 8) & 0x3f]
^ Spbox[2][(work >> 16) & 0x3f]
^ Spbox[0][(work >> 24) & 0x3f];
work = r ^ this.Key[index + 1];
l ^= Spbox[7][work & 0x3f]
^ Spbox[5][(work >> 8) & 0x3f]
^ Spbox[3][(work >> 16) & 0x3f]
^ Spbox[1][(work >> 24) & 0x3f];
data[1] = l;
}

private static int rotr(int x, int n) {
return (x >>> n) | (x << (32 - n));
}

private static int rotl(int x, int n) {
return (x << n) | (x >>> (32 - n));
}
lanziqian 2003-08-21
  • 打赏
  • 举报
回复
访问不了该网站,你可以粘贴上开给我看看嘛。谢谢
xixigongzhu 2003-08-21
  • 打赏
  • 举报
回复
用DES三次,具体的:
假设DES加密的方法是_HandleData(int[] data, int startindex, bool isencrypt);
isencrypt表明是加密还是解密,true为加密;data是要加密的数据;
那么加密过程是:
_HandleData(data1, 0, true);
_HandleData(data1, 32, false);
_HandleData(data1, 64, true);

解密过程是:
_HandleData(data1, 0, false);
_HandleData(data1, 32, true);
_HandleData(data1, 64, false);
注意,DES关键字长度是64位,3DES可能是128或者192位。如果是128位,将前64位追加到最后。
在计算时,关键字是经过处理的,64位最终的关键字是长度为32的整型数组。
rouser 2003-08-20
  • 打赏
  • 举报
回复
http://www.c-sharpcorner.com/Code/2002/Dec/CryptEncryption.asp
lanziqian 2003-08-20
  • 打赏
  • 举报
回复
怎么没人回答我啊,我在线等,急啊,各位高手请留言

110,533

社区成员

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

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

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