figa 发表于 2007-3-20 11:49:23

呵呵,好同志 ,还比较全面

jameshung 发表于 2007-3-20 12:03:01

好东西啊 !!先收藏了,谢谢楼主!!

deletex 发表于 2007-3-21 09:32:42

原贴:http://www.luocong.com/articles/show_article.asp?Article_ID=15

(特别感谢汇编高手 dREAMtHEATER 对我的代码作出了相当好的优化!请参观他的主页)

上一节我们介绍了花指令,不过花指令毕竟是一种很简单的东西,基本上入了门的Cracker都可以对付得了。所以,我们很有必要给自己的软件加上更好的保护。CRC校验就是其中的一种不错的方法。

CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。(哇,真拗口,希望大家不要当我是唐僧,呵呵。^_^)

CRC有什么用呢?它的应用范围很广泛,最常见的就是在网络传输中进行信息的校对。其实我们大可以把它应用到软件保护中去,因为它的计算是非常非常非常严格的。严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。Hoho,是不是很厉害呢?所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被Cracker用16进制工具暴力破解过了。

废话说完了,我们先来看看CRC的原理。
(由于CRC实现起来有一定的难度,所以具体怎样用它来保护文件,留待下一节再讲。)

首先看两个式子:
式一:9 / 3 = 3          (余数 = 0)
式二:(9 + 2 ) / 3 = 3   (余数 = 2)

在小学里我们就知道,除法运算就是将被减数重复地减去除数X次,然后留下余数。
所以上面的两个式子可以用二进制计算为:(什么?你不会二进制计算?我倒~~~)

式一:
1001      --> 9
0011    -   --> 3
---------
0110      --> 6
0011    -   --> 3
---------
0011      --> 3
0011    -   --> 3
---------
0000      --> 0,余数
一共减了3次,所以商是3,而最后一次减出来的结果是0,所以余数为0

式二:
1011      --> 11
0011    -   --> 3
---------
1000      --> 8
0011    -   --> 3
---------
0101      --> 5
0011    -   --> 3
---------
0010      --> 2,余数
一共减了3次,所以商是3,而最后一次减出来的结果是2,所以余数为2

看明白了吧?很好,let’s go on!

二进制减法运算的规则是,如果遇到0-1的情况,那么要从高位借1,就变成了(10+0)-1=1
CRC运算有什么不同呢?让我们看下面的例子:

这次用式子30 / 9,不过请读者注意最后的余数:

11110      --> 30
1001    -    --> 9
---------
1100      --> 12    (很奇怪吧?为什么不是21呢?)
1001   -    --> 9
--------
101      --> 5,余数 --> the CRC!

这个式子的计算过程是不是很奇怪呢?它不是直接减的,而是用XOR的方式来运算(程序员应该都很熟悉XOR吧),最后得到一个余数。

对啦,这个就是CRC的运算方法,明白了吗?CRC的本质是进行XOR运算,运算的过程我们不用管它,因为运算过程对最后的结果没有意义;我们真正感兴趣的只是最终得到的余数,这个余数就是CRC值。

进行一个CRC运算我们需要选择一个除数,这个除数我们叫它为“poly”,宽度W就是最高位的位置,所以我刚才举的例子中的除数9,这个poly 1001的W是3,而不是4,注意最高位总是1。(别问为什么,这个是规定)

如果我们想计算一个位串的CRC码,我们想确定每一个位都被处理过,因此,我们要在目标位串后面加上W个0位。现在让我们根据CRC的规范来改写一下上面的例子:

Poly                  =    1001,宽度W = 3
位串Bitstring         =    11110
Bitstring + W zeroes    =    11110 + 000 = 11110000

11110000
1001||||    -
-------------
1100|||
1001|||    -
------------
1010||
1001||    -
-----------
   0110|
   0000|    -
   ----------
    1100
    1001    -
    ---------
   101      --> 5,余数 --> the CRC!

还有两点重要声明如下:
1、只有当Bitstring的最高位为1,我们才将它与poly进行XOR运算,否则我们只是将Bitstring左移一位。
2、XOR运算的结果就是被操作位串Bitstring与poly的低W位进行XOR运算,因为最高位总为0。

呵呵,是不是有点头晕脑胀的感觉了?看不懂的话,再从头看一遍,其实是很好理解的。(就是一个XOR运算嘛!)


好啦,原理介绍到这里,下面我讲讲具体怎么编程。

由于速度的关系,CRC的实现主要是通过查表法,对于CRC-16和CRC-32,各自有一个现成的表,大家可以直接引入到程序中使用。(由于这两个表太长,在这里不列出来了,请读者自行在网络上查找,很容易找到的。)

如果我们没有这个表怎么办呢?或者你跟我一样,懒得自己输入?不用急,我们可以“自己动手,丰衣足食”。
你可能会说,自己编程来生成这个表,会不会太慢了?其实大可不必担心,因为我们是在汇编代码的级别进行运算的,而这个表只有区区256个双字,根本影响不了速度。

这个表的C语言描述如下:

for (i = 0; i < 256; i++)
{
    crc = i;
    for (j = 0; j < 8; j++)
    {
      if (crc & 1)
            crc = (crc >> 1) ^ 0xEDB88320;
      else
            crc >>= 1;
    }
    crc32tbl = crc;
}

生成表之后,就可以进行运算了。
我们的算法如下:
1、将寄存器向右边移动一个字节。
2、将刚移出的那个字节与我们的字符串中的新字节进行XOR运算,得出一个指向值表table的索引。
3、将索引所指的表值与寄存器做XOR运算。
4、如果数据没有全部处理完,则跳到步骤1。

这个算法的C语言描述如下:

    temp = (oldcrc ^ abyte) & 0x000000FF;
    crc= (( oldcrc >> 8) & 0x00FFFFFF) ^ crc32tbl;
    return crc;

好啦,所有的东东都说完啦,最后献上一个完整的Win32Asm例子,请读者仔细研究吧!
(汇编方面的CRC-32资料极少啊,我个人认为下面给出的是很宝贵的资料。)


;****************************************************
;程序名称:演示CRC32原理
;作者:罗聪
;日期:2002-8-24
;出处:http://laoluoc.yeah.net(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:转载自“老罗的缤纷天地”(http://laoluoc.yeah.net)
;
;特别感谢Win32ASM高手—— dREAMtHEATER 为我的代码作了相当好的优化!
;请各位前去 http://NoteXPad.yeah.net 下载他的小巧的“cool 记事本”—— NoteXPad 来试用!(100% Win32ASM 编写)
;
;****************************************************

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib

WndProc            proto :DWORD, :DWORD, :DWORD, :DWORD
init_crc32table    proto
arraycrc32         proto

.const
IDC_BUTTON_OPEN      equ    3000
IDC_EDIT_INPUT         equ    3001

.data
szDlgName         db    "lc_dialog", 0
szTitle         db    "CRC demo by LC", 0
szTemplate      db    "字符串 ""%s"" 的 CRC32 值是:%X", 0
crc32tbl          dd    256 dup(0)    ;CRC-32 table
szBuffer          db    255 dup(0)

.data?
szText            db    300 dup(?)

.code
main:
    invoke GetModuleHandle, NULL
    invoke DialogBoxParam, eax, offset szDlgName, 0, WndProc, 0
    invoke ExitProcess, eax

WndProc proc uses ebx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

    .if uMsg == WM_CLOSE
      invoke EndDialog, hWnd, 0
      
    .elseif uMsg == WM_COMMAND
      mov eax,wParam
      mov edx,eax
      shr edx,16
      movzx eax, ax
      .if edx == BN_CLICKED
            .IF eax == IDCANCEL
                invoke EndDialog, hWnd, NULL
            .ELSEIF eax == IDC_BUTTON_OPEN || eax == IDOK      
                ;******************************************
                ;关键代码开始:(当当当当……)
                ;******************************************
                ;取得用户输入的字符串:
                invoke GetDlgItemText, hWnd, IDC_EDIT_INPUT, addr szBuffer, 255

                ;初始化crc32table:
                invoke init_crc32table

                ;下面赋值给寄存器ebx,以便进行crc32转换:
                ;EBX是待转换的字符串的首地址:
                lea ebx, szBuffer

                ;进行crc32转换:
                invoke arraycrc32

                ;格式化输出:
                invoke wsprintf, addr szText, addr szTemplate, addr szBuffer, eax

                ;好啦,让我们显示结果:
                invoke MessageBox, hWnd, addr szText, addr szTitle, MB_OK
            .ENDIF
      .endif
    .ELSE
      mov eax,FALSE
      ret
    .ENDIF
    mov eax,TRUE
    ret
WndProc endp

;**********************************************************
;函数功能:生成CRC-32表
;**********************************************************
init_crc32table    proc

      ;如果用C语言来表示,应该如下:
      ;
      ;    for (i = 0; i < 256; i++)
      ;    {
      ;      crc = i;
      ;      for (j = 0; j < 8; j++)
      ;      {
      ;            if (crc & 1)
      ;                crc = (crc >> 1) ^ 0xEDB88320;
      ;            else
      ;                crc >>= 1;
      ;      }
      ;      crc32tbl = crc;
      ;    }
      ;
      ;呵呵,让我们把上面的语句改成assembly的:

      mov   ecx, 256      ; repeat for every DWORD in table
      mov   edx, 0EDB88320h
$BigLoop:
      lea   eax,
      push    ecx
      mov   ecx, 8
$SmallLoop:
      shr   eax, 1
      jnc   @F
      xor   eax, edx
@@:
      dec   ecx
      jne   $SmallLoop
      pop   ecx
      mov   , eax
      dec   ecx
      jne   $BigLoop

      ret
init_crc32table      endp


;**************************************************************
;函数功能:计算CRC-32
;**************************************************************
arraycrc32    proc

      ;计算 CRC-32 ,我采用的是把整个字符串当作一个数组,然后把这个数组的首地址赋值给 EBX,把数组的长度赋值给 ECX,然后循环计算,返回值(计算出来的 CRC-32 值)储存在 EAX 中:
      ;
      ; 参数:
      ;       EBX = address of first byte
      ; 返回值:
      ;       EAX = CRC-32 of the entire array
      ;       EBX = ?
      ;       ECX = 0
      ;       EDX = ?

      mov   eax, -1 ; 先初始化eax
      or      ebx, ebx
      jz      $Done   ; 避免出现空指针
@@:
      mov   dl,
      or      dl, dl
      je      $Done    ;判断是否对字符串扫描完毕
      
      ;这里我用查表法来计算 CRC-32 ,因此非常快速:
      ;因为这是assembly代码,所以不需要给这个过程传递参数,只需要把oldcrc赋值给EAX,以及把byte赋值给DL:
      ;
      ; 在C语言中的形式:
      ;
      ;   temp = (oldcrc ^ abyte) & 0x000000FF;
      ;   crc= (( oldcrc >> 8) & 0x00FFFFFF) ^ crc32tbl;
      ;
      ; 参数:
      ;       EAX = old CRC-32
      ;      DL = a byte
      ; 返回值:
      ;       EAX = new CRC-32
      ;       EDX = ?
               
      xor   dl, al
      movzx   edx, dl
      shr   eax, 8
      xor   eax,
      
      inc   ebx      
      jmp   @B

$Done:
      not   eax
      ret
arraycrc32      endp

end main
;********************    over    ********************
;by LC


下面是它的资源文件:


#include "resource.h"

#define IDC_BUTTON_OPEN    3000
#define IDC_EDIT_INPUT 3001
#define IDC_STATIC -1

LC_DIALOG DIALOGEX 10, 10, 195, 60
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION |
    WS_SYSMENU
CAPTION "lc’s assembly framework"
FONT 9, "宋体", 0, 0, 0x0
BEGIN
    LTEXT         "请输入一个字符串(区分大小写):",IDC_STATIC,11,7,130,10
    EDITTEXT      IDC_EDIT_INPUT,11,20,173,12,ES_AUTOHSCROLL
    DEFPUSHBUTTON   "Ca&lc",IDC_BUTTON_OPEN,71,39,52,15
END


如果你能够完全理解本节的内容,那么请留意我的下一讲,我将具体介绍如何运用CRC-32对你的文件进行保护。(呵呵,好戏在后头……)

老罗
2002-8-26

deletex 发表于 2007-3-21 09:43:34


郑重声明: 本贴涉及的技术部分的所有权,解释权归河北工业大学武金木教授所有.本帖只供大家学习讨论之用,任何单位,组织及个人不得随意转载,修改,发表.违者我们将按照相关法律追究其刑事责任.

下面是正文.

牢不可破的排列码加密方法及其加密器
此方法已经获得发明专利,专利号为:ZL 99 1 07969.8,利用此专利我们已经注册7项软件,登记号分别为:2005SR09926,2005SR09927,2005SR10917,2005SR10918,2005SR12749,2005SR12750,2005SR12751。可在http://waumo.kingjet.cn/ 查看证书扫描件。
排列码具有如下八大特征:
1.加密强度极高 加密强度为(n!)^2╳2^(n*n) ,世界最先进的AES加密强度为2^n, 因此当n=128时,排列码的加密强度比AES高出10的5千多次方倍。当加密强度大于2^512时就可以号称牢不可破,从这点说排列码做到了无论你有多少资源都不可破密,即可号称牢不可破。我们建议凡是购买我们技术的客户都要签定经过公证的合同,如果我们的技术指标不达标,我们可根据中国消费法进行双倍赔偿。若有人能证明排列码的加密强度不大于2^n,我们将发放100万元人民币的奖金给此人,当然一定要签经过公证的合同,不签合同者我们不进行交易。此话的有效期一直到此100万元人民币发出为止!
2.加密速度极快   硬件实现仅几级门电路的延迟,7.5ns内可完成1个分组的加密,而AES当前需要几百ns。
3.实现成本极低 使用少量门电路即可实现。
4.算法极多   算法有(n!)!个,每个分组换一个算法。
5.使用非常灵活 分组长度可以是任意正整数,密钥可以是任意字符型或任意数值型。
6.应用面极广 凡是使用DES和AES的项目都可以使用排列码;
7.应用价值极大 例如:可用于制作加密手机,一只西门子的GSM加密手机售价高达3000美圆,我们制作比他技术指标更高的加密手机,只需增加开发成本,生产成本并不增加多少。目前,我国部队不允许使用手机,就是因为没有加密强度高的加密手机。我们已有可以监控或不可以监控不能窃听的加密手机方案。
8.可以解决目前加密算法不能解决的技术难题 比如DES和AES无法解决的实时图象加密传输,用排列码就可以解决。


人类还没有探索过的密码学新领域

摘要 本文简单介绍了被普遍认为是密码界真理的一些现状,根据我们研制排列码的实践提出了我们的一些新的见解,以供科学界进行验证。

关键字 密码学 分组密码 流密码 排列码 信息论 信息安全



1密码学的现状
1.1 当前对密码的分类
根据密钥的特点,Simmons将密码体制分为对称和非对称密码体制两种。对称密码体制又称单钥或私钥或传统密码体制,非对称密码体制又称双钥或公钥密码体制。在私钥密码体制中,加密密钥和解密密钥是一样的或彼此之间容易相互确定。按加密方式又可将私钥密码体制分为流密码和分组密码两种。在流密码中,将明文消息按字符逐位地加密。在分组密码中,将明文消息分组(每组含有多个字符),逐组地进行加密。在公钥密码体制中,加密密钥和解密密钥不同,从一个难于推出另一个,可将加密能力和解密能力分开。当前对分组密码的概念是模糊的,一个字符是8比特,这是分组密码还是流密码?许多初学者无法区分分组密码和流密码。由此把人们的研究引入到研究分组密码,密钥一定不能改变,因此分析分组密码仅分析一个分组就可以,因为整个文件的加密强度是一个分组的加密强度。而流密码每次加密一个单位(一个单位或一个比特),每个单位的加密强度等于1,流密码的加密强度取决于对密钥流变化规律的隐藏。
1.2 当前对信息空间的认识
由n位2进制数字组成的信息空间的大小是2^n。因为他的真值表是2^n,或者说他的全排列个数2^n。这里忽略了n位2进制数字的位置信息。因此人们研究的信息空间不能越过2^n。一见到超过2^n,不用想就是错的,研究超过2^n的信息空间就好象发明了永动机一样不可思议。
1.3 当前加密方法只能使用一对一的影射
现在所见到的所有的除我们以外所有的书籍和论文,以及文字资料,都认为加密不能有两个以上的明文加密成同一密文,也不能有两个以上的密文解密成同一明文。因为若有两个明文对应同一个密文,那这个密文变成哪个明文无法确定,因此此加密没有实用价值。人们只能在一对一的影射领域内研究问题。
1.4 分组密码的加密强度只能靠增加加密强度来实现。
DES被攻破之后,人们认为只有加大n,才能解决加密强度问题。因此美国推出AES时主要指标之一是n=128,认为n<128是不可靠的。加密强度不能大于2^n。
2.排列码简介
排列码加密方法,让我们获得了中国发明专利,专利号为ZL 99 1 07969.8。
用排列码方法我们注册了7项软件,登记号为2005SR09926、2005SR09927、2005SR10917、2005SR10918、2005SR12749、2005SR12750、2005SR12751 。
2.1 n=4的排列码演示程序设计说明:
①排列码表见表1,这样的表共有24!个。
我们任意地建立其中的256个。
表中第5行4   0   3   1   2表示当Key=4时,明文第0位的2进制数送第0位做密文, 明文第1位的2进制数送第3位做密文, 明文第2位的2进制数送第1位做密文, 明文第3位的2进制数送第2位做密文。
为了节省存储空间,0用2进制数00表示 , 1用2进制数01表示 ,2用2进制数10表示 , 3用2进制数11表示, Key 用存储地址来表示。这样1个排列码表占24个字节。
表1   排列码表
Key   0   1   2   3
0   0   1   2   3
1   1   2   3   0
2   2   3   0   1
3   3   0   1   2
4   0   3   1   2
5   0   3   2   1
……..
23   3   2   1   0

②关于密钥的设计,用1个字节作整数,它表示的范围是0~255。根据他的值就可以确定一个排列码表。
在这个排列码表中,再进行模24运算。得到一个0~23的整数,恰好对应排列码表中的Key值,确定bit的交换顺序。
③关于求非的运算,为了进一步增加破密的难度,我们在交换顺序的同时,在某些交换路径上求反。因为n=4,0点有可能有4个路径,1、2、3点都有可能有4个路径,所以可能的路径总数共有16条,每一bit 对应一条路径,使用16bit或者说2个字节控制哪个路径上是否加非。用0表示不加非,用1表示加非,或者反之。
④综合以上密钥的长度为24bit。
⑤为了进一步增加加密强度,第二个分组的密钥选取,密钥是在原密钥的基础上加上前一个密钥的一定规律的变换,只要加密密钥和解密密钥的规律相同则解密不成问题,但密码分析者虽然可以从程序知道密钥是如何变换的,因它的原始密钥的输入密码分析者是不知道的,因此知道的仅是密钥的一部分;密码设计这每下一个分组再加3个字节的明文,输入都是已知,所以方法可行。密码分析者相当于用未知数求未知数,因此无规律可寻。
⑥这样一来每个分组的密钥都是一个伪随机数。但必定有明文的特征。可是产生的密文随机性特别强。
⑦以上过程连续做多遍,每遍都用不同的24bit的密钥。
⑧为了提高速度,并不是一遍加密结束后再进行下一遍,而是一个分组连续进行多遍加密,这种做法理论上进行4遍,按目前的密码分析水平加密强度可能已经达到2^96,远远超过了DES,几乎是目前破密难度的极限。 因为加密强度是关于n的函数,f(n)的常数为1。所以当n稍微大一点的时候, 函数的值都相当大,可以说是2的n次方的高阶无穷大。如果n=4你都不能破密,那想破密n=64还不是天方夜谈。
这里我们给出的是查表法;实际上128! 排列码表无法用查表法实现,但是可以用计算法实现。使用计算法n可以是任意的正整数。
2.2   n=3的排列码的一些结果
因为加密强度是关于n的函数,为了读者体会加密强度,验证较小的n,比验证较大的n要容易的多,所以我们给出n=3时,密钥是16进制的000000时,排列码程序仅仅对每个字节的最低3位进行运算的结果。为了是感兴趣的人能验证我们的数据,产生此结果的程序我们交给了杂志社。下面是说明问题的数据。

明文是:00000000000000000000000000000000000000000000000000000000000000000
密文是:76226620234204620644100540021061241605034252250014020562154521061

密文是:0000000000000000000000000000000000000000000000000000000000000000
明文是:7746711631743661714140713076565005510653223736345310704360555105

明文是:0123456701234567012345670123456701234567012345670123456701234567
密文是:7622662023420462064410054002106124160503425225001402056215452106

密文是:0123456701234567012345670123456701234567012345670123456701234567
明文是:7315214301652164722246106370602715370027570327745411544336777216
3.我们的新发现
3.1 分组流密码
对于分组密码,我们见到的资料基本上都只强调分组(每组含有多个字符),逐组地进行加密,有的明确指出了用同一个密钥进行加密。而排列码每个分组都更换密钥,按这个原则应该属于流密码;但是我们见到的所有流密码都是可以很容易从明文、密文对推出密钥,不存在同一明文、密文对有多个密钥对应的情况,因此研究流密码都引导到研究伪随机函数发生器的轨道上来了。检测流密码的加密强度就是检测伪随机函数的随机特性。如果随机特性不好就很容易破密;排列码根据分组密码多对多的路径概念设计出来,分析每个分组只能分析出密钥的几个比特,而下一个分组需要用分组密码的分析法重新分析,不能使用流密码的分析方法。所以排列码是以往分类中没有包括的分组流密码,因此人类史上没有研究过。
3.2 信息的下标是客观存在的
对于信息00000000000000…………0B,人们一直见到的就是一串0,因此才得出1.2节 当前对信息空间的认识。而客观世界可以把这一串0分成j个分组,每个分组有
个比特。这才是客观世界的真实表示。也就是每个比特的0都可以带上两个下标,一个下标表示在组内它是第几比特,另一个下标则表示它是第几个分组。这才是分组密码的完整客观的表示。
3.3 多对多的路径解决了一对一的影射不能解决的问题
鉴于当前对于一串0不带下标,只能导出现在的一对一的影射,加密强度也就不可能跨越2^n,但是有了2.2对客观世界的描述,比如有0000,都给他们带上下标他们的全排列个数就是24,而不是1了。而2.1编程方法就是可以理解的了,带下标的4个0交换位置后是不同的表示,交换后做密文,我们可以把再在交换回来,我们可以用Key那个整数记录怎么交换的,这个交换的过程我们称做路径。有了2.2的表示我们就可以把0~7变成0,而且能把0再变回0~7,解决了1.3人们用一对一的影射不能解决的问题。由2.2的①可见明文0可以加密成密文0~7,密文0~7都可以解密成0,由2.2的②可见明文0~7都可以加密成密文0,密文0可以解密成明文0~7。
3.4 排列码使差分分析法失效
因为差分分析法是针对一对一的影射设计的,现在每一个明文密文对有多个密钥,差分分析法忽略了下标这个信息,只能分析出多个密钥中的一个密钥的一部分信息对得到整个密钥的信息没有帮助,因此排列码使差分分析法失效。
3.5 排列码使线性分析法失效
同样道理,因为线性分析法是针对一对一的影射设计的,现在每一个明文密文对有多个密钥,线性分析法忽略了下标这个信息,只能分析出多个密钥中的一个密钥的一部分信息对得到整个密钥的信息没有帮助,因此排列码使线性分析法失效。
3.6 排列码使字典分析法失效
由2.2①可见明文0~7都可以加密成0,由2.2②可见密文0~7都可以解密成0。0~7即可以变成0,也可以变所有的8个值,没有密钥配合,明文密文就没有对应关系,因此即使有无限的资源排列码也使字典分析法失效。
3.7 排列码使流密码分析法失效
我们给出的编程方法并没有使用真正的伪随机数,密钥的变化规律全部公开对排列码破解没有任何帮助,而流密码的分析方法都是检测伪随机数的随机特性的,因此排列码和流密码是毫不相干的事。
3.8 排列码使唯密文攻击失效
一串密文0可以由2^96个密钥确定2^96个不同的明文,和密文0的个数无关,仅和密钥有关,因此排列码使唯密文攻击失效。 同样一串1,一串2都可以是密文。
3.9 排列码使已知明文攻击失效
之所以有已知明文攻击,那是现实中很容易找到已知明文攻击事例,但是对于排列码就不存在了。比如2.2③明文给出了8遍,明密文对给出的信息仍然使你很难攻击。
3.10 排列码使Kerckhoffs原则必须修改
  因为排列码每个分组都要换一个算法,不同的分组使用不同的算法,使用的算法和密钥相关。而且算法有(n!)!个。当n>6的时候,算法的个数就已经超过了2的500次方,任何人是不可能依靠弄明白这么多算法来提高密码分析的能力的。因此Kerckhoffs原则必须修改,它原来仅仅对密码设计者提出密码的安全性不能建立在密码算法的保密上。但另一方面密码分析者分析密码也不能建立在对密码算法的公开上。
3.11 排列码可以在很小的n的情况下获得牢不可破的密码
就对称密码体制来说,我们几乎永远不会用到比512比特更长的密钥,这是因为:即使假设宇宙中每个原子(约有2^300个)都是计算机,并且均可每秒搜索2^100个密钥,要搜索512比特也需10^51年,根据宇宙大爆炸理论,宇宙诞生至今也不超过10^10年。而排列码当n=22时,密钥的长度就远远超过了512比特。况且我们如果用换算法做密钥,(5!)!就已经远远大于2^512。也就是说n=5的时候,排列码就可以做成牢不可破。n小了的好处是容易提高加密速度,且使用很少的逻辑元件就可以实现。比如n=4的排列码加密芯片,加密每个分组仅仅7ns。
3结论
任何信息都可以用2进制信息来表示,2进制信息总是按一定顺序出现才有意义,有一定顺序的2进制信息,用两个下表来表示它的顺序,不考虑下表的信息量仅仅是有下标信息量的沧海之一滴。目前的密码学仅仅研究和探索了不考虑下标的信息空间,若进入带下标的信息空间,那么密码学的许多概念需要改变,密码编码学可以使加密强度更高,加密速度更快,加密更简洁,密码分析法需要更新,相关的新的数学领域需要建立。
参考文献
Simmons,G.J.,Symmetric and Asymmetric Encryption Computing Surveys, Vol.11, No.4, Dec.1979, 305-330.
冯登国,裴定一.密码学导引.北京:科学出版社,1999. 292.
武金木,武优西.建立分组密码加密技术的新概念.河北工业大学学报,2000,(1):78-81.
武金木,武优西.排列码加密解密方法及其排列码加密解密器中国发明专利, CN99107969.8,2003,3.
张焕国,刘玉珍.密码学引论..武汉大学出版社,2003.11.
武优西,武金木,洪流涛等.分组密码加密解密的方法及其加密解密器,中国发明专利, CN200510013807.X,2005,11.
黄月江,龚奇敏.信息安全与保密――现代战争的信息卫士.国防工业出版社,1999.19.
胡向东,魏琴芳.应用密码学教程.电子工业出版社,2005,61

[ 本帖最后由 deletex 于 2007-3-21 09:46 编辑 ]

iiiisini 发表于 2007-3-21 13:05:08

/:01 象我这样的看见数学就头痛的人就是要努力学习了啊!谢谢你的分享!

yutian51352 发表于 2007-3-25 15:38:04

学习中,谢谢分享

dangdang 发表于 2007-3-26 19:21:03

比较复杂,不过要好好学学,有用。

fyxt2033 发表于 2007-4-2 20:37:47

很复杂啊,但非常好,先收藏,以后待水平提高之后再学习
页: 1 [2]
查看完整版本: 加密算法