zoukankan      html  css  js  c++  java
  • 混沌加密解密,附带完整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

  • 相关阅读:
    手机端学习助手的说明书需求以及团队PM选择
    对其他组的作品的评审意见
    项目介绍
    beta版项目总结
    Beta版说明书
    Alpha版会议总结
    第一阶段绩效评估
    今日事意见汇总
    Alpha版使用说明
    评审建议
  • 原文地址:https://www.cnblogs.com/gisoracle/p/13834917.html
Copyright © 2011-2022 走看看