高分求解

gannet 2003-08-23 10:14:08
高分求一个对称加密算法(c#,对字符串加解密),或者帮我看看下面的程序哪儿有错?该程序在同一进程内对同一字符串第一次加密和第二次加密得出的结果不一样。

private static byte[] KEY_64 = new byte[8] {2,3,4,5,6,7,8,9};
private static byte[] IV_64 = new byte[8] {12,13,14,15,16,17,1,19};
public static string EncryptData(string oStr)
{
string nStr="";
if(oStr.Length>0)
{
DESCryptoServiceProvider cryptoProvider=new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,cryptoProvider.CreateEncryptor(KEY_64,IV_64),CryptoStreamMode.Write);
StreamWriter sw=new StreamWriter(cs);
sw.Write(oStr) ;
sw.Flush();
cs.FlushFinalBlock();
sw.Flush();
byte[] buffer=ms.GetBuffer();
int i=0;
int iLength=Int16.Parse(ms.Length.ToString());
nStr=Convert.ToBase64String(buffer,i,iLength);
cs.Close();
ms.Close();
sw.Close();
}
return nStr;
}

public static string DecryptData(string oStr)
{
string nStr="";
if(oStr.Length>0)
{
DESCryptoServiceProvider cryptoProvider=new DESCryptoServiceProvider();
byte[] buffer=Convert.FromBase64String(oStr);
MemoryStream ms = new MemoryStream(buffer);
CryptoStream cs = new CryptoStream(ms,cryptoProvider.CreateDecryptor(KEY_64, IV_64),CryptoStreamMode.Read);
StreamReader sr=new StreamReader(cs);

nStr=sr.ReadToEnd();
cs.Close();
ms.Close();
sr.Close();
}
return nStr;
}
...全文
33 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gannet 2003-09-01
  • 打赏
  • 举报
回复
问题总算解决了,确实是KEY_64、IV_64初始化的问题,谢谢xixigongzhu(夕夕公主) !
xixigongzhu 2003-08-27
  • 打赏
  • 举报
回复
KEY_64、IV_64是在初始化的时候初始化的把,问题可能是:在你初始化KEY_64和IV_64的前调用了解密的方法。

除了这个,其他象MemoryStream、StreamReader、DESCryptoServiceProvider等都不会因环境而受影响。
gannet 2003-08-27
  • 打赏
  • 举报
回复
如代码所示,这些代码在同一个类中,调用解密前应该会先初始化KEY_64,IV64吧。
gannet 2003-08-26
  • 打赏
  • 举报
回复
我觉得这个与加解密时用到memory有关,在不同状态时取得的buffer不同导致了加密和解密无法对称.不知道是否是c#对内存的管理接口有问题?
xixigongzhu 2003-08-26
  • 打赏
  • 举报
回复
这么说的话,肯定与应用服务器初始化有关。就是不知道这个与加密之间有些什么联系?
gannet 2003-08-26
  • 打赏
  • 举报
回复
我简单描述我的应用环境吧:
在一个web应用程序中设置数据库连接信息,其中对口令进行加密,将这些信息保存在一个xml文件中,每次初始化web应用的时候从xml文件中读出设置信息并解密口令,此时解密无法成功,如果进入应用程序后再调用解密方法,传入相同的参数,解密却是成功的.前后两次传进的参数确定是一样的,密钥也一样,但结果却不一样.
xixigongzhu 2003-08-26
  • 打赏
  • 举报
回复
要是知道你是怎么用的就好了。
要不你用测试的方式来查错:
1.首先看看两次解密传进的参数是不是一样。如果密钥一样数据一样,出来的密码应该也一样。所以在方法DecryptData里第一句前加上:Console.WriteLine(oStr+"===data======");
xixigongzhu 2003-08-25
  • 打赏
  • 举报
回复
你的加密解密在不同的进程中进行的?
gannet 2003-08-25
  • 打赏
  • 举报
回复
xixigongzhu(夕夕公主):
我试了你的程序,还有一点问题:某字符串经过加密后,在新的进程中第一次解密总是无法成功,但第二次可以,不知道为什么?还望指教。
gannet 2003-08-25
  • 打赏
  • 举报
回复
当然不是,我这里的环境是:在一个web应用中,我设置了数据库口令(加密)信息,如果不重新初始化应用服务器,这时候能解密成功,但如果应用服务器重新初始化,则无法将口令正确解密。
xixigongzhu 2003-08-23
  • 打赏
  • 举报
回复
应该这样:
private static byte[] KEY_64 = new byte[8] {2,3,4,5,6,7,8,9};
private static byte[] IV_64 = new byte[8] {12,13,14,15,16,17,1,19};
public static string EncryptData(string oStr)
{
string nStr="";
if(oStr.Length>0)
{
DESCryptoServiceProvider cryptoProvider=new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,cryptoProvider.CreateEncryptor(KEY_64,IV_64),CryptoStreamMode.Write);
byte[] d = System.Text.Encoding.Unicode.GetBytes(oStr);
cs.Write(d, 0, d.Length);
cs.FlushFinalBlock();
byte[] buffer = ms.ToArray();
nStr=Convert.ToBase64String(buffer,0,(int) ms.Length);
cs.Close();
ms.Close();
}
return nStr;
}

public static string DecryptData(string oStr)
{
string nStr="";
if(oStr.Length>0)
{
DESCryptoServiceProvider cryptoProvider=new DESCryptoServiceProvider();
byte[] buffer=Convert.FromBase64String(oStr);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,cryptoProvider.CreateDecryptor(KEY_64, IV_64),CryptoStreamMode.Write);
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
buffer = ms.ToArray();
nStr = System.Text.Encoding.Unicode.GetString(buffer);
cs.Close();
ms.Close();
}
return nStr;
}

GetBuffer一般不能用,它是得到内部定义的所有的字节流,要用ToArray。

110,534

社区成员

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

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

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