一個加密算法
聽說此加密算法每次加密的結果都不一樣,但解密的結果相同
using System;html
namespace test001
{
/**
對sSource,進行加密、解密操做。
@param sSource String :操做的字符串
@param iFlag int :操做類型 1-加密 2-解密
@return String :加密或解密後的字符串
**/
public class password
{
public password()
{
}
public static 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)
{
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;
}
}
}dom
/// <summary> /// 對sSource,進行加密、解密操做。 /// </summary> /// <param name="sSource">須要加密或解密的字符串</param> /// <param name="iFlag">操做類型 1-加密 2-解密</param> /// <returns>加密或解密後的字符串</returns> public static 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);//產生0-9的隨機數 if (li_head == 0) li_head = 1; for (i = 0; i < li_len; i++) { //ASCII可顯示字符是從32-126,因此從新構建一個這個之間的數 Random rdm2 = new Random(~unchecked((int)DateTime.Now.Ticks));//能夠嘗試: Random rdm2 = new Random(~unchecked(rdm1.Next())); int rand2 = (int)(rdm2.NextDouble() * 94);//產生0-93之間的隨機數, if (rand2 == 0) rand2 = 1; li_rand = rand2 + 32;//這個數就是32-126之間的數 li_asc = Convert.ToInt32(sSource.ToCharArray(i, 1)[0]); ls_i = ((char)(li_asc - i)).ToString(); if (li_asc + i + li_head > 126) { if (li_rand % 2 == 1) li_rand = li_rand + 1;//設置爲偶數 ls_i = ((char)(li_rand)).ToString() + ((char)(li_asc - i - li_head)).ToString();//加密算法生成兩個字符,第一關字符是隨機生成的偶數可顯示ASCII字符,第二個是真正的字符 } else { if (li_rand % 2 == 0) li_rand = li_rand + 1;//設置爲奇數 ls_i = ((char)(li_rand)).ToString() + ((char)(li_asc + i + li_head)).ToString();//加密算法生成兩個字符,第一關字符是隨機生成的奇數可顯示ASCII字符,第二個是真正的字符 } 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;//每次參與運算的li_head通過加密後放到密文的第一個字符,而且是可顯字符 } 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();//由於sSource中的第一位保存了密鑰,從第三位開始全部奇數位纔是真正須要解密的數據 } else { ls_i = ((char)(li_asc - (i - 1) / 2 - li_ret)).ToString(); } ls_code = ls_code + ls_i; } } return ls_code; }
上面的就不用我說明了,註釋都寫清楚了,只是加密後的密文要比明文多一倍+1個字符加密