如何将下面TripleDESCryptoServiceProvider解密的函数改为加密函数哇,我的不正确

ktcserver 2009-06-29 03:28:59

private string DeCode(string sKey)
{
ICryptoTransform transform;
MemoryStream stream;
byte[] buffer;
string s = string.Intern("123123abc");
string str2 = string.Intern("abcdefg");

SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
algorithm.Key = Convert.FromBase64String(s);
algorithm.IV = Convert.FromBase64String(str2);
algorithm.Mode = CipherMode.ECB;
algorithm.Padding = PaddingMode.PKCS7;
transform = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV);
buffer = Convert.FromBase64String(sKey);
stream = new MemoryStream(buffer);
CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read);
StreamReader reader = new StreamReader(stream2);
return reader.ReadToEnd();

}

上面的解密函数执行后得到的字符串,怎么加密回去就不对了?下面是我的加密函数

public string EncryptWithKey(string pass)
{
ICryptoTransform transform;
string s = string.Intern("123123abc");
string str2 = string.Intern("abcdefg");

SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
algorithm.Key = Convert.FromBase64String(s);
algorithm.IV = Convert.FromBase64String(str2);
algorithm.Mode = CipherMode.ECB;
algorithm.Padding = PaddingMode.PKCS7;
transform = algorithm.CreateEncryptor();

try
{
byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(pass);

MemoryStream ms = new MemoryStream();
TripleDESCryptoServiceProvider tdesc = new TripleDESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms,transform, CryptoStreamMode.Write);
cs.Write(bt, 0, bt.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}
...全文
258 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ktcserver 2009-07-10
  • 打赏
  • 举报
回复
根据大家的提示,自己弄了下加密函数可以进行加密,不会提示出错了,可是加密的字符串和解密的字符串还是不一致。

public string EncryptWithKey2(string pass)
{
DESCryptoServiceProvider provider;
ICryptoTransform transform;
string s = string.Intern(GetCode("gfleddcffejfdgagmfhgheogjffhjfmhjfdiddkimfbjpbij", 0x4fca4b03));
string str2 = string.Intern(GetCode("mjckekjkmgalhghlfiolagfmakmmljdnoiknffbofhiogfpo", 0x3e9a23a));

provider = new DESCryptoServiceProvider();
provider.Key = Convert.FromBase64String(s);
provider.IV = Convert.FromBase64String(str2);



transform = provider.CreateEncryptor();
//byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(pass);

MemoryStream ms = new MemoryStream();

CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);

StreamWriter sw = new StreamWriter(cs);
sw.WriteLine(pass);
sw.Close();
return Convert.ToBase64String(ms.ToArray());

}



解密前的字符串:
vpPMq8dppVdCGqBnY0LxZjva/zW3KkMunkwU/55QhI80/T1qGCwR3bgKZ2OS7SDMLTUAon4qCCOeTBT/nlCEj75Oym6NrPDTebycySvKuHAPygKcgKUOGnm8nMkryrhwRPKD13OtpWF2LxAeaCxaeZueKhISGdn0z9Tilmu3EcQTxqQE7ZjC2X6oZdngHQuuMoF7T8Ro4ejN0UKRv8CjeQ==

解密出结果后,再次用加密函数进行加密
得到的字符串
vpPMq8dppVdCGqBnY0LxZjva/zW3KkMunkwU/55QhI80/T1qGCwR3bgKZ2OS7SDMLTUAon4qCCOeTBT/nlCEj75Oym6NrPDTebycySvKuHAPygKcgKUOGnm8nMkryrhwRPKD13OtpWF2LxAeaCxaeZueKhISGdn0z9Tilmu3EcQTxqQE7ZjC2X6oZdngHQuuMoF7T8Ro4egXqtFtOtzFFg==
红色部分就不一致了,不知道为什么
ktcserver 2009-07-10
  • 打赏
  • 举报
回复
自己顶下
greenery 2009-07-01
  • 打赏
  • 举报
回复
之前你的问题是:
algorithm.Key 要是16字节的,并符合强密钥要求
algorithm.VI 要是8字节的

你 s 和 str2 要是Base64编码可以在这转换啊 algorithm.Key = Convert.FromBase64String(s);
其实转Base64是多余的,可以写的简单点algorithm.Key = System.Text.Encoding.ASCII.GetBytes("12345678@#$%abcd");
最后就是在读解密后的字符流时,要指定编码方式
ktcserver 2009-06-30
  • 打赏
  • 举报
回复
自己弄了下,现在可以做到加密后的内容,解密也解得出来了。先把代码放上

ICryptoTransform transform;
string s = string.Intern(GetCode("bdlooccphdjpgcaafdhagfoaeffbmbmbfddcjdkcbbbdkaidfepdldgekcneabefmclfjpbggbjgidahfchhkcohnpeiacmigcdjfojjopakcbikcbpkcpfllbnliaem", 0x70eafb));
string str2 = string.Intern(GetCode("ojfdokmdmjdebikeekbfbiifohpfblggkkngniehfjlhghci", 0x419b355a));

SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
algorithm.Key = Convert.FromBase64String(s);
algorithm.IV = Convert.FromBase64String(str2);
algorithm.Mode = CipherMode.ECB;
algorithm.Padding = PaddingMode.PKCS7;
transform = algorithm.CreateEncryptor();


try
{


byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(pass);

MemoryStream ms = new MemoryStream();
TripleDESCryptoServiceProvider tdesc = new TripleDESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms,transform, CryptoStreamMode.Write);

StreamWriter sw = new StreamWriter(cs);
sw.WriteLine(pass);
sw.Close();//这里采用字符串流的方式写入

//cs.Write(bt, 0, bt.Length);
//cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex)
{
throw ex;
}

但下面的解密加密又出现问题了

解密函数是没有问题的,可以解密

private string DeCode(string sKey)
{

DESCryptoServiceProvider provider;
CryptoStream stream2;
StreamReader reader;
string s = string.Intern(GetCode("gfleddcffejfdgagmfhgheogjffhjfmhjfdiddkimfbjpbij", 0x4fca4b03));
string str2 = string.Intern(GetCode("mjckekjkmgalhghlfiolagfmakmmljdnoiknffbofhiogfpo", 0x3e9a23a));
provider = new DESCryptoServiceProvider();
byte[] buffer;
provider.Key = Convert.FromBase64String(s);
provider.IV = Convert.FromBase64String(str2);
buffer = Convert.FromBase64String(sKey);
MemoryStream stream = new MemoryStream(buffer);
stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Read);
reader = new StreamReader(stream2);
return reader.ReadToEnd();
}


但加密函数

public string EncryptWithKey2(string pass)
{
ICryptoTransform transform;
string s = string.Intern(GetCode("gfleddcffejfdgagmfhgheogjffhjfmhjfdiddkimfbjpbij", 0x4fca4b03));
string str2 = string.Intern(GetCode("mjckekjkmgalhghlfiolagfmakmmljdnoiknffbofhiogfpo", 0x3e9a23a));

SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
algorithm.Key = Convert.FromBase64String(s); //这里提示:指定键的大小对于此算法无效。
algorithm.IV = Convert.FromBase64String(str2);
transform = algorithm.CreateEncryptor();
byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(pass);

MemoryStream ms = new MemoryStream();
TripleDESCryptoServiceProvider tdesc = new TripleDESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);

StreamWriter sw = new StreamWriter(cs);
sw.WriteLine(pass);
sw.Close();
return Convert.ToBase64String(ms.ToArray());

}

却会出现以下提示错误:指定键的大小对于此算法无效。不知道什么原因。既然能解密说明
C_NET_rgz 2009-06-29
  • 打赏
  • 举报
回复
没研究过,只能帮Up一下!
ktcserver 2009-06-29
  • 打赏
  • 举报
回复
关键是,我解密函数不能变,但加密函数得同样加密出一样的字符串来。所以一直在弄,解密没问题,可加密就回不去了。
greenery 2009-06-29
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
string x = EncryptWithKey("yehaoen");
string s = DeCode(x);
}


private static string DeCode(string sKey)
{
ICryptoTransform transform;
MemoryStream stream;
byte[] buffer;
string s = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("12345678@#$%abcd"));
string str2 = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("87654321"));
SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
algorithm.Key = Convert.FromBase64String(s);
algorithm.IV = Convert.FromBase64String(str2);
algorithm.Mode = CipherMode.ECB;
algorithm.Padding = PaddingMode.PKCS7;
transform = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV);
buffer = Convert.FromBase64String(sKey);
stream = new MemoryStream(buffer);
CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read);
StreamReader reader = new StreamReader(stream2, System.Text.Encoding.Unicode);
return reader.ReadToEnd();
}



public static string EncryptWithKey(string pass)
{
ICryptoTransform transform;
string s = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("12345678@#$%abcd"));
string str2 = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("87654321"));
SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider();
algorithm.Key = Convert.FromBase64String(s);
algorithm.IV = Convert.FromBase64String(str2);
algorithm.Mode = CipherMode.ECB;
algorithm.Padding = PaddingMode.PKCS7;
transform = algorithm.CreateEncryptor();
try {
byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(pass);
MemoryStream ms = new MemoryStream();
TripleDESCryptoServiceProvider tdesc = new TripleDESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);
cs.Write(bt, 0, bt.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex) { throw ex; }
}

jasondct 2009-06-29
  • 打赏
  • 举报
回复
你是转换字节(流)的方式,这样对字符有要求的吧。
我有点 忙 就不测试你的代码了。
jasondct 2009-06-29
  • 打赏
  • 举报
回复
我试试,
以往 我用的最多的是 des加密的
ktcserver 2009-06-29
  • 打赏
  • 举报
回复
解密函数测试,没有问题,但解密出来的字符串通过我的加密函数来加密,加密的字符串与原先解密的不一样,所以不知道是什么问题
cpio 2009-06-29
  • 打赏
  • 举报
回复
应该是加密之后的可以解密,先加密,加密后的内容通过解密函数进行解密,顺序问题

随便拿个字符串就解密当然不对了

110,534

社区成员

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

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

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