一种近乎完美的加密算法:扩散加密算法

引言

在开始介绍之前,请让我们来看几个问题。

有没有一种对称加密算法能够支持任意长度密匙加密呢?有没有一种加密算法能够同时支持对称和非对称加密呢?有么有一种加密算法在实现完全扩散时所需要的步骤最少呢?

这样的算法一定是存在的!

下面,我将给大家介绍一种新的加密算法:扩散加密算法。

扩散加密算法是以扩散算法为基础,在处理的过程中加入密匙从而实现加密、解密。

那什么是扩散算法呢?

回答这个问题之前,我们先来看看上面所说的完全扩散的概念。扩散是化学中的一个重要现象,通常是指多种物质(或分子)彼此进入对方的现象。那么密码学中的扩散就是指输入元素进入(影响)输出元素的现象。输入元素影响输出元素的比例(单个输入的改变引起输出改变的比例),叫做扩散率。如果每一个输入元素的改变都造成输出元素全部发生改变,则叫完全扩散(即100%的扩散率)。

密码学要求加密算法必须满足100%的扩散率,否则加密就会很容易被破解,也就失去了加密的意义。

 

 

算法原理

那么有什么办法可以以最少的步骤实现完全扩散呢?试想一下,假如有一个输入元素x改变了,我们可以让这个元素x去改变另一个元素y;元素x、y再去改变其他元素,最后所有元素都被改变!这很简单吧。那么我们就来试试!

我们把整个改变过程分成多个步骤去完成。假设输入有16个元素,我们把这16个元素分为两组,以X、Y表示,假设X0元素是变元素(元素下标以0开始,即X0表示X组第一个元素,X7表示X组最后一个元素)。

第一步:让X组中的元素1(X0)去改变Y组中的元素1(Y0)。记作X0→Y0,那么就有了X0和Y0两个变元素。

第二步:让X组中的元素1(X0)去改变Y组中的元素5(Y4),记作X0→Y4;再让Y组中的元素1(Y0)去改变X组中的元素5(X4),记作Y0→X4;那么就有X0、X4,Y0、Y4共4个变元素。

第三步:再让X0改变Y2(X0→Y2),X4改变Y6(X4→Y6);让Y0改变X6(Y0 →X6),Y4改变X2(Y4→X2);则有X0、X2、X4、X6,Y0,Y2、Y4、Y6共8个变元素。

最后:让X0改变Y1,以此类推:X2→Y3,X4→Y5,X6→Y7;Y0→X7,Y2→X1,Y4→X3,Y6→X5。

至此,所有元素都被改变,这就是扩散算法!

或许你会问,那么多元素要一个个去改变吗?这肯定是当然的,不过可以用代码轻松搞定,这代码长什么样子呢?瞧:

 

  

 

就这么简单!外层循环(round)是处理总步骤,可以用公式计算(round=log2(N)),N为分组长度;内层循环是逐个改变元素的值,可以发现,内层循环可以并行处理的;Ex和Ey是两个任意函数。

前面的例子我们看到,第一步中A0去改变了B0,那么可否改变B或者A中的其他任意元素呢?这当然是可以的!那么你又会发现,为什么上面的例子在改变元素时这么有规律,能不能随机去改变元素呢?哈哈哈哈,如果你能发现这个问题,说明你很用心,那么我也用心的告诉你!这绝对是当然的~!你可以任意随机的去改变元素,只要你的改变路线能够让每一个元素都能通过该路线影响其他任意一个元素,那么就能够实现完全扩散!

下面是一种有序和一种无序的改变规则图:

 

 

图中的连线集合(改变规则)叫做网络,连线就叫路径;方框中的数字为元素索引,X、Y为分组名称;元素索引上方的“*”表示变化(受影响)的元素;虚线连接表示初始变元素改变其他元素所走的路线。

 

 

加密解密

那么我们回到开始的问题,如何加密、解密呢?这很好办,如果别人无法获取你的源代码,你可以设计属于自己的网络,设计属于自己的函数进行加密;然后按照加密的过程逆运算即可解密,这是一种加密方法(叫做隐匿加密或非公开加密)。如果源代码公开呢?这更好办,如上述的例子,在用函数Ex、Ey改变元素时,加入密码就好了。扩散加密是完全扩散的,也就是说在解密时,错一位密码都无法正确解密!下面是加密和解密代码:

 

 

 

图中KX、KY就是密码,长度和分组长度相同,函数Ex,Ey与Dx、Dy分别为互逆函数。

 

 

长度任意

扩散算法可以使用任意长度的元素进行运算,你可以用2个元素,也可以用200个元素,或者200万个元素。无论多少个元素,扩散算法都能实现完全扩散,这是目前世界上绝无仅有的!而且是实现该长度完全扩散所需要的步骤(或指令)最少的方法。不过为了使处理速度最快,元素长度最好是2的N次方(N为正整数)。

 

 

非对称加密

上面我们介绍了对称分组的加密方法,那么扩散算法能不能真正实现非对称加密呢?这个答案就得留给你们了!扩散算法从理论上是可以实现非对称加密的。

我们知道,非对称加密与对称加密的最大区别就是非对称用一对儿密码进行加密和解密,而且非对称是基于特定的数学难题。通过其中一组密码加密后的数据只能通过另一组密码进行解密。在加密和解密的过程中将明文转换为一个大整数进行计算。比如RSA和ECC,将几百个字节组合成一个大整数进行计算,这无疑是相当耗资源的。

      那么,扩散算法该如何实现非对称加密?试想一下,我们为什么不能将明文拆分成多个小整数再进行加密呢?或者直接将以元素(字节)为单元进行加密?以往的非对称加密必须要将明文合成一个整数进行加密,因为密码需要足够的长度才可以防止被穷举攻击,如果进行拆分,则密匙长度就会降低,穷举就变得容易,所以不能拆分!但是扩散算法则完全不用如此,在扩散过程中,假设加密和加密的函数是一个函数对儿,通过其中一个函数加密后的数据只能通过另一个函数进行解密,这样不就实现非对称加密了吗?或许你会问,这样做不怕被穷举攻击吗?试想一下,单个元素的非对称加密可以非常容易穷举,如果将许多元素组合加密呢?,每个元素都使用随机的密码,每个元素都会影响其他任意一个元素,这样的话,密匙空间就会扩展到各个元素密匙空间总和(如果单个元素的密匙空间为8位,那么128个元素的总密匙空间就是128*8=1024位)。如果要进行穷举,则必须所有密码都正确才能加开(穷举所有密匙空间,与对称加密一样)。对于较长的密匙来说(比如1024位),穷举所有密匙空间几乎不太可能。

      这就是扩散算法进行非对称加密的理论实现,但是目前为止还没有发现适合的函数来进行非对称加密。或许你可以说用RSA或ECC的加密方法,再结合扩散算法,以元素或元素组(多个元素的组合)为单位进行加密,这是可行的,但是密匙空间不足!或许有一天,能够找到一对儿完美的函数,让我们拭目以待吧!

 

 

嵌套扩散

上面演示了以元素为单位进行扩散,那么是否可以将多个元素进行组合在进行扩散呢?这也绝对是当然!可以将任意数量的元素(相邻或者不相邻)组合成元素组,再以元素组为单位建立网络,只要扩散函数满足输入元素的任意一位发生变化都会造成所有输出元素发生改变,那么就是可行的。这对函数要求比较高,不过也不用改变全部输出元素,可以只改变部分,建立网络时多增加一些路径即可。

这样的话,我们就可以对扩散过程进行嵌套了,把元素分成N个子分组,每个子分组包含M个元素,先对子分组进行扩散,然后以子分组为单位再进行扩散(可以无限嵌套)。这种扩散方法扩散效果更好,不过速度稍慢。

 

快速的处理速度

如果以单线程串行处理,在128字节的元素长度下,可以达到100M/s的处理速度,如果扩散过程中(内层处理)使用并行计算,理论上速度将提示N倍,N为元素长度。以上述的速度计算,则可以达到12G/s,或许会更高。

 

多种加密方式方式

1. 对称分组加密

采用固定密码的方式进行对称分组加密,每一组明文都采用固定的密码;

2. 对称分组流加密

在对称分组加密的基础上,采用密匙流,对每一组明文都使用不同的密码。

3. 非对称加密

尚待实现;

 

 

最后说一下扩散算法的其他用途

 

1.   生产随机数

扩散算法有着完美的扩散率,只需要几个种子就可以生成相当安全的随机数,而且重复周期很长,到底有多长呢?就是很长很长了,不过记得在函数中消除线性!

 

2.   计算消息摘要

因为扩散算法是完全扩散的,因此输入数据中的任意一位的改变都可以造成输出数据全部发生改变,这不正好可以用来生成消息摘要吗?而且可以任意指定消息摘要长度。

那么,大家可以放心的使用扩散算法隐藏用户密码了!因为你可以定制专属加密方式,让别人头疼去吧!

 

以上内容本人已在看雪安全论坛发表过!

扩散算法的更多资料请访问:http://baike.baidu.com/item/扩散算法

扩散加密的更多资料请访问:http://baike.baidu.com/item/扩散加密算法

注:上文中的扩散网络因为扩散源较少而存在安全隐患,本人已设计安全成熟的扩散网络,在此不便公布,若有疑问请致邮:platosnk@qq.com。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值