發布一個加解密的方法,特別是相同的明文產生不同的密文
以下是加密解密的方法
相同的明文,每次生成的密文都不一樣,
PS:最好不要把加密后的密文用在网页地址栏传值,因为这个加密出来的可能带特殊符号比如? # 之类的,在传到另一个页面时可能REQUEST时被截断,导致解密出来的明文与加密前不一样.
/// <summary>
/// 加密解密方法
/// </summary>
/// <param name="sSource">操作的字符串</param>
/// <param name="iFlag">操作類型 1為加密 非1為解密</param>
/// <returns>加密或解密后的字符串</returns>
public string pWord(string sSource,int iFlag)
{
if(sSource==null)
return null;
if(sSource.Equals(""))
return "";
int li_len,i,li_asc,li_rand,li_head;
string ls_i,ls_code="";
if(iFlag ==1)
{
li_len = sSource.Length;
Random rdm1 = new Random(~unchecked((int)DateTime.Now.Ticks));
li_head = (int)(rdm1.NextDouble()*10);
if(li_head ==0)
li_head =1;
for(i=0; i<li_len; i++)
{
Random rdm2 = new Random(~unchecked((int)DateTime.Now.Ticks));
int rand2 =(int)(rdm2.NextDouble() *94);
if(rand2 ==0)
rand2 =1;
li_rand=rand2+32;
li_asc=Convert.ToInt32(sSource.ToCharArray(i,1)[0]);
ls_i=((char)(li_asc -i)).ToString();
if(li_asc+i+li_head>126) //ASCI码超过126的字模,比如中文这类占两个字节的
{
if(li_rand%2 ==1)
li_rand=li_rand+1;
ls_i=((char)(li_rand)).ToString()+((char)(li_asc -i -li_head)).ToString();
}
else //加密的是字母
{
if(li_rand%2 ==0)
li_rand=li_rand+1;
ls_i=((char)(li_rand)).ToString()+((char)(li_asc +i +li_head)).ToString();
}
ls_code=ls_code+ls_i;
}
Random rdm3 = new Random(~unchecked((int)DateTime.Now.Ticks));
int rand1 =(int)(rdm3.NextDouble()*9);
if(rand1 ==0)
rand1 =1;
ls_code=((char)(rand1*10+li_head+40)).ToString()+ls_code;
}
else
{
int li_ret;
li_len=sSource.Length;
ls_code="";
li_ret=Convert.ToInt32(sSource.ToCharArray(0,1)[0]) %10;
for( i=2;i <li_len; i=i+2)
{
li_asc=Convert.ToInt32(sSource.ToCharArray(i,1)[0]);
if(Convert.ToInt32(sSource.ToCharArray(i - 1,1)[0]) %2 ==0)
{
ls_i=((char)(li_asc + (i - 1)/2 + li_ret)).ToString();
}
else
{
ls_i=((char)(li_asc - (i - 1)/2 - li_ret)).ToString();
}
ls_code=ls_code+ls_i;
}
}
return ls_code;
}