2004年05月


今天发现机器非常慢,看了看进程列表,出现了wintoolsA.exe,wintoolsS.exe,停止wintoolsA.exe后马上会自动启动wintoolsA.exe。非常可疑,查了一下,果然是一个spyware。

该程序在Run列表中有若干项,删除很容易。

然后发现该程序不仅安装为系统服务,还安装为了系统设备,而且在regedit中无法删除

看来Spyware又进入了一个新的层次。

以下是一个简单的去除方法:

Start > Run > 输入 services.msc

在系统服务列表中寻找 WinTools for IE service,将其停止并禁用

然后删除这个目录:C:\Program Files\Common Files\WinTools

还有在你的个人Temp目录中也会有一份拷贝,最好也删除之




http://www.dangdang.com/product_detail/product_detail.asp?product_id=7397645

最近国内出了一本加密与解密(第二版), 非常畅销 。对软件保护与破解感兴趣的人越来越多了,这表明我们计算机应用水平的提高。

但是个人觉得以破解为单纯目的的Hack应该适可而止,把心思放在如何建设上应该是正确的途径。

 

 




变化是人生中永恒的主题。所以在软件的生命期中,需求的变化是不可避免的。有经验的设计人员经验能够预计到大部分可能的变化,并事先做好准备。而有些变化则是无法预见到的(如果你能够预见到所有的变化,你就不会读这篇文章了)。所以在软件写作中注意保持软件框架的柔韧是非常重要的,柔性框架能够让你在软件维护的过程中节省大量的时间和精力。

Design Patterns 和 Refactoring 都是与柔性框架相关的书(Design Patterns是柔性设计、Refactoring是柔化已有的设计),强烈建议大家读读。

框架的柔韧程度可以从以下几个方面来衡量

1、低耦合,高内聚。

2、开放、可扩展。

3、针对需求变化修改的难易度

 

 




有一个非常简单的方法提高Internet Explorer的安全性:

在Internet Explorer窗口中,Tools->Internet Option,在Secuity页面中将Internet的安全性设置为“High”,将Trusted Sites的安全性设置为“Medium”。

这样设置以后,对不在“Trusted Sites”列表中的网站,IE将使用高安全模式访问,这就意味着许多恶意的ActiveX代码无法运行了。

使用这一方法的唯一缺点是你需要将经常某些站点放置在“Trusted Sites”列表中,否则这些站点无法正常显示,不过考虑到大家平时经常访问的网站数量不多,添加这些网站并不是一件困难的事情。

 




自从我在Donews Blog上面发布了关于lsass.exe问题的文章后,我页面的访问量大增

根据统计,至少有一半的访问是来自于Google和baidu的关于lsass.exe的搜索。

看来不少计算机用户被SASSER病毒折腾得不轻啊。

 

 




近期Donews系统出过一次问题,所有的Blog都无法访问了。

后来网站恢复运,文章也没有丢失,这是一件好事情,Donews的备份工作做得不错!

不过有一个小问题,所有文章的分类都丢失了。

所以现在大家到我的分类中看不到任何文章。

 

 




 

 

IDEA(International Data Encryption Algorithm)是瑞士的James MasseyXuejia  Lai等人提出的加密算法,在密码学中属于数据块加密算法(Block Cipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。

早在1990年,Xuejia  Lai等人在EuroCrypt90年会上提出了分组密码建议PES(Proposed Encryption Standard)。在EuroCrypt91年会上, Xuejia  Lai等人又提出了PES的修正版IPES(Improved PES)。目前IPES已经商品化,并改名为IDEAIDEA已由瑞士的Ascom公司注册专利,以商业目的使用IDEA算法必须向该公司申请许可。

IDEA是一种由8个相似圈(Round)和一个输出变换(Output Transformation)组成的迭代算法。IDEA的每个圈都由三种函数:模(216+1)乘法、模216加法和按位XOR组成。

在加密之前,IDEA通过密钥扩展(Key Expansion)128bit的密钥扩展为52Byte的加密密钥EK(Encryption Key),然后由EK计算出解密密钥DK(Decryption Key)EKDK分为8组半密钥,每组长度为6Byte,前8组密钥用于8圈加密,最后半组密钥(4Byte)用于输出变换。IDEA的加密过程和解密过程是一样的,只不过使用不同的密钥(加密时用EK,解密时用DK)

密钥扩展的过程如下:

1.                        128bit的密钥作为EK的前8byte

2.                        将前8byte循环左移25bit,得到下一8byte,将这个过程循环7次;

3.                        在第7次循环时,取前4byte作为EK的最后4byte

4.                        至此52byteEK生成完毕。

密钥扩展的过程如表1所示,为了能够清楚的看出每个8Byte的关系,在表1中用粗线条将将每个8Byte划分开了。

 

r

K1

K2

K3

K4

K5

K6

1

0-15

16-31

32-47

48-63

64-79

80-95

2

96-111

112-127

25-40

41-56

57-72

73-88

3

89-104

105-120

121-8

9-24

50-65

66-81

4

82-97

98-113

114-1

2-17

18-33

34-49

5

75-90

91-106

107-122

123-10

11-26

27-42

6

43-58

59-74

100-115

116-3

4-19

20-35

7

36-51

52-67

68-83

84-99

125-12

13-28

8

29-44

45-60

61-76

77-92

93-108

109-124

9

22-37

38-53

54-69

70-85

-

-

1 IDEA的密钥扩展过程

 

解密密钥EK和加密密钥DK的关系如表2所示:

 

Round r

DK1(r)

DK2(r)

DK3(r)

DK4(r)

DK5(r)

DK6(r)

R = 1

(EK1(10-r))-1

-EK2(10-r)

-EK3(10-r)

(EK4(10-r))-1

EK5(9-r)

EK6(9-r)

2R8

(EK1(10-r))-1

-EK3(10-r)

-EK2(10-r)

(EK4(10-r))-1

EK5(9-r)

EK6(9-r)

R=9

(EK1(10-r))-1

-EK2(10-r)

-EK3(10-r)

(EK4(10-r))-1

 

 

2 加密密钥和解密密钥的关系

其中: -A = 0x10001-A(A-1*A) mod 0x10001 =1

 


IDEA算法如图1所示。

1 IDEA算法

 

IDEA算法相对来说是一个比较新的算法,其安全性研究也在不断进行之中。在IDEA算法公布后不久,就有学者指出:IDEA的密钥扩展算法存在缺陷,导致在IDEA算法中存在大量弱密钥类,但这个弱点通过简单的修改密钥扩展算法(加入异或算子)即可克服。在1997年的EuroCrypt97年会上,John Borst等人提出了对圈数减少的IDEA的两种攻击算法:对3.5IDEA的截短差分攻击(Truncate Diffrential Attack)和对3IDEA的差分线性攻击(Diffrential Linear Attack)。但作者也同时指出,这两种攻击算法对整8.5圈的IDEA算法不可能取得实质性的攻击效果。目前尚未出现新的攻击算法,一般认为攻击整8.5IDEA算法唯一有效的方法是穷尽搜索128bit的密钥空间。

目前IDEA在工程中已有大量应用实例,PGP(Pretty Good Privacy)就使用IDEA作为其分组加密算法;安全套接字层SSLSecure Socket Layer)也将IDEA包含在其加密算法库SSLRef中;IDEA算法专利的所有者Ascom公司也推出了一系列基于IDEA算法的安全产品,包括:基于IDEAExchange安全插件、IDEA加密芯片、IDEA加密软件包等。IDEA算法的应用和研究正在不断走向成熟。


=================================

# 回复:IDEA加密算法简介
为什么加密的时候乘法运算模是2^16+1,而加法的时候是2^16?


对More的回复:

这是算法设计。
涉及到很多数学的知识,我也不是很了解。
不过大体来说,算法就是为了使加密后的结果随机化。
也就是说,秘文和明文的相关性最小,我觉得这两个运算你可以用别的数学式代替,不过安全性如何就要另外研究了。



 

(也很老了)

在开发数据库软件的过程中,由于实际需求会不断发生变化,数据库结构也将随之改变,这会给文档更新工作带来很大困难。如果能够用软件自动获得数据库的结构信息并生成报告文件,将大大减轻软件的文档工作量。本文介绍了在Delphi中访问数据库结构的方法,希望对各位程序员有所帮助。

 

1.TSession对象

为了管理应用程序与数据库系统的多重连接,Delphi提供了TSession对象。Delphi中的数据访问对象(Data Access Object)均包含Session属性,用来指向与之对应的TSession对象。如果应用程序需要同时建立对数据库系统(尤其是BDE数据库)的多个连接,就必须定义多个TSession对象,属于不同连接的数据访问对象的Session属性不能相同,否则将无法同时使用。

在数据库应用程序运行时,Delphi会自动生成一个缺省TSession对象,名字为Session,数据访问对象在缺省情况下均与之相连。

TSession对象除了自动管理数据库连接外,还能够取得数据库信息。下面就分别介绍这方面的函数。

 

2.获取数据库别名(Alias)信息

TSession对象在获取数据库别名方面有3个函数/过程:

procedure TSession.GetAliasNames(List: TStrings);

procedure TSession.GetAliasParams(const AliasName: string; List: TStrings);

function TSession.GetAliasDriverName(const AliasName: string): string;

 

GetAliasNames用来获得所有的BDE别名名称,结果保存在变量List中;GetAliasParams用来获得某个BDE别名的参数,结果保存在变量List中;GetAliasDriverName用来取得某个BDE别名使用的数据库驱动程序的名字。这3个函数不太复杂,就不多加介绍了。一般情况下,我们只需要使用GetAliasNames即可。

 

3.获取数据表(Table)信息

在知道了数据库别名后,如何取出该别名对应数据库中包含的数据表呢?可以使用TSession对象中的 GetTableNames过程。该过程描述如下:

procedure TSession.GetTableNames(const DatabaseName, Pattern: string;

          Extensions,SystemTables: Boolean; List: TStrings);

各参数意义如下:

DatabaseName:数据库别名;

Pattern:过滤器,用来过滤结果,可以使用通配符。比如“*.dbf,t*” 等。如果为空字符串,则表示不需要过滤;

Extensions:为布尔量,表示是否显示数据表扩展名。该参数只对DBFParadox数据库有效;

SystemTables:为布尔量,表示是否显示系统数据表;

List:为返回结果,结果按字母顺序排序。

 

4.获取数据域(Field)和索引(Index)信息

在取得了数据表信息后,应使用TTable对象访问该数据表的具体信息。对应函数如下:

procedure TDataSet.GetFieldNames(List: TStrings);

procedure TTable.GetIndexNames(List: TStrings);

GetFieldNames用来取得数据表中的各个域名,GetIndexNames用来取得数据表中的各个索引名。

另外,可以进一步使用TDatasetTTable中的两个属性TDataSet.FieldDefs.Items[] TTable.IndexDefs.Items[]来访问具体的数据域信息和索引信息。它们分别是由TFieldDefTIndexDef组成的数组。

 

TFieldDef描述如下:

属性名称

类型

说明

DataType

TfieldType

域的数据类型

FieldNo

Integer

域的序号

InternalCalcField

Boolean

是否为自动计算域

Name

string

域名

Precision

Integer

(对于数字类型)数据精度(位数)

Required

Boolean

是否为非空域

Size

Integer

域的大小

 

TIndexDef描述如下:

属性名称

类型

说明

Expression

String

索引表达式,只对DBF

Expression索引有效

Fields

String

组成该索引的域,各个域由

分号“;”分隔

Name

String

索引的名字

Options

TIndexOptions

索引的类型

Source

String

若使用*.MDX索引文件,为该文件名

 

TFieldType定义如下:

TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean,

  ftFloat,ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes,

  ftAutoInc,ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle,

  ftTypedBinary,ftCursor);

 

TIndexOptions定义如下:

TIndexOptions = set of (ixPrimary, ixUnique, ixDescending, ixExpression,

  ixCaseInsensitive);

 

它们的具体意义可以参见Delphi帮助。

 

5.使用实例

使用下面的程序片段即可获得指定数据库中指定表的域定义和索引定义。ListBox1ListBox2 ListBox3 Form中定义的三个列表框,用于显示结果。

 

Var  Alias,TableName:String;

     Table1:TTable;

Begin

Alias:='fjs';  TableName:='d*';    //初始化

Session.GetTableNames(Alias,     { 别名 }

                      TableName, { 过滤器 }

                      True,      { 是否显示文件扩展名(DBF) }

                      False,     { 是否显示系统表 }

                      ListBox1.Items);

If ListBox1.Items.Count=0 then Begin

  MessageDlg('数据库'+Alias+'中没有数据表'+TableName, mtError, [mbOK], 0 );

  Exit;

End;

Table1:=TTable.Create(nil);

Table1.DatabaseName :=Alias;

Table1.TableName := ListBox1.Items.Strings[0];

{ 取得表中字段名及索引名 }

Table1.Open;

if Table1.Active then

begin

   Table1.GetFieldNames(ListBox2.Items);

   Table1.GetIndexNames(ListBox3.Items);

end;