关于DES算法的问题(200分)

  • 主题发起人 主题发起人 avant
  • 开始时间 开始时间
A

avant

Unregistered / Unconfirmed
GUEST, unregistred user!
找到相关资料(节录):
; ; 本世纪五十年代以来,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼 (Tuchman)
和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的“多重加密有效性理论”创立的,后于1977年由美国国家标准局颁
布的数据加密标准DES。 ; ;
; ; DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密
又可用于解密。
; ; 作为区组密码,DES的加密单位仅有64位二进制,这对于数据传输来说太小,因为每个区组仅含8个字符,而且其中某些位
还要用于奇偶校验或其他通讯开销。
; ; 密钥仅有56位二进制未免太短,各次迭代中使用的密钥K(i)是递推产生的,这种相关必降低了密码体制的安全性。目前,
有人认为:在现有的技术条件下用穷举法寻找正确密钥已趋于可行,所以若要安全保护10年以上的数据最好不用DES算法。
; ; 实现替代函数Si所用的S盒的设计原理尚未公开,其中可能留有隐患。更有人担心DES算法中有“陷阱”,知道秘密的人可
以很容易地进行密文解密。
; ; 针对以上DES的缺陷,人们提出了解几种增强DES安全性的方法,主要有以下三种:三重DES算法;具有独立子密钥的DES算法;
带用交换S盒的DES算法.

; ; 还有算法步骤,原理,偶都看不懂,不说了.有几点疑问要请教.
问题如下:
; ; 1.区组密码是什么意思?
; ; 2.说DES算法不可逆是什么意思?
; ; 3.DES加密后,密文的长度和明文,密钥有什么关系?
; ; 4.DES有很多种实现吗? 就标准DES实现来说,是不是明文,密钥一定,得到的密文也一定?我用了几个控件/函数库,得到的密
文不一样.
; ; 5.密钥的取值范围是什么?任意字符串?受限字符串(0..9,a..f)?Int64?
; ; 想起来了再问,请大家给俺答疑,有比较新的Delphi实现不妨告诉我地址(老的大部分我都有了).
; ; 谢谢!
 
请参考:
;
; http://www.delphibbs.com/delphibbs/dispq.asp?lid=352154

; http://www.delphibbs.com/delphibbs/dispq.asp?lid=260998

; http://www.delphibbs.com/delphibbs/dispq.asp?lid=249754

; http://www.delphibbs.com/delphibbs/dispq.asp?lid=264888

; http://www.delphibbs.com/delphibbs/dispq.asp?lid=136238

呵呵、
 
伙计,俺也会搜索,都看过的.
我希望得到问题的针对性回答[:D]
 
1、DES的密码是分组的,八位一组,共八组,各自循环。
2、虽然DES的加密解密用的是同一组密码,但算法是不同的。不可逆是指这个意思吧。
3、密文长度与明文一样,不足8字节的补齐
4、标准DES的算法只有一种,明文、密钥一致,结果也应该一致,除非SBOX不同。
5、由于密码是作2进制使用,因此没限制。
 
谢谢zc!非常感谢.习习,别怪我太贪,继续请教如下:
>>8位一组,共8组
; ; 那怎么又说56位密钥的呢?
>>同一组密码,算法不同
; ; 可我看到资料说, 算法一样,只是逆用.
>>标准DES算法只一种,明文,密钥一致,结果一致
; ; 我也这样想,毕竟算法说明中有算法公开,加密强度不依赖于算法,只依赖于密钥,有没有标准的算法
测试用例给做个参考?即:
; ; 明文:12345678 密钥:abcdefgh 密文:XXXXXXXX
这样的?我down了几个不同的类/函数库,结果都不一样[:(]
>>密码是作二进制使用的
; ; 希望能详细点儿。其实我用的几个不同的类/函数库,我猜测很有可能算法都一样,只是密钥这个参数的
处理不同导致结果的不同。有的是传入任意字符串(可能作了转换);有的传入0..9,a..f这样的字符串,有
的只允许传入64位整数,不知道最终作了什么转化以后再使用的?

希望大虾能继续不吝赐教,再次谢谢!
 
1.区组密码是什么意思?
; 将明文分为若干个等长的数据块,对每个数据块执行相同的加密算法。

2.“不可逆”
; 谁说DES不可逆?——“它的算法是对称的,既可用于加密又可用于解密”,何来“不可逆”之说??
RSA是不可逆的。(其实可以解密的原则上都应该被称为“可逆的”,只有Hash算法才是真正的不可逆!)

3.DES加密后,密文的长度和明文,密钥有什么关系
; 明文和密文的长度相等,且都应该是8Byte(64bit)的整数倍。

5.密钥的取值范围是什么?
; 密钥的实际长度为64Bit,但由于最后8Bit作为校验位,只有前56bit是真正有效的,因此,密钥的可能个数
为2^56个。

>>0..9,a..f这样的字符串
; 这是16进制数,很容易将其转化为整数。

; DES从64bit秘钥中每次取出32Bit,通过S盒生成48Bit,用于加密过程。
; 因为采用实际上只有56Bit的密钥加密64Bit的数据块,有人已经证明,对同一个明文使用不同
密钥加密后,可以得到相同的密文!
 
谢谢creation-zy![:)]
现在从教科书里找到了一个测试用例,不知道谁的算法实现能吻合[?]
; ; ; ; 明文:computer ; ; ; ; ;($63 6f 6d 70 75 74 65 72)
; ; ; ; 密钥:program ; ; ; ; ; ($70 72 6f 67 72 61 6d 00)
; ; ; ; 密文:X華竔?3 ; ; ; ; ;($58 c8 41 b8 69 fe ae 33)
我一一试过,都不对呀,有的密文长度居然是明文的2倍,怎么回事[?]
 
我这有标准的des加密原理。介绍如何加密
你要么?可以自己设计函数库。
也有c语言实现的标准源代码
 
我要!sabrina_xa@263.net
谢谢
 
ahhliang@yeah.net急需一份。老兄。。。感激的话留到我受到的时候
 
转贴一段DES算法源码:

Source for doing DES encryption/decryption .

This procedure uses 4 parameters :

Input ;: 8 byte (64 bit) input
Output : 8 byte (64 bit) output from DES algorithm
Key ; ;: 8 byte (64 bit) key for DES algorithm
Encrypt : True to encrypt, False to decrypt

The procedure uses typeless parameters so you can use variables of
any type for Input, Output and the Key, as long as they are 8 bytes
long (or more).
}
unit Desunit;

interface



;Procedure DES (Var Input; Var Output; Var Key; Encrypt : Boolean);

;implementation

Procedure DES (Var Input; Var Output; Var Key; Encrypt : Boolean);

Const
; IP : Array [1..64] Of Byte = (58,50,42,34,26,18,10,2,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 60,52,44,36,28,20,12,4,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 62,54,46,38,30,22,14,6,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 64,56,48,40,32,24,16,8,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 57,49,41,33,25,17, 9,1,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 59,51,43,35,27,19,11,3,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 61,53,45,37,29,21,13,5,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 63,55,47,39,31,23,15,7);
; InvIP : Array [1..64] Of Byte = (40, 8,48,16,56,24,64,32,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;39, 7,47,15,55,23,63,31,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;38, 6,46,14,54,22,62,30,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;37, 5,45,13,53,21,61,29,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;36, 4,44,12,52,20,60,28,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;35, 3,43,11,51,19,59,27,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;34, 2,42,10,50,18,58,26,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;33, 1,41, 9,49,17,57,25);
; E : Array [1..48] Of Byte = (32, 1, 2, 3, 4, 5,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 4, 5, 6, 7, 8, 9,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 8, 9,10,11,12,13,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;12,13,14,15,16,17,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;16,17,18,19,20,21,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;20,21,22,23,24,25,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;24,25,26,27,28,29,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;28,29,30,31,32, 1);
; P : Array [1..32] Of Byte = (16, 7,20,21,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;29,12,28,17,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 1,15,23,26,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 5,18,31,10,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 2, 8,24,14,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;32,27, 3, 9,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;19,13,30, 6,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;22,11, 4,25);
; SBoxes : Array [1..8,0..3,0..15] Of Byte =
; ; ; ; ; ;(((14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7),
; ; ; ; ; ; ;( 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8),
; ; ; ; ; ; ;( 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0),
; ; ; ; ; ; ;(15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13)),

; ; ; ; ; ; ((15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10),
; ; ; ; ; ; ;( 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5),
; ; ; ; ; ; ;( 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15),
; ; ; ; ; ; ;(13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9)),

; ; ; ; ; ; ((10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8),
; ; ; ; ; ; ;(13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1),
; ; ; ; ; ; ;(13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7),
; ; ; ; ; ; ;( 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12)),

; ; ; ; ; ; (( 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15),
; ; ; ; ; ; ;(13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9),
; ; ; ; ; ; ;(10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4),
; ; ; ; ; ; ;( 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14)),

; ; ; ; ; ; (( 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9),
; ; ; ; ; ; ;(14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6),
; ; ; ; ; ; ;( 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14),
; ; ; ; ; ; ;(11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3)),

; ; ; ; ; ; ((12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11),
; ; ; ; ; ; ;(10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8),
; ; ; ; ; ; ;( 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6),
; ; ; ; ; ; ;( 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13)),

; ; ; ; ; ; (( 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1),
; ; ; ; ; ; ;(13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6),
; ; ; ; ; ; ;( 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2),
; ; ; ; ; ; ;( 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12)),

; ; ; ; ; ; ((13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7),
; ; ; ; ; ; ;( 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2),
; ; ; ; ; ; ;( 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8),
; ; ; ; ; ; ;( 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11)));

; PC_1 : Array [1..56] Of Byte = (57,49,41,33,25,17, 9,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;1,58,50,42,34,26,18,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 10, 2,59,51,43,35,27,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 19,11, 3,60,52,44,36,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 63,55,47,39,31,23,15,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;7,62,54,46,38,30,22,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 14, 6,61,53,45,37,29,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 21,13, 5,28,20,12, 4);

; PC_2 : Array [1..48] Of Byte = (14,17,11,24, 1, 5,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;3,28,15, 6,21,10,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 23,19,12, 4,26, 8,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 16, 7,27,20,13, 2,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 41,52,31,37,47,55,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 30,40,51,45,33,48,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 44,49,39,56,34,53,
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 46,42,50,36,29,32);

; ShiftTable : Array [1..16] Of Byte = (1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1);

Var
; InputValue : Array [1..64] Of Byte;
; OutputValue : Array [1..64] Of Byte;
; RoundKeys : Array [1..16,1..48] Of Byte;
; L, R, FunctionResult : Array [1..32] Of Byte;
; C, D : Array [1..28] Of Byte;

Function GetBit (Var Data; Index : Byte) : Byte;

Var
; Bits : Array [0..7] Of Byte ABSOLUTE Data;

Begin
; Dec (Index);
; If Bits[Index DIV 8] And (128 SHR (Index MOD 8))>0 then GetBit:=1 Else GetBit:=0;
End;{GetBit}

Procedure SetBit (Var Data; Index, Value : Byte);

Var
; Bits : Array [0..7] Of Byte ABSOLUTE Data;
; Bit : Byte;

Begin
; Dec (Index);
; Bit:=128 SHR (Index MOD 8);
; Case Value Of
; ; 0 : Bits[Index DIV 8]:=Bits[Index DIV 8] And (Not Bit);
; ; 1 : Bits[Index DIV 8]:=Bits[Index DIV 8] Or Bit;
; End;
End;{SetBit}

Procedure F (Var FR, FK, Output);

Var
; R : Array [1..48] Of Byte ABSOLUTE FR;
; K : Array [1..48] Of Byte ABSOLUTE FK;
; Temp1 : Array [1..48] Of Byte;
; Temp2 : Array [1..32] Of Byte;
; n, h, i, j, Row, Column : Integer;
; TotalOut : Array [1..32] Of Byte ABSOLUTE Output;

Begin
; For n:=1 to 48 Do Temp1[n]:=R[E[n]] Xor K[n];
; For n:=1 to 8 Do Begin
; ; i:=(n-1)*6;
; ; j:=(n-1)*4;
; ; Row:=Temp1[i+1]*2+Temp1[i+6];
; ; Column:=Temp1[i+2]*8 + Temp1[i+3]*4 + Temp1[i+4]*2 + Temp1[i+5];
; ; For h:=1 to 4 Do Begin
; ; ; Case h Of
; ; ; ; 1 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 8) DIV 8;
; ; ; ; 2 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 4) DIV 4;
; ; ; ; 3 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 2) DIV 2;
; ; ; ; 4 : Temp2[j+h]:=(SBoxes[n,Row,Column] And 1);
; ; ; End;
; ; End;
; End;
; For n:=1 to 32 Do TotalOut[n]:=Temp2[P[n]];
End;{F}

Procedure Shift (Var SubKeyPart);

Var
; SKP : Array [1..28] Of Byte ABSOLUTE SubKeyPart;
; n, b : Byte;

Begin
; b:=SKP[1];
; For n:=1 to 27 Do SKP[n]:=SKP[n+1];
; SKP[28]:=b;
End;{Shift}

Procedure SubKey (Round : Byte; Var SubKey);

Var
; SK : Array [1..48] Of Byte ABSOLUTE SubKey;
; n, b : Byte;

Begin
; For n:=1 to ShiftTable[Round] Do Begin
; ; Shift (C);
; ; Shift (D);
; End;
; For n:=1 to 48 Do Begin
; ; b:=PC_2[n];
; ; If b<=28 then SK[n]:=C Else SK[n]:=D[b-28];
; End;
End;{SubKey}

Var
; n, i, b, Round : Byte;
; Outputje : Array [1..64] Of Byte;
; K : Array [1..48] Of Byte;
; fi : Text;

Begin
; For n:=1 to 64 Do InputValue[n]:=GetBit (Input,n);
; For n:=1 to 28 Do Begin
; ; C[n]:=GetBit(Key,PC_1[n]);
; ; D[n]:=GetBit(Key,PC_1[n+28]);
; End;
; For n:=1 to 16 Do SubKey (n,RoundKeys[n]);
; For n:=1 to 64 Do If n<=32 then L[n]:=InputValue[IP[n]] Else R[n-32]:=InputValue[IP[n]];
; For Round:=1 to 16 Do Begin
; ; If Encrypt then
; ; ; F (R,RoundKeys[Round],FunctionResult)
; ; Else
; ; ; F (R,RoundKeys[17-Round],FunctionResult);
; ; For n:=1 to 32 Do FunctionResult[n]:=FunctionResult[n] Xor L[n];
; ; L:=R;
; ; R:=FunctionResult;
; End;
; For n:=1 to 64 Do Begin
; ; b:=InvIP[n];
; ; If b<=32 then OutputValue[n]:=R Else OutputValue[n]:=L[b-32];
; End;
; For n:=1 to 64 Do SetBit (Output,n,OutputValue[n]);
End;

end.
 
YB_unique: 我试乐一下,怎么搞的Encrypt为True加的密,为False都解不对[:(]
标准的算法应该是加密结果完全一样的,是不是[:I]
大家继续帮我呀!
 
兄弟们,继续呀!
 
请大家继续帮忙呀!
 
新问题:
; ; 我看到资料,Des算法还有各种mode,比如ECB,CBC,CTS,CFB,OFB等等,结果好像都不一样的呀!
; ; 谁给讲解讲解?
 
YB_unique 的算法行不通.
 
往前刷,大家敬业点嘛!贴点有用的东西[:D]
 
在刷一次,没人理就结束[:(]
 
后退
顶部