DES 加解密问题,请求帮助,还可以再加分

woodboy23 2009-04-09 10:47:10
我写了一个DES加密码解密码的测试工具,
不知道为什么,把别人加密码的东西解密出来,自己再加密,就与原来的密文不一样,而且试着解密也出错.
自己随便对一段内容加密码后再解密也会出错
不知道是什么原因,
希望大家帮忙看看




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace DES
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public static string a(string A_0, string A_1, bool A_2)
{
string str;
byte[] buffer;
byte[] inputBuffer = Convert.FromBase64String(A_0);
if (A_2)
{
buffer = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(A_1));
}
else
{
buffer = Encoding.UTF8.GetBytes(A_1);
}
TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
provider.Key = buffer;
provider.Mode = CipherMode.ECB;
provider.Padding = PaddingMode.PKCS7;
byte[] bytes = provider.CreateDecryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);//主要是这一句报错
str = Encoding.UTF8.GetString(bytes);
return str;
}

public static string b(string A_0, string A_1, bool A_2)
{
string str;
byte[] buffer;
byte[] bytes = Encoding.UTF8.GetBytes(A_0);
if (A_2)
{
buffer = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(A_1));
}
else
{
buffer = Encoding.UTF8.GetBytes(A_1);
}
TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
provider.Key = buffer;
provider.Mode = CipherMode.ECB;
provider.Padding = PaddingMode.PKCS7;
byte[] inArray = provider.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length);
str = Convert.ToBase64String(inArray, 0, inArray.Length);
return str;
}

private void button1_Click(object sender, EventArgs e)
{
string str3, str2, str1, str;
str = this.textBox1.Text;
str1 = Encoding.ASCII.GetString(Convert.FromBase64String(str));
string[] arr= str1.Split("&".ToCharArray());
str2 = arr[0];
str3 = arr[1];
this.textBox4.Text = str2;
str3 = a(str3, "gg", true);
str = a(str2, str3, true);
this.textBox2.Text = str3;
this.textBox3.Text = str;
}

private void button2_Click(object sender, EventArgs e)
{
string str, str1, str2, str3, str4;
str1 = this.textBox2.Text;
str2 = this.textBox3.Text;
str3 = b(str1, "gg", true);
str4 = b(str2, str3, true);
this.textBox2.Text = str3;
str4 = str4 + "&" + str3;
str = Convert.ToBase64String(Encoding.ASCII.GetBytes(str4));
this.textBox4.Text = str;
}

}
}

...全文
89 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
himoggy 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 homejiji 的回复:]
private void button2_Click(object sender, EventArgs e)
{
string str, str1, str2, str3, str4;
str1 = this.textBox2.Text;
str2 = this.textBox3.Text;
str3 = b(str1, "gg", true);
str4 = b(str2, str3, true);//按他的意思是这里反了,str3 先解密再去做密钥了,而在加密的时候是用的加密了得str3做密钥的。。。
改为

[/Quote]

膜拜 反应真快
himoggy 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 woodboy23 的回复:]
而且,我的顺序应该没有错的,是先用"gg"对随机数字进行加密码得到一个密钥
再用这个密钥对原文进行加密的
所以这个顺利应该没有错的
[/Quote]

这个顺序没错
貌似是解密顺序反了

先用密钥将加密后的原文解密
然后再用"gg“将密钥还原成随机数字吧?
homejiji 2009-04-09
  • 打赏
  • 举报
回复
private void button2_Click(object sender, EventArgs e)
{
string str, str1, str2, str3, str4;
str1 = this.textBox2.Text;
str2 = this.textBox3.Text;
str3 = b(str1, "gg", true);
str4 = b(str2, str3, true);
//按他的意思是这里反了,str3 先解密再去做密钥了,而在加密的时候是用的加密了得str3做密钥的。。。
改为
str4 = b(str2, str3, true);
str3 = b(str1, "gg", true);
//如果这还错误就是你的加密和解密程序的问题了。。代码太长又没注释偷懒没看
this.textBox2.Text = str3;
str4 = str4 + "&" + str3;
str = Convert.ToBase64String(Encoding.ASCII.GetBytes(str4));
this.textBox4.Text = str;
}
woodboy23 2009-04-09
  • 打赏
  • 举报
回复
而且,我的顺序应该没有错的,是先用"gg"对随机数字进行加密码得到一个密钥
再用这个密钥对原文进行加密的
所以这个顺利应该没有错的
woodboy23 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hilarymoggy 的回复:]
C# code str = a(str2, str3, true);
str3 = a(str3, "gg", true);


这句改了没?
= =我的意思是貌似你次序反了
那个标注//的是说……方便看结果……orz
我的表达能力真差……
[/Quote]

呵呵,是我的理解能力差吧
呵呵
himoggy 2009-04-09
  • 打赏
  • 举报
回复
            str = a(str2, str3, true);
str3 = a(str3, "gg", true);

这句改了没?
= =我的意思是貌似你次序反了
那个标注//的是说……方便看结果……orz
我的表达能力真差……
woodboy23 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hilarymoggy 的回复:]
C# code private void button1_Click(object sender, EventArgs e)
{
string str3, str2, str1, str;
str = this.textBox4.Text;//1
str1 = Encoding.ASCII.GetString(Convert.FromBase64String(str));
string[] arr = str1.Split("&".ToCharArray());
str2 = arr[0];
str3 = arr[1];
this.textBox2.Text = str3;/…
[/Quote]

这种方法好像不对哟
我是想先把一个数据字用"GG"进行加密
然后再把主要内容用加密后的数字进行加密
再把加密后的主要内容与数字加密内容用"&"连接起来,(以方便解密时用)
最后把连接好的密文再进行一个数据转换得到最后的密文
我原来的方法可以正常的加密,但是在进行解密就会报错,
我测试过数字密文部分的解密,没有问题
只是前面的主要内容部份,解密就有问题
woodboy23 2009-04-09
  • 打赏
  • 举报
回复
呵呵,周氏语法,
我看先
himoggy 2009-04-09
  • 打赏
  • 举报
回复
        private void button1_Click(object sender, EventArgs e)
{
string str3, str2, str1, str;
str = this.textBox4.Text;//1
str1 = Encoding.ASCII.GetString(Convert.FromBase64String(str));
string[] arr = str1.Split("&".ToCharArray());
str2 = arr[0];
str3 = arr[1];
this.textBox2.Text = str3;//2
str = a(str2, str3, true);
str3 = a(str3, "gg", true);
this.textBox1.Text = str3;
this.textBox3.Text = str;
}


看下,这样测试效果明显多了吧?
himoggy 2009-04-09
  • 打赏
  • 举报
回复
帮你UP下
貌似是你写反了哦
woodboy23 2009-04-09
  • 打赏
  • 举报
回复
自己顶一个先,
woodboy23 2009-04-09
  • 打赏
  • 举报
回复
谢谢,
我仔细检查了一下
真的是这样的原因,
呵呵,看来我还真没有做程序员的天份,
刚开始学,
以后还得认真点
呵呵,分都给你们了
homejiji 可能要稍少一点
不好意思哟

110,535

社区成员

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

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

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