请教关于字符串加密

fv54vv545 2014-07-28 10:31:35
一个加密函数:

/// <summary>
/// 加密函数
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">密匙,要求长度8位</param>
/// <returns>如果加密成功,返回加密后的字符串,失败则返回源串</returns>
public static string Encode(string encryptString, string encryptKey) //第一个参数是我准备加密的内容,第二个参数是我准备使用的加密密码(只能是8位,否则会报错)
{
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey);
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbKey), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}

一个解密函数:

/// <summary>
/// 解密函数
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">密匙:内容加密的密匙,要求和加密函数中的密钥一致,才能解密</param>
/// <returns>解密后的内容</returns>
public static string Decode(string decryptString, string decryptKey)
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbKey), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}

下面是对加密方面的应用示例:

private void 加密_Click(object sender, EventArgs e)
{
string s_加密 = Encode("我喜欢","abdc1234"); //把"我喜欢"这几个字加密,使用的密码是abdc1234
string s1 = @"aa.dat";
using (StreamWriter sw = File.CreateText(s1))
{
sw.Write(s_加密); //把加密后的内容保存在文件中
}
}
private void 解密_Click(object sender, EventArgs e)
{
string s1 = @"aa.dat";
string s_解密后的内容 = "";
foreach (string s in File.ReadLines(s1, Encoding.UTF8)) //从文件中读取加密过的内容
{
s_解密后的内容 = Decode(s, "abdc1234"); //把读取的内容,进行解密。此处要求输入密钥
}
MessageBox.Show(s_解密后的内容);
}


问题:
在上面的代码中,列出了对字符串进行加密、解密的应用。我想问的是,在应用程序中既然需要解密,那么解密的密码“abdc1234”肯定会在代码中出现,如果应用程序被反编译的话,这个密码不是就被看见了吗。那别人就可以自己写个小程序把文件aa.dat进行读取了啊,这样看来,字符串加密又有什么意义呢?
...全文
523 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
liqiucu 2014-07-29
  • 打赏
  • 举报
回复
"那么解密的密码“abdc1234”肯定会在代码中出现,如果应用程序被反编译的话,这个密码不是就被看见了吗" 如果你的处理加解密代码在服务端运行 (客户端只是发送请求而已,类似BS)他怎么拿到你的dll呢 即使拿走了dll 那么你把密钥再加密一次放到某个隐蔽地方 即使他浸入服务器copy走了dll 反编译出来了也没办法知道的,因为这个密钥是runtime的时候解密出来的
卧_槽 2014-07-29
  • 打赏
  • 举报
回复
引用 17 楼 fv54vv545 的回复:
哎,全遇到些哲学家...........
你不正用着破解的操作系统么。那么复杂的东西都破了,你那点小加密就别想太多了。随便应付下就行了。
fv54vv545 2014-07-29
  • 打赏
  • 举报
回复
哎,全遇到些哲学家...........
fv54vv545 2014-07-29
  • 打赏
  • 举报
回复
想吐了,既然加密、解密都会大白于天下,为什么网上有些人老是说“把连接字符串放在配置文件中,并加密,使用的时候再解密,这样就相对安全了”啊?
WM_JAWIN 2014-07-29
  • 打赏
  • 举报
回复
C#写的程序,就像你出时,不关防盗门,只是把木门关上了。别要想进你家,什么都不用,门把上一扭门就开了。
md5e 2014-07-29
  • 打赏
  • 举报
回复
如果还想更加理想,要用到RSA,公钥加密,私钥解密,然后加密和解密程序分开
md5e 2014-07-29
  • 打赏
  • 举报
回复
将密钥当参数来使用就可以了,例如,我们的介面用:选择文件,加密还是解密,密钥 这些都是给用户自己填写设置
MR00009 2014-07-29
  • 打赏
  • 举报
回复
我觉得真正的加密是没有的,防君子不防小人啊。 所以现在很多软件都是电话验证。
於黾 2014-07-29
  • 打赏
  • 举报
回复
引用 8 楼 fv54vv545 的回复:
[quote=引用 7 楼 devmiao 的回复:] 不要直接在客户端访问数据库,而应该访问中间件,中间件访问数据库。中间件在服务器上,用户接触不到源代码。
俺现在不说这个问题,WCF太难,没学[/quote] 谁告诉你中间件只能用WCF做了,你爱用C++做也能做出来 不就是socket通信么
於黾 2014-07-29
  • 打赏
  • 举报
回复
而混淆,加壳,加密,这些,也是同样的道理 你用了复杂的算法来加密,这个加密算法本身就是有价值的 但是别人偷去了其实也没什么用 而你的程序如果局限性很大,不是那么受欢迎,谁愿意费大力气偷个用处不大的程序呢
於黾 2014-07-29
  • 打赏
  • 举报
回复
引用 24 楼 ch_weni 的回复:
[quote=引用 23 楼 Z65443344 的回复:] 要是你家门锁,比你家所有家具总和都贵,估计没人愿意去偷,不是偷不到,是不值得.
什么门锁那么贵有些吓人。。。肯定门锁直接被偷了[/quote] 保险库大门不就是么,如果门里没什么东西,而门本身又那么难开,门又那么大,偷又不好偷,卖又卖不出去,你偷来干嘛
凤凰涅檠 2014-07-29
  • 打赏
  • 举报
回复
引用 23 楼 Z65443344 的回复:
要是你家门锁,比你家所有家具总和都贵,估计没人愿意去偷,不是偷不到,是不值得.
什么门锁那么贵有些吓人。。。肯定门锁直接被偷了
於黾 2014-07-29
  • 打赏
  • 举报
回复
要是你家门锁,比你家所有家具总和都贵,估计没人愿意去偷,不是偷不到,是不值得.
於黾 2014-07-29
  • 打赏
  • 举报
回复
只有千日做贼,没有千日防贼 人家就是想偷,你怎么防也防不住的 问题就是偷你要付出的,和他能偷到的收益,是否超过一定比例 说白了就是值不值得费劲偷一次
於黾 2014-07-29
  • 打赏
  • 举报
回复
引用 15 楼 fv54vv545 的回复:
想吐了,既然加密、解密都会大白于天下,为什么网上有些人老是说“把连接字符串放在配置文件中,并加密,使用的时候再解密,这样就相对安全了”啊?
所以说是相对安全,而不是绝对安全 好比你出门为什么要锁呢,锁也防不住专业人士 但是如果不锁,随便什么人,也能进你家随便翻翻
by_封爱 版主 2014-07-29
  • 打赏
  • 举报
回复
密码自己知道就行了啊...你还告诉别人? 你怎么不把你支**的账号密码告诉我?
zazyl 2014-07-29
  • 打赏
  • 举报
回复
不要将密码写到源码中。
fv54vv545 2014-07-28
  • 打赏
  • 举报
回复
引用 7 楼 devmiao 的回复:
不要直接在客户端访问数据库,而应该访问中间件,中间件访问数据库。中间件在服务器上,用户接触不到源代码。
俺现在不说这个问题,WCF太难,没学
devmiao 2014-07-28
  • 打赏
  • 举报
回复
不要直接在客户端访问数据库,而应该访问中间件,中间件访问数据库。中间件在服务器上,用户接触不到源代码。
fv54vv545 2014-07-28
  • 打赏
  • 举报
回复
引用 4 楼 wind_cloud2011 的回复:
这只是一个加密与解密的例子,实际中也可这样写,就像你所说的,反编译,别人就知道你的算法了,好的加解密,密钥很关键,是不会轻易让你知道的;你想很多软件写得很好,还不是一样给人破解了,没有绝对的安全。
那配置文件app.config里面的连接字符串加密,还不是要解密啊,不是同样的道理吗,被反编译就没用了。 为什么好多人说把配置文件app.config里面的连接字符串加密,可以提高安全性呢?
加载更多回复(5)

110,536

社区成员

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

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

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