双向流式加密算法

       由于在很多加密应用中,要求加密后的信息具有抗反向分析(例如,破解者知道明文的前若干
个字符,在此基础上力图反推出密钥,并解密其余的信息)的能力。本文提出了一种等长双向流
式加密算法,经此算法加密的信息,其中的数据有全局的信息相关性,具有极强的抗反向分析以
及差分分析的能力。

  算法思路:
  将加解密对象看成一个Byte数组A[N]。首先,我们从头到尾对它进行遍历,将每次遇到的元素
的值与前一个元素的值相加,并写回到数组中。即 A[i]+A[i-1] => A[i] (i从2递增到N)。这样
一来,后面元素的密文就直接依赖于之前的元素的值,达到了部分抗分析的目的。不难发现,进
行一遍遍历,只能让数组中下标大的元素对下标小的元素形成依赖,而理想中的情况应该是混合
型的依赖。为了解决这个缺陷,我们很容易的想到了反向遍历——思路与正向遍历相同,只是起
止点颠倒了一下: A[i]+A[i+1] => A[i] (i从N-1递减到1)。经过了正反两次遍历,数组中的每
个元素的值都变得和其它所有元素的值相关了——由此,本算法也就相应的具备了抗反向分析以
及差分分析的能力。
  在解决了信息相关性的问题之后,我们接下来需要思考的是,作为一个加密算法,密钥如何被
放置在上面的计算过程中去。首先,我分别在正向遍历和反向遍历中的求和计算过程中加入了一
个长度为一个字节的密钥,于是,加密过程就变成了:
    (A[i]+A[i-1]) xor Key1 => A[i]  ——正向遍历
    (A[i]+A[i+1]) xor Key2 => A[i]  ——反向遍历
  让我们再仔细看看遍历过程,不难发现,在每次遍历中,都有一个位于起点的元素的值不会发
生变化(正向遍历中的A[1]以及逆向遍历中的A[N])——这显然是一个切入点——于是,我们在
数组的两端再各放一个“隐含元素”(A[0]、A[N+1]),也就是继前面的Key1、Key2之后的第三
个和第四个密钥(它们的当然也是一个字节),让它们在两次遍历开始时分别作用于本来在遍历
中不会改变的起始元素值:
    A[1]+Key3 => A[1]  ——正向遍历
    A[N]+Key4 => A[N]  ——反向遍历
  现在,密钥的复杂度达到了四个字节,即32Bits,能够满足一般的加解密要求(考虑到本算法
的加密对象是以字节为单位的,比起那些以定长(64Bit或者更大)数据块为加密对象的分块加密算
法,本算法的密钥较之简单一些是可以理解的),为了获得更大的密钥空间,用户完全可以采用
多次加密或者多层加密的方法(考虑到本算法的简单性、易实现性,执行速度较一般的分块加密
算法快很多,多层嵌套加密是一个很好的选择)。需要指出的是,由于本算法每次的加密对象都
是整个明文,而不是某个定长区块,因此,多次嵌套加密后,所有的密钥信息都会被密文均匀的
包容(除非密钥的信息量已经大于明文的信息量——例如:用总共1024Bit的密钥加密两个字节的
信息?!),而不是在固定长度的区块中相互混迭(嘿嘿,如果你用DES进行嵌套加密的话就会发
生这种情况)。


  在下面的算法具体代码中,我不但实现了上面的算法,还将多次加密直接封装到了加解密过程
之中。


{
名称:双向流式加密算法
作者:creation_zy
时间:2004-4
备注:
  适当的增大参数Times(加密次数)可以极大的提高密文的难解性,但是耗时也会
成比例增加,对于长度在1KB以内的文本,建议将其控制在1-1024之内。如果采用嵌
套加密的话,可以进一步控制在1-8之间。
}
procedure SeqEnc(var Str:String;Key:Integer;Times:Integer);
var
  i,c,n:Integer; 
  Key1,Key2,Key3,Key4:Byte;
begin
  n:=Length(Str);
  if n=0 then
    exit;
  Key4:=Byte(Key shr 24);
  Key3:=Byte(Key shr 16);
  Key2:=Byte(Key shr 8);
  Key1:=Byte(Key);  
  for c:=Times-1 downto 0 do
  begin
    Str[1]:=Char(Byte(Str[1])+Key3);
    for i:=2 to n do
      Str[i]:=Char((Byte(Str[i-1])+Byte(Str[i])) xor Key1);
    Str[n]:=Char(Byte(Str[n])+Key4);
    for i:=n-1 downto 1 do
      Str[i]:=Char((Byte(Str[i+1])+Byte(Str[i])) xor Key2);
  end;
end;
procedure SeqDec(var Str:String;Key:Integer;Times:Integer);
var
  i,c,n:Integer;
  Key1,Key2,Key3,Key4:Byte;
begin
  n:=Length(Str);
  if n=0 then
    exit;
  Key4:=Byte(Key shr 24);
  Key3:=Byte(Key shr 16);
  Key2:=Byte(Key shr 8);
  Key1:=Byte(Key);        
  for c:=Times-1 downto 0 do
  begin
    for i:=1 to n-1 do
      Str[i]:=Char(Byte(Str[i]) xor Key2-Byte(Str[i+1]));
    Str[n]:=Char(Byte(Str[n])-Key4);
    for i:=n downto 2 do
      Str[i]:=Char(Byte(Str[i]) xor Key1-Byte(Str[i-1]));
    Str[1]:=Char(Byte(Str[1])-Key3);
  end;
end;


使用范例:
var
  Str:String;
begin
  Str:='名称:双向流式加密算法  作者:creation_zy';
  SeqEnc(Str,6,927506813); //用密钥927506813执行6次加密
  //Str已被加密
  SeqEnc(Str,2,200498157); //用密钥200498157执行2次加密
  //Str已被二次加密...
  SeqDec(Str,2,200498157); //用密钥200498157执行2次解密
  //解密第一层...
  SeqDec(Str,6,927506813); //用密钥927506813执行6次解密
  //解密第二层——Str已被还原
end;


加密效果例子:
Str: "VarPool.SetValue('TableStr',Str1);"
Key: 927506813
Times: 5
以十六进制显示的加密结果:
  "5FC4305B6A2ABFA0B13DD4F5253AC697092853741E12175C2886C7682EB3F41D1AF3"

将明文Str中的 "1" 替换成 "2" 之后的加密结果(以十六进制显示):
  "AA57C2B25A07C30EC1C955074C62A7D2CAB10709E89D2D907210FEEC2F9DB75AEDF2"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 流式布局算法是用于在网页中布局内容的常用方法。它的基本原理是将内容分成一个个小块,然后按照一定的规则将这些小块排列在网页上。 流式布局算法的具体实现方式可能有所差异,但通常会包括以下步骤: 1. 设置布局的容器和内容的小块。在 HTML 中,容器可以是 div 元素,而小块则是 p 元素或其他元素。 2. 设置布局的样式。在 CSS 中,可以使用 display: flex 或 display: grid 等属性来设置流式布局。 3. 设置布局的方向。在 CSS 中,可以使用 flex-direction 或 grid-template-columns 等属性来设置布局的方向。 4. 设置布局的间隔。在 CSS 中,可以使用 margin 或 padding 等属性来设置布局的间隔。 5. 设置布局的尺寸。在 CSS 中,可以使用 width 或 height 等属性来设置布局的尺寸。 6. 调整布局的其他属性。根据实际需要,还可以调整布局的其他属性,如对齐方式、换行方式等。 以上是流式布局算法的基本实现步骤,但是具体的实现方法可能会因为不同的需求而有所差异。 ### 回答2: 流式布局算法是一种用于处理具有不确定宽度和高度的网页元素的布局技术。其主要目的是将元素自动适应容器,并在容器宽度不足时自动换行。下面是流式布局算法的具体实现过程: 1. 确定容器的宽度:获取容器的宽度,通常是通过CSS样式指定的。 2. 确定元素的宽度:根据元素的内容、样式和布局规则来确定元素的宽度。可以使用百分比、固定像素等不同的单位。 3. 计算元素的位置:根据元素的宽度和容器的宽度,计算出元素在容器中的位置。通常情况下,第一个元素位于容器的左上角,后续元素则依次向右排列。 4. 判断是否需要换行:在每个元素放置后,判断容器的宽度是否足够容纳下一个元素。如果不够,则需要进行换行操作。 5. 计算换行后的位置:在需要换行时,将下一个元素放置到下一行的起始位置。根据元素的宽度和容器的宽度,确定元素在新行中的位置。 6. 重复步骤3到步骤5,直到所有元素都被放置到容器中。 流式布局算法的核心是计算容器的宽度和确定元素的位置。通过不断地计算和判断,保证元素能够按照指定的布局规则进行排列,并自动适应容器的宽度。这种布局方式广泛应用于响应式设计中的网页布局,可以实现在不同尺寸的设备上都能够显示出良好的效果。 ### 回答3: 流式布局算法是一种网页设计中常用的布局算法,其目的是实现页面元素的自适应排列。该算法的具体实现可以分为以下几个步骤: 1. 对元素进行排序:首先,根据元素的顺序决定它们在页面上的排列顺序。通常情况下,从左到右、从上到下的顺序是流式布局的基本规则。 2. 计算元素宽度:根据网页容器的宽度和元素所占的比例,计算出每个元素的实际宽度。可以使用百分比、固定像素值或其他单位来确定宽度。如果元素的宽度超过了容器的宽度,则可能需要对元素进行换行处理。 3. 处理元素换行:在进行元素换行时,需要注意每行元素的高度和间距情况,并适当调整元素的位置。若元素的高度不一致,则需要对齐元素的底部或顶部。换行的具体策略可以根据设计需求来决定。 4. 处理元素间距:在元素排列的过程中,需要考虑元素间的间距,以保证整体布局的美观性。可以通过设置元素之间的外边距、内边距或添加分隔线等方式来实现。 5. 响应式布局:为了适应不同设备和屏幕大小的需求,流式布局算法还需要考虑响应式设计。根据屏幕宽度的变化,动态调整元素的排列方式和宽度,以达到更好的用户体验。 总的来说,流式布局算法的实现可以根据具体的需求和设计风格来进行调整和优化。通过合理的设置元素宽度、行高和间距,可以实现一个动态、自适应的布局效果,使得网页在不同分辨率下都能够呈现出较好的展示效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值