1. 程式人生 > 實用技巧 >混沌加密解密,附帶完整C#原始碼

混沌加密解密,附帶完整C#原始碼

logxing版權所有,轉載請註明出處

在群裡有人提出了這個題目,就研究了一下。確實是個不錯的東東。

混沌加密演算法是一個對稱加密演算法,即加密和解密使用相同的金鑰。更特別的,其加密和解密函式也是完全一樣的(這個特點可以引出一個優勢,就是使用任何金鑰對任何資料都可以執行解密而不會報錯,這樣暴力破解就很難了)。

混沌加密演算法的原理是構造一個含有若干引數的迭代式,引數的微小差異會導致每次迭代的結果都毫無規律可言(即混沌的由來),用每次迭代的結果生成一個位元組資料,用其與明文做異或操作生成密文。這裡的迭代式及其引數值是很有講究的,其混沌性是基於非線性數學的理論證明。最常用最簡潔的迭代模型稱為Logistic模型:X_n+1=u*Xn(1-Xn),其中u為引數,3.5699456<u<=4,0<Xi<1,此時該迭代式呈混沌特性。至於為什麼u值的範圍這麼奇怪,可以檢視本文附帶原始碼中的論文。

針對位元組陣列的加密演算法如下:

        /// <summary>
/// 基於Logistic模型的混沌加解密
/// </summary>
/// <param name="data">要處理的資料</param>
/// <param name="u">應屬於[3.57,4]</param>
/// <param name="x0">應屬於(0,1)</param>
/// <returns></returns>
public static byte[] Encrypt(byte[] data, double u, double x0)
{
byte[] res = new byte[data.Length];
double x = logistic(u, x0, 2000);

for (int i = 0; i < data.Length; i++)
{
x = logistic(u, x, 5);
res[i] = Convert.ToByte(Convert.ToInt32(Math.Floor(x * 1000)) % 256 ^ data[i]);//取x小數點後3位來生成金鑰
}

return res;
}

private static double logistic(double u, double x, int n)
{
for (int i = 0; i < n; i++)
{
x = u * x * (1 - x);
}
return x;
}

但混沌加密更適合的領域是影象的加密,程式碼如下,實際就是對畫素顏色的RGB加密,生成新的影象,新影象的解析度與原始影象一致。

        /// <summary>
/// 基於Logistic模型的混沌加解密
/// </summary>
/// <param name="src">要處理的影象資料</param>
/// <param name="u">應屬於[3.57,4]</param>
/// <param name="x0">應屬於(0,1)</param>
/// <returns></returns>
public static Bitmap Encrypt(Bitmap src, double u, double x0)
{
Bitmap dest = new Bitmap(src.Width, src.Height);

double x = logistic(u, x0, 2000);
int key;
for (int i = 0; i < src.Width; i++)
{
for (int j = 0; j < src.Height; j++)
{
Color srcColor = src.GetPixel(i, j);

x = logistic(u, x, 5);
key = Convert.ToInt32(Math.Floor(x * 1000)) % 256;
int r = key ^ srcColor.R;
x = logistic(u, x, 5);
key = Convert.ToInt32(Math.Floor(x * 1000)) % 256;
int g = key ^ srcColor.G;
x = logistic(u, x, 5);
key = Convert.ToInt32(Math.Floor(x * 1000)) % 256;
int b = key ^ srcColor.B;

dest.SetPixel(i, j, Color.FromArgb(r, g, b));
}
}

return dest;
}

在原始碼中包含了完整的使用方法,大家可以參考,有什麼問題歡迎來討論。程式介面如下圖:

圖片中的MM如果認為我侵犯了你的肖像權,請速與本人聯絡索賠事宜,可簽訂終生照顧協議。

原始碼下載:http://files.cnblogs.com/logxing/chaos.rar