一个不错的加密算法

介绍了一个C#编写的加密算法,其特点是加密结果不固定但解密结果一致。讨论了如何利用这一特性进行用户身份验证,并提出了服务器端设计建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个很不错的加密算法,C#语言编写

算法加密特点:每次加密的结果都不同,但解密的结果都相同,而且都是加密后的数据:


  1. --加密算法:sSource是加密的字符窜  
  2. --int iFlag=1是加密  2是解密  
  3. public static string pWord(string sSource,int iFlag)  
  4.   {  
  5.    if(sSource==null)  
  6.     return null;  
  7.    if(sSource.Equals(""))  
  8.     return "";  
  9.    int li_len,i,li_asc,li_rand,li_head;  
  10.             string ls_i,ls_code="";  
  11.    if(iFlag ==1)  
  12.    {  
  13.     li_len=sSource.Length;  
  14.     Random rdm1 = new Random(~unchecked((int)DateTime.Now.Ticks));   
  15.     li_head=(int)(rdm1.NextDouble()*10);  
  16.     if(li_head ==0)  
  17.      li_head =1;  
  18.     for(i=0; i<li_len; i++)  
  19.     {  
  20.      Random rdm2 = new Random(~unchecked((int)DateTime.Now.Ticks));   
  21.      int rand2 =(int)(rdm2.NextDouble() *94);  
  22.      if(rand2 ==0)  
  23.       rand2 =1;  
  24.      li_rand=rand2+32;  
  25.      li_asc=Convert.ToInt32(sSource.ToCharArray(i,1)[0]);  
  26.      ls_i=((char)(li_asc -i)).ToString();  
  27.  
  28.      if(li_asc+i+li_head>126)  
  29.      {  
  30.       if(li_rand%2 ==1)  
  31.        li_rand=li_rand+1;  
  32.       ls_i=((char)(li_rand)).ToString()+((char)(li_asc -i -li_head)).ToString();  
  33.      }  
  34.      else 
  35.      {  
  36.       if(li_rand%2 ==0)   
  37.        li_rand=li_rand+1;  
  38.       ls_i=((char)(li_rand)).ToString()+((char)(li_asc +i +li_head)).ToString();  
  39.      }  
  40.      ls_code=ls_code+ls_i;  
  41.     }  
  42.     Random rdm3 = new Random(~unchecked((int)DateTime.Now.Ticks));   
  43.     int rand1 =(int)(rdm3.NextDouble()*9);  
  44.     if(rand1 ==0)  
  45.      rand1 =1;  
  46.     ls_code=((char)(rand1*10+li_head+40)).ToString()+ls_code;  
  47.    }  
  48.    else 
  49.    {  
  50.     int li_ret;  
  51.     li_len=sSource.Length;  
  52.     ls_code="";  
  53.     li_ret=Convert.ToInt32(sSource.ToCharArray(0,1)[0]) %10;  
  54.     for( i=2;i <li_len; i=i+2)  
  55.     {  
  56.      li_asc=Convert.ToInt32(sSource.ToCharArray(i,1)[0]);  
  57.      if(Convert.ToInt32(sSource.ToCharArray(i - 1,1)[0]) %2 ==0)  
  58.      {  
  59.       ls_i=((char)(li_asc + (i - 1)/2 + li_ret)).ToString();  
  60.      }  
  61.      else 
  62.      {  
  63.       ls_i=((char)(li_asc - (i - 1)/2 - li_ret)).ToString();  
  64.      }  
  65.      ls_code=ls_code+ls_i;  
  66.     }  
  67.    }  
  68.    return ls_code;  
  69.   } 

对于该加密算法的使用方法:

该加密算法的特点是无论加密多少次但每次解密的结果都是一致的,有个缺点是每次无论加密和解密都需要明文,当前我们对用户登陆的用户名和密码进行加密来验证用户身份:

在Username中输入用户名(密码简化主要演示这个算法的用法),当点击加密时显示加密和解密后的数据,

第一次加密结果:

 

第二次加密结果:

 

从上面可以看出加密都是相同的数据chenkai,显示的加密结果不同,但解密的数据始终相同。


  1. --Author:chenkai  Time:2009年3月3日14:33:40  
  2. --Button1点击加密的触发事件方法  
  3. protected void Button1_Click(object sender, EventArgs e)  
  4.     {  
  5.         //获得加密数据  
  6.         string EncrytString = this.TextBox1.Text;  
  7.         //进行加密  
  8.         this.TextBox2.Text=pWord(EncrytString, 1);  
  9.         //进行解密  
  10.         this.TextBox3.Text = pWord(EncrytString, 2);  
  11.     }  
  12. --从上面看出加密和解密传入的是EncrytString(chenkai),既都需要明文传入 

当用户登陆时需要向服务器端传入数据和数据库进行比对,为了保证数据传输的安全性对明文数据进行该算法加密,相对而言数据库如何设计?

如果我们数据库中保存的是加密后的数据,这样的话因为每次用户登陆加密的结果都不相同,虽然保证数据安全但无法验证用户的身份。这种方案行不通

在则数据库中保存的是解密的数据,我们在用户注册时把用户登陆的用户名进行解密处理并存入数据库,根据该算法特点无论怎么加密而解密结果始终是一至的,那么用户在注册后多次登陆中对用户名进行解密并与数据库进行比对,来判断用户身份,这种方案似乎能够行得通。但这点恰恰就暴露这个算法的缺点,解密时需要明文,那么从客户端传来的是加密后的数据而非明文,这种方案也没有用 。该如何更好利用该算法呢?

我们可以这样设计数据库来利用该算法:

在数据库中存入的是明文,那么当用户登陆时有两种数据加密和解密 都是非明文,如何选择呢?上面的两种方法都选择是加密数据,死胡同一条,如果我们换一个角度换成解密数据传输到服务器端于数据库进行比对,而数据库存储的是明文对它进行解密处理,再同客户端传来的用户登陆解密数据进行比对来判断用户身份,在传输中是非明文而且还能验证客户端用户身份,这种方案能够行得通。

呵呵绕了大半天,当然这个算法设计不太好(不是很实用),但如果想用到还是有办法的。


本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/765468

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值