2005年03月18日
http://www.atlassian.com/software/jira/tour/

第7-1步:信息板

登陆到JIRA系统后,呈现在你眼前的是信息板页面。
此页面允许用户完全体验JIRA。它的一个特性是它允
许用户添加项目细节面板。这些面板提供了项目报告
和与用户相关的问题的快速访问。
 
 
信息板还包含一个已保存的过滤器面板。当一个用户
想要保存一个经常使用的查询时这是很有用的。
用户还可以添加面板,用于显示当前分配给他的和他们
正在研究的问题。
 
 
 
》》登陆后,可以创建问题。
 
第7-2步:创建问题
 
要跟踪问题,你必须现创建他们。
JIRA允许用户简单而快速地创建问题,
只需填写那些必须地域/字段。
你可以修改地域/字段取决于你在JIRA
中地身份。
例如一个用户时开发人员,那么他或她
可以设置分配到任务的人(一般用户不能)。
 
 
 
》》一旦创建,那么你可以查看问题。
 
第7-3步:查看问题
 
一个问题的详细资料以简洁的、容易理解的方式
呈现出来。
你可以在问题上执行的操作清晰地以链接的形式
显示在一侧。
 
 
 
你可以在一个问题中添加其他已经存在的JIRA问题的链接。
例如,这些链接可以是与当前问题相关的或重复的问题。
 
 
 
》》下一步,排序和过滤问题。
 
第7-4步:排序和过滤问题
 
问题导航器允许你方便地对问题进行排序或过滤。
一系列事先定义的过滤器可以用于显示未计划的
问题、新问题或最近更新的问题。
 
 
 
你可以通过项目组件或版本号进行过滤。
 
 
 
还可以通过问题创建和修改日期进行过滤。
 
 
 
》》下一步,浏览项目
 
第7-5步:浏览项目
 
项目浏览器显示给你即时的项目状态概要。
一组预先打包的报告可以显示:
组件或版本的新开的问题
 
 
路标(问题完成情况,按照版本)
 
 
 
变更日志(已经结束的问题的历史纪录)
 
 
受关注的问题(获取最多投票的问题)
 
 
》》下一步,JIRA通知
 
第7-6步:邮件通知
 
JIRA提供了邮件通知功能。
当一个问题被创建了,将发送邮件给这儿显示的邮件地址。
任何用户可以订阅或监视某个问题-获取变更通知。
JIRA还可以通过创建触发其他通知(例如,SMS或即时消息)
的简单的Java类来扩展。
 
 
 
》》下一步,JIRA是很容易管理的
 
第7-7步:管理JIRA
几乎JIRA的方方面面都可以通过管理界面进行配置。
 
 
 
使用管理界面你还可以:
× 修改项目和组件
× 以XML文件导出和导入JIRA数据
× 通过完善的用户管理器来管理用户
× 添加新的通知监听器和调度服务
 
 
 
 
 
漫游结束
希望你们喜爱这个关于JIRA某些特性的简短的介绍。
 
了解更多:
JIRA中文资源包

http://www.jscud.com/product/cnjira/

JIRA破解

2005年03月14日

面向对象的模型设计方法

  定义:利用面向对象方法,把应用程序分成许多小块(对象),这些对象是独立的,然后组合这些对象,建立程序。

  特点:包装、继承、多态。

  常用的建模工具:PlayCase, Rational ROSE, Computer Association BPWin , Computer Association ERWin, Oracle Designer/2000, Sybase PowerDesigner

UML语言概述

  定义:一种面向对象的统一建模语言。
  作用:帮助我们对软件系统进行面向对象的和建模。
  核心:类,类之间的关系。
  建模:通过将用户的业务震需求映射为代码,保证代码满足这些需求,代码能方便地回溯需求,这个过程叫建模。

ROSE建模工具

  定义:是一种分析和设计面向对象的建模工具。

  作用:利用ROSE这个工具,我们可以建立用UML的软件系统的模型,面目可以自动生成和维护C++、JAVA、VB、PB、ORACLE等语言和系统的代码。

  核心:七大框图
  1. Use-Case Diagrams(用例框图)
  2. sequence diagram (顺序框图)
  3. Collaboration diagram (协作框图)
  4. Class diagram (类框图)
  5. State Transition diagram (状态框图)
  6. Component diagram (组件框图)
  7. Deployment diagram (扩展框图)

  下面结合软件工程知识、利用ROSE建模工具,本人在开发电力部们的”110KV标准设计图文管理系统”中所用到的ROSE模型及对ROSE在开发实践中的剖析

一、 需求分析阶段

  任务:建立用户需求和功能模块,确定系统中的角色和使用案例。利用ROSE,生成角色,使用案例和生成用例图
所用到的框图:

  1.Use-Case Diagrams:显示使用案例(表示系统功能)与角色(人或系统)间的交互。如下图:

  Use Case(用例):在不展现一个系统或系统内部结构的情况下,对系统或系统的连贯的功能单元的定义和描述。
角色:使用软件的人或外部系统本身。

2. sequence diagram

  按时间先后顺序,从上到下分析使用案例,确定案例的处理流程。如下图:


3 Collaboration diagram :

  确定对象之间的关系的处理过程的分析流程。如下图:

二、 概要设计阶段

  任务:通过分析Use-Case Diagrams ,得到所用到的类,分析这些类的属性、操作和它们之间的关系。

  所用到的框图:

1.Class Diagrams.

  显示系统中类与类之间的交互。


2.包:具有一些共性的类组合在一起的图。

 

三、 详细设计阶段

  任务:细化和个性Use-Case的描述 ,如类的操作和对象之间的消息相对应,填充参数及复杂的类的设计。

  所用到的框图:

1.Class Diagrams

2.State Diagrams:显示一个对象从生成到删除的生命周期。

四、 编码和测试阶段

  任务:进行软件的开发和测试,生成组件框图。
  组件:表示代码的物理模块。
  组件框图:表示系统中的组件及相互依赖性。
  Delpoyment Diagrams:显示网络中的物理布局和各种组件的位置。

双向工程

  1.生成代码:根据选择开发应用程序的语言生成对应的程序的代码。

  步骤:检查模型-生成组件-将类映射组件-设置代码生成属性-选择类、组件和包-生成代码

  2.逆向转出工程:根据选择开发应用程序的语言生成对应的程序的代码。

  步骤:检查模型-生成组件-将类映射组件-设置代码生成属性-选择类、组件和包-生成代码

 摘要:本文从视图、控制器、模型三个方面简要介绍了在Asp.net环境下,经典MVC设计模式的实现,并讨论了MVC设计模式的扩展,最后对MVC的优点及不足之处进行了分析。

  关键词:设计模式、视图、控制器、模型

  ASP.NET是微软最新推出的新型体系结构.NET框架的一部分,它为构造新一代动态网站和基于网络的分布式应用提供了强有力的支持。与以前的 Web 开发模型相比,ASP.NET 提供了许多重要的优点例如: 简易性;安全性;可管理性等。而且与基于过程的ASP页面技术相比,面向对象技术在ASP.NET中得到了完全实现。用传统ASP技术建立的Web应用实例中,在页面中同时实现显示,业务逻辑和流程控制,这从工程化的角度考虑,它有许多不足之处。用户界面承担着向用户显示问题模型和与用户进行操作和I/O交互的作用。用户希望保持交互操作界面的相对稳定,但更希望根据需要改变和调整显示的内容和形式。在.NET框架下ASP.NET技术结合MVC设计模式很好地解决了上述问题。

  1 MVC设计模式简介

  MVC由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础。MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定系统各部分间的组织关系。对于界面设计可变性的需求,MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件。

  视图部件把表示模型数据及逻辑关系和状态的信息以特定形式展示给用户。它从模型获得显示信息,对于相同的信息可以有多个不同的显示形式或视图。

  控制器部件是处理用户与软件的交互操作的,其职责是控制提供模型中任何变化的传播,确保用户界面于模型间的对应联系;它接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。

  模型部件保存由视图显示,由控制器控制的数据;它封装了问题的核心数据、逻辑和功能的计算关系,它独立于具体的界面表达和I/O操作。

  模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示。

  2 MVC设计模式的实现

  ASP.NET提供了一个很好的实现这种经典设计模式的类似环境。开发者通过在ASPX页面中开发用户接口来实现视图;控制器的功能在逻辑功能代码(.cs)中实现;模型通常对应应用系统的业务部分。在ASP.NET中实现这种设计而提供的一个多层系统,较经典的ASP结构实现的系统来说有明显的优点。将用户显示(视图)从动作(控制器)中分离出来,提高了代码的重用性。将数据(模型)从对其操作的动作(控制器)分离出来可以让你设计一个与后台存储数据无关的系统。就MVC结构的本质而言,它是一种解决耦合系统问题的方法。

  2.1 视图

  视图是模型的表示,它提供用户交互界面。使用多个包含单显示页面的用户部件,复杂的Web页面可以展示来自多个数据源的内容,并且网页人员,美工能独自参与这些Web页面的开发和维护。

  在ASP.NET下,视图的实现很简单。可以像开发WINDOWS界面一样直接在集成开发环境下通过拖动控件来完成页面开发本。本文中介绍每一个页面都采用复合视图的形式即:一个页面由多个子视图(用户部件)组成;子视图可以是最简单HTML 控件、服务器控件或多个控件嵌套构而成的Web自定义控件。页面都由模板定义,模板定义了页面的布局,用户部件的标签和数目,用户指定一个模板,平台根据这些信息自动创建页面。针对静态的模板内容,如页面上的站点导航,菜单,友好链接,这些使用缺省的模板内容配置;针对动态的模板内容(主要是业务内容),由于用户的请求不同,只能使用后期绑定,并且针对用户的不同,用户部件的显示内容进行过滤。使用由用户部件根据模板配置组成的组合页面,它增强了可重用性,并原型化了站点的布局。

  视图部分大致处理流程如下:首先,页面模板定义了页面的布局;页面配置文件定义视图标签的具体内容(用户部件);然后,由页面布局策略类初始化并加载页面;每个用户部件根据它自己的配置进行初始化,加载校验器并设置参数,以及事件的委托等;用户提交后,通过了表示层的校验,用户部件把数据自动提交给业务实体即模型。

  这一部分主要定义了WEB页面基类PageBase;页面布局策略类PageLayout,完成页面布局,用于加载用户部件到页面;用户部件基类UserControlBase即用户部件框架,用于动态加载检验部件,以及实现用户部件的个性化。为了实现WEB应用的灵活性,视图部分也用到了许多配置文件例如:置文件有模板配置、页面配置、路径配置、验证配置等。

  2.2 控制器

  为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。因此,为了达到集中管理的目的引入了控制器。应用程序的控制器集中从客户端接收请求(典型情况下是一个运行浏览器的用户),决定执行什么商业逻辑功能,然后将产生下一步用户界面的责任委派给一个适当的视图组件。

  用控制器提供一个控制和处理请求的集中入口点,它负责接收、截取并处理用户请求;并将请求委托给分发者类,根据当前状态和业务操作的结果决定向客户呈现的视图。在这一部分主要定义了HttpReqDispatcher(分发者类)、HttpCapture(请求捕获者类)、Controller(控制器类)等,它们相互配合来完成控制器的功能。请求捕获者类捕获HTTP请求并转发给控制器类。控制器类是系统中处理所有请求的最初入口点。控制器完成一些必要的处理后把请求委托给分发者类;分发者类分发者负责视图的管理和导航,它管理将选择哪个视图提供给用户,并提供给分发资源控制。在这一部分分别采用了分发者、策略、工厂方法、适配器等设计模式。

  为了使请求捕获者类自动捕获用户请求并进行处理,ASP.NET 提供低级别的请求/响应 API,使开发人员能够使用 .NET 框架类为传入的 HTTP 请求提供服务。为此,必须创作支持 System.Web.IHTTPHandler 接口和实现 ProcessRequest() 方法的类即:请求捕获者类,并在web.config 的 <httphandlers> 节中添加类。ASP.NET 收到的每个传入 HTTP 请求最终由实现 IHTTPHandler 的类的特定实例来处理。IHttpHandlerFactory 提供了处理 IHttpHandler 实例 URL 请求的实际解析的结构。HTTP 处理程序和工厂在 ASP.NET 配置中声明为 web.config 文件的一部分。ASP.NET 定义了一个 <httphandlers> 配置节,在其中可以添加和移除处理程序和工厂。子目录继承 HttpHandlerFactory 和 HttpHandler 的设置。 HTTP 处理程序和工厂是 ASP.NET 页框架的主体。工厂将每个请求分配给一个处理程序,后者处理该请求。 例如,在全局 machine.config 文件中,ASP.NET 将所有对 ASPx 文件的请求映射到 HttpCapture类:

<httphandlers>

<add verb=”*” path=”*.ASPx” type=”Sys.UI.HttpCapture, Sys.UI”/>

</httphandlers>

  2.3 模型

  MVC系统中的模型从概念上可以分为两类――系统的内部状态和改变系统状态的动作。模型是你所有的商业逻辑代码片段所在。本文为模型提供了业务实体对象和业务处理对象:所有的业务处理对象都是从ProcessBase类派生的子类。业务处理对象封装了具体的处理逻辑,调用业务逻辑模型,并且把响应提交到合适的视图组件以产生响应。业务实体对象可以通过定义属性描述客户端表单数据。所有业务实体对象都EntityBase派生子类对象,业务处理对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过业务实体对象实现了对视图和模型之间交互的支持。实现时把”做什么”(业务处理)和”如何做”(业务实体)分离。这样可以实现业务逻辑的重用。由于各个应用的具体业务是不同的,这里不再列举其具体代码实例。
  3 MVC设计模式的扩展

  通过在ASP.NET中的MVC模式编写的,具有极其良好的可扩展性。它可以轻松实现以下功能:

  ①实现一个模型的多个视图;

  ②采用多个控制器;

  ③当模型改变时,所有视图将自动刷新;

  ④所有的控制器将相互独立工作。

  这就是MVC模式的好处,只需在以前的程序上稍作修改或增加新的类,即可轻松增加许多程序功能。以前开发的许多类可以重用,而程序结构根本不再需要改变,各类之间相互独立,便于团体开发,提高开发效率。下面讨论如何实现一个模型、两个视图和一个控制器的程序。其中模型类及视图类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于控制器中的类,只需要增加另一个视图,并与模型发生关联即可。该模式下视图、控制器、模型三者之间的示意图如图2所示。

图 2 视图、控制器、模型三者之间关系的示意图

  同样也可以实现其它形式的MVC例如:一个模型、两个视图和两个控制器。从上面可以看出,通过MVC模式实现的应用程序具有极其良好的可扩展性,是ASP.NET面向对象编程的未来方向。
  4 MVC设计模式的优点及不足之处

  4.1 MVC的优点

  MVC的优点体现在以下几个方面:

  (1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。

  (2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。

  (3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。

  (4) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。

  4.2 MVC的不足之处

  MVC的不足体现在以下几个方面:

  (1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

  (2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

  (3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

  (4) 目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。

  5 结束语

  与软件所处理问题的内在模型相比较,用户界面是需要经常发生变化的,采用MVC设计模式可以在满足对界面要求的同时,使软件的计算模型独立于界面的构成。也可以基于此模型建立大型分布式应用程序框架。本文介绍了MVC设计模式的原理;MVC设计模式三个组成构件(模型部件、视图部件和控制部件)以及在ASP.NET环境下实现基于MVC的应用需要完成的工作;MVC设计模式的扩展;最后对MVC的优点及不足之处进行了分析。

2005年03月11日

有的时候,我们开发的应用需要抓取网页的内容借为己用,如QQ网站的天气信息新闻等,和Google等搜索爬虫的机制不同之处在于抓取目标的页面对开发人员而言是已知的。我们有理由避免过多的使用正则表达式的繁冗分析过程,如果能够在获取目标网页的HTML之后通过DOM来解析HTML将是一件非常愉快的事情。这里会遇到两个问题,DOM操作只能在客户端通过JavascriptVBScript等脚本语言进行,加上HTML自身不是非强格式的,不能使用类似XSLXML解析的方式进行操作。不过既然写这篇Blog,就一定有了解决的办法J

非常感谢MicrosoftXML大师Chris Lovett为我们带来的SgmlReader这个开源的项目。我们知道,XMLHTML都是Sgml的子集。通过SgmlReader,能够将HTML转换生成格式规范的HTMLWell-Formed HTML,虽然没有这个称呼,但这里暂且这么说),从而可以使用XMLXPath语法读取网页的数据了。那么在.NET Framework下,我们遇到的问题变得如此轻松。

简单写了一个示例程序,用来抓取QQ网站的天气信息,通过更改城市名称和XPath获得网页内容。

代码:下载

PS
:除了SgmlReader之外,还有Simon Mourier.NET Html Agility Pack也具有类似的功能。

2005年03月06日

四舍五入都是往右边计算:
—–(-5)—–(-4.6)(-4.5)(-4.4)—–(-4)———-(0)———-(4)—–(4.4)(4.5)(4.6)—–(5)—–
—–(-5)<—(-4.6)(-4.5)———->(-4)———-(0)———-(4)<———-(4.5)(4.6)—>(5)—–
——————————-(-4.4)—>(-4)———(0)———–(4)<—(4.4)—————————-

注意这些数字的位置关系,正数和负数并不是对称关系,Math.round()的运算时都是由左向右运算。
舍入方法叫做银行家舍入(Banker’sRound),这就是已经规定下来的标准、Round的标准、世界的标准。
也许我们习惯把Round与四舍五入等同,但是公式可能应该这样写。
Round <> 四舍五入

在微软的主页上也有比较详细的说明,
[url]http://support.microsoft.com/default.aspx?scid=http[/url]://support.microsoft.com:80/support/kb/articles/Q196/6/52.asp&NoWebContent=1

我们这个年代的过来的对四舍五入应该不陌生,但是什么是“银行家舍入”挺起来好像就有些过于专业,但是,现在在上小学的学生对此应该比我们更了解“银行家舍入”,因为它已经被写入了小学数学课本,而且是专门的一个章节。下面我就给大家介绍一下这两个舍入算法。


先看下面的对比表:


我们把原始数据舍入到小数点后两位:
原始数据 四舍五入 银行家舍入
1.000 1.00 1.00
1.111 1.11 1.11
1.444 1.44 1.44
1.465 1.47 1.46
1.555 1.56 1.56
1.565 1.57 1.56
1.666 1.67 1.67
1.849 1.85 1.85
1.999 2.00 2.00


银行家舍入算法用一句形象的话概括就是四舍六入五成双。


个人认为:当我们要使用一种合理的舍入方法来处理货币的时候,我们可以看到:


1 <-> 9
2 <-> 8
3 <-> 7
4 <-> 6
上面的含义是,我们遇到1舍去,那么9可以为此补上;2舍去,8可以来补上;……这样在大量随机数据中,舍去和补上就中和(暂且用这个词)。

5呢,我们到底是舍入还是进位呢。我们采取总是把被舍入处理的数进行双数化处理,这样我们的舍入和补上的比率又是1:1了,这样就能比较合理得处理货币的舍入问题。

我们再来看计算机语言对这些的支持,在IEEE里规定round函数就是要采用Banker’s rounding(银行家舍入)来处理。
C#,vs.net.j#,vbscript都是采用的四舍六入五成双

所以说我们(特指与我受过同样的小学数学教育的中国人)常用的四舍五入算法是不公平的,它总是把数值上推,而银行家舍入算法作为一种国际公认的算法是比较合理的,因此它也被写入了现代的小学数学书中,而且占用了一个章节

2005年02月19日

简单来讲,Subversion 采用 Global Revision Numbers,不像其它版本控制系统 (ex: CVS) 是针对每个个别的档案做版本控制,档案的版本只会在有修改 commit (提交) 时才会递增。对 Subversion 来说,在你每次 commit (新增、修改或删除任何档案或任何资料夹) 时,Subversion 会递增 Global Revision Number,而每个档案和资料夹只会记住它在哪几个 global revision 里也有被修改到。所以,你日后要 checkout 时所指定的版本编号所代表的意义是:「整个 repository 在第 N 次 commit 后的状态」。当然,你 checkout 时所指定的 repository URL 除了可以指定整个 repository 的根目录,也可以只指定一个档案或 repository 里的目录。

我想这对一般人来讲才是比较直觉的,而不像 CVS 是对每个 repository 里的档案分别做版本编号,如果要推出一个 release 版本时,需要对所有档案做 tag 标记,如此一来,CVS 才知道每个档案要使用第几版。


我在 Windows 平台上使用的 Subversion Client 是 TortoiseSVN,这是免费的,它把 Subversion client 应有的功能都整合在 Windows 档案总管的右键选单里,相当的便利。 :)

安装 Subversion
Subversion 我安装在 Fedora Core 2,用 Fedora 内附的 up2date 即可马上安装完成,只要打

up2date --install subversion

就可以了,注意要使用 root 来执行这个命令。

设定原始码的维护成员
一开始先确定哪些系统上的 user 需要参与同一个项目的原始码维护工作,在这里假设有 user_a、user_b 和 user_c,把这些帐号加到新成立的 project_a group (/etc/group 档案):

lteamster:x:30055:user_a,user_b,user_c

设定 Subversion repository
在这里我们建立 /home/project_a 这个目录,并把初始化这个目录为 Subversion repository:

svnadmin create /home/project_a

Subversion 会在指定目录下建立一些 Subversion 系统使用的档案。接下来就是设定这个 repository 的存取权限,把 repository 目录和里面的档案设定只有其 owner 和 project_a group 成员可以存取 (rw)。

chown -R user_a.project_a /home/project_a
chmod 770 /home/project_a
chmod -R g+w /home/project_a

设定这个 repository 的存取权限,把下面三行加进去 /home/project_a/conf/svnserve.conf:

[general]
anon-access = none
auth-access = write

anon-access 是限制匿名登入 (使用 svn:// 联机) 的存取权限,我们设为 none,也就是不能读写 (checkout 和 commit)。而 auth-access 是限制有援权的使用者 (使用 svn+ssh:// 来登入) 的存取权限,我们设为 write,也就是可以读写。

使用 Subversion
最后就可以在 Windows 上用 TortoiseSVN 来 import 资料到 repository,Repository’s URL 输入:

svn+ssh://username@svn-server-ip-address/home/project_a

username 改成你在 svn-server-ip-address 这台计算机使用的帐号名称,svn-server-ip-address 是 Subversion server 的主机 IP 地址,紧接在IP 后面的是 repository 在系统的路径。接下来就可以开始使用 Subversion 来维謢程序代码了。Enjoy It!

备份 Subversion repository

dump: usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]

Dump the contents of filesystem to stdout in a ‘dumpfile’ portable format, sending feedback to stderr. Dump revisions LOWER rev through UPPER rev. If no revisions are given, dump all
revision trees. If only LOWER is given, dump that one revision tree. If –incremental is passed, then the first revision dumped will be a diff against the previous revision, instead of the usual fulltext.

Valid options:
-r [--revision] arg : specify revision number ARG (or X:Y range)
incremental : dump incrementally
-q [
quiet] : no progress (only errors) to stderr

回复 Subversion repository

load: usage: svnadmin load REPOS_PATH

Read a ‘dumpfile’-formatted stream from stdin, committing
new revisions into the repository’s filesystem. If the repository
was previously empty, its UUID will, by default, be changed to the
one specified in the stream. Progress feedback is sent to stdout.

Valid options:
-q [--quiet] : no progress (only errors) to stderr
ignore-uuid : ignore any repos UUID found in the stream
force-uuid : set repos UUID to that found in stream, if any
parent-dir arg : load at specified directory in repository

后来因为常常得直接在 Linux command line 下改程序,所以 commit 程序到 Subversion 也直接在 command line 下完成,svn ci 可以 commit 程序代码, svn co 是 checkout 程序代码,svn st 可以看目前 working copy 的修改状态,要回复程序代码到上一个版本用 svn revert,回复时不需要再连到 Subversion 就可以完成。其它详细内容请见 manual。 :)

相关连结
Subversion revision 10061 (Manual)
http://svnbook.red-bean.com/svnbook/book.html

Subversion Draft Revision 1411M (中文化 manual)
http://freebsd.sinica.edu.tw/~plasma/svnbook/book.html

TortoiseSVN
http://tortoisesvn.tigris.org/

http://linux.chinaunix.net/news/info/2005-01-10/726.shtml

有位网友把微软的PetShop 3.* 用开源技术重写了在当前.NET的框架类库下,怎么手工实现分层应用。这里面涉及很多细节,怎么设计业务层/持久层,怎么做事务,业务层与持久层怎么交互,表现层怎么跟应用层交互,等等,这对初学者来说,是个很好的指导,让人了解在多层应用中,具体都需要做什么。由于O/R的差别,在大型项目中,很多时候大概会用专门的O/R Mapper或持久框架。象NHibernate这样transparent,non-intrusive的技术,指明了很好的方向。但不管用什么,多层应用里所涉及的细节都是需要了解的。
 
里面还提到TransHelper:提供分布式事务支持能力,提供的连接是无效的,是不是指dotnet2.0的System.Transactions。目前Nhibernate实现只是本地的事物处理,不支持分布式事务。
System.Transactions里面包含了Transaction相关的类。System.Transactions提供了一个“轻量级”的、易于使用的Transaction框架。
在以前,要实现Transaction需要利用EnterpriseServices,让组件从ServiceComponent继承下来。而通过System.Transactions,只要简单的几行代码,不需要继承,不需要Attribute标记,呵呵。
下面介绍System.Transactions中最简单的(也可能是以后最常见的)用法:
using (TransactionScope ts = new TransactionScope())
{
    // 在这里编写需要具备Transaction的代码
    ts.Consistent = true;
}

TransactionScope类用来构建一个Transaction Scope,在这个Scope里面的代码将具备Transaction的能力。TransactionScope实现了IDisposable,在调用TransactionScope.Dispose()的时候,如果Consistent属性没有被设置成true,那么就将会触发Rollback动作。

using (TransactionScope ts = new TransactionScope())
{
    using (SqlConnection conn = new SqlConnection(“…”))
    {
        conn.Open();
    }
    ts.Consistent = true;
}

上面的代码就演示了在一个Transaction Scope里面,打开一个数据库连接。这个数据库连接由于处在一个Transaction Scope里面,所以会自动获得Transaction的能力。如果这里数据库连接的是SqlServer2005,那么这个Transaction将不会激活一个MSDTC管理的Distributed Transaction,而是会由.Net创建一个Local Transaction,性能非常的高。但是如果是SqlServer2000或者7,那么则会自动激活一个Distributed Transaction,在性能上遭受一定的损失。

using (TransactionScope ts = new TransactionScope())
{
    using (SqlConnection conn = new SqlConnection(“…”))
    {
        conn.Open();
        using (SqlConnection conn2 = new SqlConnection(“…”))
        {
            conn2.Open();
        }
    }
    ts.Consistent = true;
}

这个例子更加充分的说明了Transaction Scope的强大,两个数据库连接!虽然上面的conn和conn2是两个不同的连接对象,可能分别连接到不同的数据库,但是由于它们处在一个Transaction Scope中,它们就具备了“联动”的Transaction能力。在这里,将自动激活一个MSDTC管理的Distributed Transaction。(可以通过打开管理中心里面的组件服务,来察看当前的Distributed Transaction列表。)

下面再介绍如何手动将一项资源(Resource)参与(enlist)到一个分布式事务中:

ICommittableTransaction tr = Transaction.Create();
using (SqlConnection conn = new SqlConnection(“…”))
{
    conn.EnlistTransaction(tr as ITransaction);
}
tr.Commit();
上面的代码手工创建了一个ICommittableTransaction对象(通过Transaction类的static方法)。SqlConnection对象通过EnlistTransaction()方法参与到这个Transaction中去。注意:EnlistTransaction()方法只接受ITransaction类型,因为ITransaction没有Commit()方法,你肯定不会希望ICommittableTransaction之外的其他对象来执行Commit()方法吧,呵呵。

参考资源链接:
System.Transactions命名空间
MSDNTV: Introducing System.Transactions in .NET Framework 2.0
 
Castle – Facility-Automatic Transaction Management 这个是Castle,spring.net的竞争对手,支持事务处理,是这个AOP框架的一个应用
2005年02月17日

Security-Enhanced LinuxSELinux)的历史
一个小历史将有助于帮助您理解 Security-Enhanced Linux(SELinux)——而且它本身也是段有趣的历史。美国国家安全局(National Security Agency,NSA)长时间以来就关注大部分操作系统中受限的安全能力。毕竟,他们的工作之一就是要确保美国国防部使用的计算机在面临没完没了的攻击时保持安全。NSA 发现大部分操作系统的安全机制,包括 Windows 和大部分 UNIX 和 Linux 系统,只实现了“选择性访问控制(discretionary access control)”(DAC)机制。DAC 机制只是根据运行程序的用户的身份和文件等对象的所有者来决定程序可以做什么。NSA 认为这是一个严重的问题,因为 DAC 本身对脆弱的或恶意的程序来说是一个不合格的防护者。取而代之的,NSA 长期以来一直希望操作系统同样能支持“强制访问控制(mandatory access control)”(MAC)机制。

MAC 机制使得系统管理员可以定义整个系统的安全策略,这个策略可以基于其他因素,像是用户的角色、程序的可信性及预期使用、程序将要使用的数据的类型等等,来限制程序可以做哪些事情。一个小例子,有了 MAC 后用户不能轻易地将“保密的(Secret)”数据转化为“不保密的(Unclassified)”的数据。不过,MAC 实际上可以做的比那要多得多。

NSA 已经与操作系统提供商合作了多年,但是很多占有最大市场的提供商对于将 MAC 集成进来没有兴趣。即使是那些集成了 MAC 的提供商也通常是将其做为“单独的产品”,而不是常规产品。一部分原因只是因为旧式的 MAC 不够灵活。

于是 NSA 的研究力量尽力去使 MAC 更灵活并且并容易被包含在操作系统中。他们使用 Mach 操作系统开发了他们的思想的原型,后来发起的工作扩展了“Fluke”研究操作系统。不过,难以让人们信服这些思想可以适用于 “真实的”操作系统 ,因为所有这些工作都基于微型的“玩具级的”研究项目。极少可以在原型之外进行尝试以查看这些思想在真实的应用程序中工作得如何。NSA 不能说服具有所有权的提供商来添加这些思想,而且 NSA 也没有权利去修改私有的操作系统。这不是个新问题;多年前 DARPA 试图强制它的操作系统研究人员使用私有的操作系统 Windows,但遇到了很多问题(参见下面的 参考资料)。

于是,NSA 偶然发现了一个回想起来似乎显而易见的想法:使用一个不是 玩具的开放源代码操作系统,并实现他们的安全思想,以显示(1)它可以工作,(2)它具体如何工作(通过为所有人提供源代码)。他们选择了主导市场的开放源代码内核(Linux)并在其中实现了他们的思想,即“security-enhanced Linux”(SELinux)。毫无意外,使用真正的系统(Linux)让 NSA 研究人员可以处理他们在玩具中无法处理的问题。例如,在大部分基于 Linux 的系统中,几乎所有都是动态链接的,所以他们不得不做一些关于程序如何执行的深入分析(查阅他们关于“entrypoint”和 “execute”权限的文档以获得更多资料)。这是一个更为成功的方法;正在使用 SELinux 的人比使用先前的原型的人多得多。

SELinux 如何工作
那么,SELinux 如何工作呢?SELinux 的方法实际上非常普通。每一个重要的内核对象,比如每个文件系统对象和每个进程,都有一个关联到它们的“安全上下文(security context)”。安全上下文可以基于军事安全层级(如不保密的、保密的和高度保密的)、基于用户角色、基于应用程序(这样,一个 Web 服务器可以拥有它自己的安全上下文),或者基于很多其他内容。当它执行另一个程序时,进程的安全上下文可以改变。甚至,取决于调用它的程序,一个给定的程序可以在不同的安全上下文中运行,即使是同一个用户启动了所有程序。

然后系统管理员就可以创建一个指定哪些特权授与哪个安全上下文的“安全策略(security policy)”。当发生系统调用时,SELinux 去检查是否所有需要的特权都已经授与了——如果没有,它就拒绝那个请求。

例如,要创建一个文件,当前进程的安全上下文必须对父目录的安全上下文的“搜索(search)”和“add_name”特权,而且它需要有对于(要创建的)文件的安全上下文的“创建(create)”特权。同样,那个文件的安全上下文必须有特权与文件系统“关联(associated)”(所以,举例来说,“高度保密”的文件不能写到一个“不保密”的磁盘)。还有用于套接字、网络接口、主机和端口的网络访问控制。如果安全策略为那些全部授与了权限,那么请求就会被 SELinux 所允许。否则,就会被禁止。如果按部就班地去做所有这些检查将会较慢,不过有很多优化方案(基于多年的研究)使其变得很迅速。

这一检查完全独立于类 UNIX 系统中的通常的权限位;在 SELinux 系统中,您必须 既 有标准的类 UNIX 权限, 又 有 SELinux 权限才能去做一些事情。不过,SELinux 检查可以做很多对传统的类 UNIX 权限来说难以完成的事情。使用 SELinux,您可以方便地创建一个只能运行特定程序并且只能在特定的上下文中写文件的 Web 服务器。更有趣的是,如果一个攻击者攻入了 Web 服务器并成为 root,攻击者不会获得整个系统的控制权——如果有一个好的安全策略的话。

那就有了困难:为了使 SELinux 有效,您需要有一个好的安全策略来由 SELinux 执行。大部分用户将需要一个他们容易修改的实用的初始策略。几年前我开始体验 SELinux;那时,初始策略还不成熟,有很多问题。例如,在那些以前的日子中我发现早期的样例策略不允许系统更新硬件时钟(最后我提交了一个补丁以解决这一问题)。设计好的初始安全策略类似对产品分类, NSA 希望由商业界来做,而且看起来是要这样做。Red Hat、一些 Debian 开发者、Gentoo 以及其他人正在使用基本的 SELinux 框架,并且正在创建初始安全策略,这样用户可以马上开始使用它。的确,Red Hat 计划为所有用户在他们的 Fedora 内核中都启用 SELinux,并提供简单的工具来使得非专业用户可以通过选择一些常见选项来修改他们的安全策略。Gentoo 有一个可引导的 SELinux LiveCD。这些团体将使得最小化程序特权变得更简单,而不需要大量代码。

在这里我们又回到了原处。SELinux 只有当程序执行时才允许发生安全传输,它控制进程的权限(不是一个进程的一部分)。所以,为了充分发挥 SELinux 的潜力,您需要将您的应用程序分解为独立的进程和程序,只有一些小的有特权的组件—— 这恰恰如同如何在没有 SELinux 的情况开发安全的程序。像 SELinux 这样的工具让您可以更好地控制授与的权限,并这样创建一个更强有力的防御,但是,您仍需要将您的程序拆分为更小的组件,以使得那些控制能发挥最大的效用。

普通的Linux 与SELinux相比较

普通的Linux系统的安全性是依赖内核的,这个依赖是通过setuid/setgid产生的。在传统的安全机制下,暴露了一些应用授权问题、配置问题或进程运行造成整个系统的安全问题。这些问题在现在的操作系统中都存在,这是由于他们的复杂性和与其它程序的互用性造成的。

SELinux只单单依赖于系统的内核和安全配置政策。一旦你正确配置了系统,不正常的应用程序配置或错误将只返回错误给用户的程序和它的系统后台程序。其它用户程序的安全性和他们的后台程序仍然可以正常运行,并保持着它们的安全系统结构。

用简单一点的话说就是:没有任何的程序配置错误可以造成整个系统的崩溃。

SELinux 在 Linux 上是一项十分重要的技术!当我第一次面对它的时候,有当年我遇见 LDAP 时的情况,好象没有见面的老朋友再次见面一样。

在自己内刚学习 Linux 的时候,就被人问起一个 Unix 中的核心问题︰

* 为什幺 root 的权力是无限大的。
* 有没有办法令 root 的权力受到限制。

这虽然不是 SELinux 的主要课题,但是 SELinux 却对这两个问题有很好的回答。

在安全方面 SELinux 也对 Linux 本身加强了安全级数, Linux 的安全级数一直是 C 级或 C+ 级,和 Windows 服务器的级数相同,但是 SELinux 却有望把 Linux 的安全级数提升至 B 级。

所以你想 SELinux 是否在未来是一个必学的课题。

MAC 是 SELinux 的精要所在,也是很多人在学习 SELinux 最不习惯的地方。(包括我在内。)

什么叫做 MAC ?

我想你可能会知道什么叫做 chroot 的。 chroot 就是把某程序置于文件系统下的某一处,而当运行的时候,就不会离开这个文件系统的部份。(也就是不会影响整个的文件系统。)bind 是最喜欢使用这个方式来增进他的安全级数的。

MAC 和 chroot 有什么部份是相似的?这部份你可以想想如果把所有的程序都分开不同的层次来运行( domain )。而不同的 domain 却各自独立,而且如果没有经过授权是不可以由 domain A 跳到 domain B ,情况就如 chroot 一样。

很多人都问为什系统下的 root 在系统下却有什事情无法做?!

其实说穿了是因为 root 所属的 domain type (如 sysadm_t 或者 staff_t )他们没有授权「跳到」所需要执行某程序的 domain type 下。

如果无法做这样的「跳」,也就无法做希望的工作。因些 root 的权力就受到限制了!

谁定下这些 domain 和权限呢?

其实这是在 SELinux 的开机的时候会 load 起一个叫做 policy,* 的政策权限文件,这文件内中就定义了这些权限。如果你的 SELinux 是不能在开机后转回 permissive 模式的话,那你的 root 也可能无法修改当中的设定!

MAC 有什么好处?

其实好处就如 chroot 一样把系统内任何东西都加上一层保护层。那就算是入侵进入了你的计算机,也很有可能无法有任何事情能做!

例如︰你的 imapd 和 popd 服务器是以 root 的权限执行的!如果某天发现了一个极严重的 bug ,而使得入侵者可以从这两个服务器进入系统!

如果你的 Linux 系统有被 SELinux 保护的话,那么入侵者仍没有办法拿到 Linux 系统下完整的 root 的权限,因为它被 imapd 或者 popd 所属的 domain type 所限制,因此他的 Linux 系统仍被 SELinux 系统保护。

但是没有 SELinux 保护的系统,它就可能因为 imapd 或者 popd 服务器入侵而令到系统进入而产生不可预期的安全问题。

1.FC3不能创建普通用户!
如果在安装时选择了激活Selinux,这时候任何用户就无法添加用户,在system-config-securitylevelselinux关掉就可以了。这是FC安全上的一个默认设置。有力提高系统安全。

2.
为什么我在FC3下面听CD没有声音?
把光驱跟主板间的音频线接上,或者把耳机接在光驱的前置耳机接口里.

3.
普通用户mount ext2文件系统,不能写吗?
用普通用户mount另一块硬盘,该硬盘是ext2文件系统/dev/hdb1.也改了/etc/fstab中添加user一项,普通是可以mount该分区了,但是mount point的属性还是766,也就是我不能往该分区写数据,这个该怎么解决啊,我试过vfat格式可以更改mount point uid,gid,ext2好象不能改啊?
你需要chmod给你普通用户写的权限
ext2
ext3的文件权限不仅仅由mount来决定的,比如说你有个分区/dev/hda2
上面linux这个用户有写入的权限,可是你用readonly挂载的,于是你不能写入。
同样,你虽然用read-write挂载了一个盘,可是这个目录只有root有写入权限,那linux这个用户肯定也没法写入呀。
vfat的文件系统就不一样了,他没有ext3文件的这种rwx的权限,所有的权限考你mount时的参数来决定。
不要用FC3默认的挂载目录,像以前一样在mkdir一个挂载目录。
例如/mnt/sda
编辑/etc/fctab加上一行:
/dev/sda /mnt/sda vfat defaults,noauto,iocharset=cp936 0 0
重启以后再插U盘,系统会自动挂载到/mnt/sda并在桌面显示图标,像xp下一样方便,再不会出现像以前那样,usb鼠标在开机时插的晚了,或者在系统运行时拔了再插,就识别不出来的现象了。而且U盘也不会只插拔一次就不能再挂载了。
注意有的U盘会识别为/dev/sda1,大家根据实际修改。
另外补充一点,当有多个分区的移动硬盘挂载时,系统会自动挂载到/media目录下,(新生成多个sda*目录)但是进入那些目录就假死。U盘在使用上述方法之前也是同样情况。命令行下用ls打开提示段错误。我的解决方案是为各个分区都设一个同上面的/mnt/sda一样的目录,并在fstab中修改。但是我不推荐,因为比较烦,而且挂载不便管理。希望大家提供一个更加好的解决方案。
另外我有一个问题就是,那个automount的配置文件在那里可以修改?
FC3
有好多的New Feature等我们去发现和使用。
下面的命令可以:
mount -t vfat /dev/sda1 /mnt/Usb -o iocharset=utf8

4.
邮件的乱码问题
kmail接受邮件,在utf8环境下,某些采用gb编码的邮件显示乱码(比如从linuxsir发出的邮件),即使你在kmail的菜单里面选中用gbk编码查看,内容可以显示正常但是标题和邮件头依然乱码。在gb locale下一切正常。解决的办法是,我写了一个脚本,该脚本接受一个参数,在脚本中先把locale设置为gbk,然后把传入的参数作为命令来执行。脚本内容如下:
LC_ALL=zh_CN.gbk
LANG=zh_CN.gbk
if [ -n "$1" ];then
cmd=”$1 $2 $3 $4 $5 $6″
echo $cmd
$cmd
fi
该脚本的名字叫gbksh,当我要执行kmail时可以这么执行gbksh kmail,然后打开的kmail就可以按照gbklocale显示邮件,但是整个系统的运行环境仍然是utf8

5.FC3
挂载FAT32,失去响应
FC3
的问题
mount -o iocharset=utf8 /dev/hda7 /mnt/f

6.fc3
test3版自动加载windows分区有问题?
要修改/etc/fstab
如下的例子,/dev/hda1 /mnt/WinXP ntfs auto,ro,nls=cp936,uid=1000,gid=1000,umask=000 0 0
/dev/hda5 /mnt/WinD vfat umask=0,rw,iocharset=cp936 0 0
/dev/hda6 /mnt/WinE vfat umask=0,rw,iocharset=cp936 0 0
其实就是要把编码改为cp936,就行了。不要改为utf8,否则会出现乱码。
fc3
的正式版不会自动挂载windows分区,要在安装的分区时,自己编辑挂载点,或按上面的例子添加。

7.
fedora core 3 中安装、配制fcitx 输入法:

(1)
删除系统原来的输入法
安装fcitx之前建议删除系统自带的输入法,方法如下:
rpm -qa iiim*
用下面的命令把找到的rpm包全删掉就是:
rpm -e xxxx.rpm –nodeps
2)下载fcitx
http://www.fcitx.org/main/?q=node/view/9下载fcitx-3.0.2-1.i386.rpm安装程序,运行rpm -ivh fcitx-3.0.2-1.i386.rpm 进行安装。
(3)
fcitx在英文环境下运行:
[root@ghm ~]# vi /etc/sysconfig/i18n
i18n文件中加入行LC_CTYPE=”zh_CN”后,保存退出,好了。
(4)
fcitx支持五笔98输入法:
fcitx
装完后默认支持的是86五笔码表,码表文件为/usr/share/fcitx/data/wbx.mb,用98码表文件wbx.mb替掉原来的文件就是。
(5)
更改配制文件
vi /root/.fcitx/config
以便进行输入法的定制。
好了,注销机子,运行fcitx试试看?

8.
fedora core 3 支持ntfs分区:

要让fedora core 3 支持ntfs分区,可以采取重新编译内核以便加入对ntfs的支持。可这对我们菜鸟来说太烦了,也感觉没这个必要。下面说个比较简单的方法:
(1)
查看内核版本:
[root@ghm ~]# uname -r
————————————-
2.6.9-1.667
[root@ghm ~]#
(2)
下载和内核对应的ntfs模块包:
http://linux-ntfs.sourceforge.net/rpm/fedora3.html
(3)
安装
rpm -ivh kernel-module-ntfs-2.6.9-1.667-2.1.20-0.fc.1.2.i686.rpm
记住把kernel-module-ntfs-2.6.9-1.667-2.1.20-0.fc.1.2.i686.rpm更改成和我们机子相对应的rpm 包。
(4)
加载安装的ntfs模块:
[root@ghm ~]# modprobe ntfs
好了,赶快mount你的ntfs分区试试!

2005年02月16日

前言
同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开密钥算法。目前,国内详细介绍ECC的公开文献并不多(反正我没有找到)。有一些简介,也是泛泛而谈,看完后依然理解不了ECC的实质(可能我理解力太差)。前些天我从国外网站找到些材料,看完后对ECC似乎懵懂了。于是我想把我对ECC的认识整理一下,与大家分享。当然ECC博大精深,我的认识还很肤浅,文章中错误一定不少,欢迎各路高手批评指正,小弟我洗耳恭听,并及时改正。文章将采用连载的方式,我写好一点就贴出来一点。本文主要侧重理论,代码实现暂不涉及。这就要求你要有一点数学功底。最好你能理解RSA算法,对公开密钥算法有一个了解。《近世代数基础》《初等数论》之类的书,最好您先翻一下,这对您理解本文是有帮助的。别怕,我尽量会把语言通俗些,希望本文能成为学习ECC的敲门砖。
一、从平行线谈起。
平行线,永不相交。没有人怀疑把:)不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行公理,是没有证明的)。既然可以假设平行线永不相交,也可以假设平行线在很远很远的地方相交了。即平行线相交于无穷远点P∞(请大家闭上眼睛,想象一下那个无穷远点P∞,P∞是不是很虚幻,其实与其说数学锻炼人的抽象能力,还不如说是锻炼人的想象力)。给个图帮助理解一下:

直线上出现P∞点,所带来的好处是所有的直线都相交了,且只有一个交点。这就把直线的平行与相交统一了。为与无穷远点相区别把原来平面上的点叫做平常点。
以下是无穷远点的几个性质。
▲直线L上的无穷远点只能有一个。(从定义可直接得出)
▲平面上一组相互平行的直线有公共的无穷远点。(从定义可直接得出)
▲ 平面上任何相交的两直线L1,L2有不同的无穷远点。(否则L1和L2有公共的无穷远点P,则L1和L2有两个交点A、P,故假设错误。)
▲平面上全体无穷远点构成一条无穷远直线。(自己想象一下这条直线吧)
▲平面上全体无穷远点与全体平常点构成射影平面。
二、射影平面坐标系
射影平面坐标系是对普通平面直角坐标系(就是我们初中学到的那个笛卡儿平面直角坐标系)的扩展。我们知道普通平面直角坐标系没有为无穷远点设计坐标,不能表示无穷远点。为了表示无穷远点,产生了射影平面坐标系,当然射影平面坐标系同样能很好的表示旧有的平常点(数学也是“向下兼容”的)。

我们对普通平面直角坐标系上的点A的坐标(x,y)做如下改造:
令x=X/Z ,y=Y/Z(Z≠0);则A点可以表示为(X:Y:Z)。
变成了有三个参量的坐标点,这就对平面上的点建立了一个新的坐标体系。
例2.1:求点(1,2)在新的坐标体系下的坐标。
解:∵X/Z=1 ,Y/Z=2(Z≠0)∴X=Z,Y=2Z ∴坐标为(Z:2Z:Z),Z≠0。即(1:2:1)(2:4:2)(1.2:2.4:1.2)等形如(Z:2Z:Z),Z≠0的坐标,都是(1,2)在新的坐标体系下的坐标。
我们也可以得到直线的方程aX+bY+cZ=0(想想为什么?提示:普通平面直角坐标系下直线一般方程是ax+by+c=0)。新的坐标体系能够表示无穷远点么?那要让我们先想想无穷远点在哪里。根据上一节的知识,我们知道无穷远点是两条平行直线的交点。那么,如何求两条直线的交点坐标?这是初中的知识,就是将两条直线对应的方程联立求解。平行直线的方程是:
aX+bY+c1Z =0; aX+bY+c2Z =0 (c1≠c2);
(为什么?提示:可以从斜率考虑,因为平行线斜率相同);
将二方程联立,求解。有c2Z= c1Z= -(aX+bY),∵c1≠c2 ∴Z=0 ∴aX+bY=0;
所以无穷远点就是这种形式(X:Y:0)表示。注意,平常点Z≠0,无穷远点Z=0,因此无穷远直线对应的方程是Z=0。

例2.2:求平行线L1:X+2Y+3Z=0 与L2:X+2Y+Z=0 相交的无穷远点。
解:因为L1∥L2 所以有Z=0, X+2Y=0;所以坐标为(-2Y:Y:0),Y≠0。即(-2:1:0)(-4:2:0)(-2.4:1.2:0)等形如(-2Y:Y:0),Y≠0的坐标,都表示这个无穷远点。

看来这个新的坐标体系能够表示射影平面上所有的点,我们就把这个能够表示射影平面上所有点的坐标体系叫做射影平面坐标系。


练习:
1、求点A(2,4) 在射影平面坐标系下的坐标。
2、求射影平面坐标系下点(4.5:3:0.5),在普通平面直角坐标系下的坐标。
3、求直线X+Y+Z=0上无穷远点的坐标。
4、判断:直线aX+bY+cZ=0上的无穷远点 和 无穷远直线与直线aX+bY=0的交点,是否是同一个点?


三、椭圆曲线

上一节,我们建立了射影平面坐标系,这一节我们将在这个坐标系下建立椭圆曲线方程。因为我们知道,坐标中的曲线是可以用方程来表示的(比如:单位圆方程是x2+y2=1)。椭圆曲线是曲线,自然椭圆曲线也有方程。

椭圆曲线的定义:
一条椭圆曲线是在射影平面上满足方程
Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3 —————-[3-1]
的所有点的集合,且曲线上的每个点都是非奇异(或光滑)的。

定义详解:

▲ Y2Z+a1XYZ+a3YZ2 = X3+a2X2Z+a4XZ2+a6Z3是Weierstrass方程(维尔斯特拉斯,Karl Theodor Wilhelm Weierstrass,1815-1897),是一个齐次方程。

▲ 椭圆曲线的形状,并不是椭圆的。只是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程(计算椭圆周长的方程,我没有见过,而对椭圆线积分(设密度为1)是求不出来的。谁知道这个方程,请告诉我呀^_^),故得名。

我们来看看椭圆曲线是什么样的。





▲ 所谓“非奇异”或“光滑”的,在数学中是指曲线上任意一点的偏导数Fx(x,y,z),Fy(x,y,z),Fz(x,y,z)不能同时为0。如果你没有学过高等数学,可以这样理解这个词,即满足方程的任意一点都存在切线。

下面两个方程都不是椭圆曲线,尽管他们是方程[3-1]的形式。




因为他们在(0:0:1)点处(即原点)没有切线。

▲椭圆曲线上有一个无穷远点O∞(0:1:0),因为这个点满足方程[3-1]。

知道了椭圆曲线上的无穷远点。我们就可以把椭圆曲线放到普通平面直角坐标系上了。因为普通平面直角坐标系只比射影平面坐标系少无穷远点。我们在普通平面直角坐标系上,求出椭圆曲线上所有平常点组成的曲线方程,再加上无穷远点O∞(0:1:0),不就构成椭圆曲线了么?

我们设x=X/Z ,y=Y/Z代入方程[3-1]得到:
y2+a1xy+a3y = x3+a2×2+a4x+a6 ————————-[3-2]

也就是说满足方程[3-2]的光滑曲线加上一个无穷远点O∞,组成了椭圆曲线。为了方便运算,表述,以及理解,今后论述椭圆曲线将主要使用[3-2]的形式。

本节的最后,我们谈一下求椭圆曲线一点的切线斜率问题。
由椭圆曲线的定义可以知道,椭圆曲线是光滑的,所以椭圆曲线上的平常点都有切线。而切线最重要的一个参数就是斜率k。

例3.1:求椭圆曲线方程y2+a1xy+a3y=x3+a2×2+a4x+a6上,平常点A(x,y)的切线的斜率k。
解:令F(x,y)= y2+a1xy+a3y-x3-a2×2-a4x-a6
求偏导数
Fx(x,y)= a1y-3×2-2a2x-a4
Fy(x,y)= 2y+a1x +a3
则导数为:f’(x)=- Fx(x,y)/ Fy(x,y)=-( a1y-3×2-2a2x-a4)/(2y+a1x +a3)
= (3×2+2a2x+a4-a1y) /(2y+a1x +a3)
所以k=(3×2+2a2x+a4-a1y) /(2y+a1x +a3) ————————[3-3]

看不懂解题过程没有关系,记住结论[3-3]就可以了。


练习:
1、将给出图例的椭圆曲线方程Y2Z=X3-XZ2 和Y2Z=X3+XZ2+Z3转换成普通平面直角坐标系上的方程。


四、椭圆曲线上的加法

上一节,我们已经看到了椭圆曲线的图象,但点与点之间好象没有什么联系。我们能不能建立一个类似于在实数轴上加法的运算法则呢?天才的数学家找到了这一运算法则

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
自从近世纪代数学引入了群、环、域的概念,使得代数运算达到了高度的统一。比如数学家总结了普通加法的主要特征,提出了加群(也叫交换群,或Abel(阿贝尔)群),在加群的眼中。实数的加法和椭圆曲线的上的加法没有什么区别。这也许就是数学抽象把:)。关于群以及加群的具体概念请参考近世代数方面的数学书。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

运算法则:任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R。(如图)





法则详解:
▲这里的+不是实数中普通的加法,而是从普通加法中抽象出来的加法,他具备普通加法的一些性质,但具体的运算法则显然与普通加法不同。

▲根据这个法则,可以知道椭圆曲线无穷远点O∞与椭圆曲线上一点P的连线交于P’,过P’作y轴的平行线交于P,所以有 无穷远点 O∞+ P = P 。这样,无穷远点 O∞的作用与普通加法中零的作用相当(0+2=2),我们把无穷远点 O∞ 称为 零元。同时我们把P’称为P的负元(简称,负P;记作,-P)。(参见下图)



▲根据这个法则,可以得到如下结论 :如果椭圆曲线上的三个点A、B、C,处于同一条直线上,那么他们的和等于零元,即A+B+C= O∞

▲k个相同的点P相加,我们记作kP。如下图:3P = P+P+P = R+P = S。



下面,我们利用P、Q点的坐标(x1,y1),(x2,y2),求出R=P+Q的坐标(x4,y4)。

例4.1:求椭圆曲线方程y2+a1xy+a3y=x3+a2×2+a4x+a6上,平常点P(x1,y1),Q(x2,y2)的和R(x4,y4)的坐标。
解:(1)先求点-R(x3,y3)
因为P,Q,-R三点共线,故设共线方程为y=kx+b,其中
若P≠Q(P,Q两点不重合) 则
直线斜率k=(y1-y2)/(x1-x2)
若P=Q(P,Q两点重合) 则直线为椭圆曲线的切线,故由例3.1可知:
k=(3×2+2a2x+a4 -a1y) /(2y+a1x+a3)

因此P,Q,-R三点的坐标值就是方程组:
y2+a1xy+a3y=x3+a2×2+a4x+a6 —————–[1]
y=(kx+b) —————–[2]
的解。

将[2],代入[1] 有
(kx+b)2+a1x(kx+b)+a3(kx+b) =x3+a2×2+a4x+a6 ——–[3]
对[3]化为一般方程,根据三次方程根与系数关系(当三次项系数为1时;-x1×2x3 等于常数项系数, x1×2+x2×3+x3×1等于一次项系数,-(x1+x2+x3)等于二次项系数。)
所以-(x1+x2+x3)=a2-ka1-k2
x3=k2+ka1+a2+x1+x2;———————求出点-R的横坐标
因为k=(y1-y3)/(x1-x3) 故
y3=y1-k(x1-x3);——————————-求出点-R的纵坐标

(2)利用-R求R
显然有 x4=x3= k2+ka1+a2+x1+x2; ————求出点R的横坐标
而y3 y4 为 x=x4时 方程y2+a1xy+a3y=x3+a2×2+a4x+a6的解
化为一般方程y2+(a1x+a3)y-(x3+a2×2+a4x+a6)=0 , 根据二次方程根与系数关系得:
-(a1x+a3)=y3+y4
故y4=-y3-(a1x+a3)=k(x1-x4)-y1-(a1×4+a3); —————求出点R的纵坐标
即:
x4=k2+ka1+a2+x1+x2;
y4=k(x1-x4)-y1-a1×4-a3;

本节的最后,提醒大家注意一点,以前提供的图像可能会给大家产生一种错觉,即椭圆曲线是关于x轴对称的。事实上,椭圆曲线并不一定关于x轴对称。如下图的y2-xy=x3+1


五、密码学中的椭圆曲线

我们现在基本上对椭圆曲线有了初步的认识,这是值得高兴的。但请大家注意,前面学到的椭圆曲线是连续的,并不适合用于加密;所以,我们必须把椭圆曲线变成离散的点。
让我们想一想,为什么椭圆曲线为什么连续?是因为椭圆曲线上点的坐标,是实数的(也就是说前面讲到的椭圆曲线是定义在实数域上的),实数是连续的,导致了曲线的连续。因此,我们要把椭圆曲线定义在有限域上(顾名思义,有限域是一种只有由有限个元素组成的域)。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
域的概念是从我们的有理数,实数的运算中抽象出来的,严格的定义请参考近世代数方面的数。简单的说,域中的元素同有理数一样,有自己得加法、乘法、除法、单位元(1),零元(0),并满足交换率、分配率。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

下面,我们给出一个有限域Fp,这个域只有有限个元素。

Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1;
Fp 的加法(a+b)法则是 a+b≡c (mod p);即,(a+c)÷p的余数 和c÷p的余数相同。
Fp 的乘法(a×b)法则是 a×b≡c (mod p);
Fp 的除法(a÷b)法则是 a/b≡c (mod p);即 a×b-1≡c (mod p);(b-1也是一个0到p-1之间的整数,但满足b×b-1≡1 (mod p);具体求法可以参考初等数论,或我的另一篇文章)。
Fp 的单位元是1,零元是 0。

同时,并不是所有的椭圆曲线都适合加密。y2=x3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就把y2=x3+ax+b 这条曲线定义在Fp上:

选择两个满足下列条件的小于p(p为素数)的非负整数a、b
4a3+27b2≠0 (mod p)
则满足下列方程的所有点(x,y),再加上 无穷远点O∞ ,构成一条椭圆曲线。
y2=x3+ax+b (mod p)
其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。

我们看一下y2=x3+x+1 (mod 23)的图像



是不是觉得不可思议?椭圆曲线,怎么变成了这般模样,成了一个一个离散的点?
椭圆曲线在不同的数域中会呈现出不同的样子,但其本质仍是一条椭圆曲线。举一个不太恰当的例子,好比是水,在常温下,是液体;到了零下,水就变成冰,成了固体;而温度上升到一百度,水又变成了水蒸气。但其本质仍是H2O。

Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。不过,加法法则和实数域上的差不多,请读者自行对比。

1 无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P
2 P(x,y)的负元是 (x,-y),有P+(-P)= O∞
3 P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系:
x3≡k2-x1-x2(mod p)
y3≡k(x1-x3)-y1(mod p)
其中若P=Q 则 k=(3×2+a)/2y1 若P≠Q,则k=(y2-y1)/(x2-x1)


例5.1 已知E23(1,1)上两点P(3,10),Q(9,7),求1)-P,2)P+Q,3) 2P。
解 1) –P的值为(3,-10)
2) k=(7-10)/(9-3)=-1/2,2的乘法逆元为12 因为2*12≡1 (mod 23)
k≡-1*12 (mod 23) 故 k=11。
x=112-3-9=109≡17 (mod 23);
y=11[3-(-6)]-10=89≡20 (mod 23)
故P+Q的坐标为(17,20)
3) k=[3(32)+1]/(2*10)=1/4≡6 (mod 23)
x=62-3-3=30≡20 (mod 23)
y=6(3-7)-10=-34≡12 (mod 23)
故2P的坐标为(7,12)

最后,我们讲一下椭圆曲线上的点的阶。
如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的 阶,若n不存在,我们说P是无限阶的。
事实上,在有限域上定义的椭圆曲线上所有的点的阶n都是存在的(证明,请参考近世代数方面的书)


练习:
1 求出E11(1,6)上所有的点。
2 已知E11(1,6)上一点G(2,7),求2G到13G所有的值。


六、椭圆曲线上简单的加密/解密

公开密钥算法总是要基于一个数学上的难题。比如RSA 依据的是:给定两个素数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。那椭圆曲线上有什么难题呢?

考虑如下等式:
K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数]
不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。
这就是椭圆曲线加密算法采用的难题。我们把点G称为基点(base point),k(k<n,n为基点G的阶)称为私有密钥(privte key),K称为公开密钥(public key)。

现在我们描述一个利用椭圆曲线进行加密通信的过程:

1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
2、用户A选择一个私有密钥k,并生成公开密钥K=kG。
3、用户A将Ep(a,b)和点K,G传给用户B。
4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r<n)。
5、用户B计算点C1=M+rK;C2=rG。
6、用户B将C1、C2传给用户A。
7、用户A接到信息后,计算C1-kC2,结果就是点M。因为
C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再对点M进行解码就可以得到明文。

在这个加密通信中,如果有一个偷窥者H ,他只能看到Ep(a,b)、K、G、C1、C2 而通过K、G 求k 或通过C2、G求r 都是相对困难的。因此,H无法得到A、B间传送的明文信息。



密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:
T=(p,a,b,G,n,h)。
(p 、a 、b 用来确定一条椭圆曲线,
G为基点,
n为点G的阶,
h 是椭圆曲线上所有点的个数m与n相除的整数部分)

这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;
2、p≠n×h;
3、pt≠1 (mod n),1≤t<20;
4、4a3+27b2≠0 (mod p);
5、n 为素数;
6、h≤4。


七、椭圆曲线在软件注册保护的应用

我们知道将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机。下面,将简介一种利用Fp(a,b)椭圆曲线进行软件注册的方法。


软件作者按如下方法制作注册机(也可称为签名过程)

1、选择一条椭圆曲线Ep(a,b),和基点G;
2、选择私有密钥k(k<n,n为G的阶),利用基点G计算公开密钥K=kG;
3、产生一个随机整数r(r<n),计算点R=rG;
4、将用户名和点R的坐标值x,y作为参数,计算SHA(Secure Hash Algorithm 安全散列算法,类似于MD5)值,即Hash=SHA(username,x,y);
5、计算sn≡r – Hash * k (mod n)
6、将sn和Hash作为 用户名username的序列号

软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K)

1、从用户输入的序列号中,提取sn以及Hash;
2、计算点R≡sn*G+Hash*K ( mod p ),如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y)的坐标,因为
sn≡r-Hash*k (mod n)
所以
sn*G + Hash*K
=(r-Hash*k)*G+Hash*K
=rG-Hash*kG+Hash*K
=rG- Hash*K+ Hash*K
=rG=R ;
3、将用户名和点R的坐标值x,y作为参数,计算H=SHA(username,x,y);
4、如果H=Hash 则注册成功。如果H≠Hash ,则注册失败(为什么?提示注意点R与Hash的关联性)。

简单对比一下两个过程:
作者签名用到了:椭圆曲线Ep(a,b),基点G,私有密钥k,及随机数r。
软件验证用到了:椭圆曲线Ep(a,b),基点G,公开密钥K。
Cracker要想制作注册机,只能通过软件中的Ep(a,b),点G,公开密钥K ,并利用K=kG这个关系获得k后,才可以。而求k是很困难的。


练习:
下面也是一种常于软件保护的注册算法,请认真阅读,并试回答签名过程与验证过程都用到了那些参数,Cracker想制作注册机,应该如何做。

软件作者按如下方法制作注册机(也可称为签名过程)
1、选择一条椭圆曲线Ep(a,b),和基点G;
2、选择私有密钥k(k<n),利用基点G计算公开密钥K=kG;
3、产生一个随机整数r(r<n),计算点R(x,y)=rG;
4、将用户名作为参数,计算Hash=SHA(username);
5、计算 x’=x (mod n)
6、计算sn≡(Hash+x’*k)/r (mod n)
7、将sn和x’作为 用户名username的序列号

软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K)
1、从用户输入的序列号中,提取sn以及x’;
2、将用户名作为参数,计算Hash=SHA(username);
3、计算 R=(Hash*G+x’*K)/sn,如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y),因为
sn≡(Hash+x’*k)/r (mod n)
所以
(Hash*G+x’*K)/sn
=(Hash*G+x’*K)/[(Hash+x’*k)/r]
=(Hash*G+x’*K)/[(Hash*G+x’*k*G)/(rG)]
=rG*[(Hash*G+x’*K)/(Hash*G+x’*K)]
=rG=R (mod p)
4、v≡x (mod n)
5、如果v=x’ 则注册成功。如果v≠x’ ,则注册失败。


八、结语

历经半个多月断断续续的写作,这篇拙作终于算告一段落了。为写这篇文章,我查了大量的资料,但为了使文章更通俗易懂,我尽量避免涉及专业术语,F2n域上的椭圆曲线本文也没有涉及。不过,一些名词描述的可能还不太精确,希望众读者对文章的问题,多多批评指正。我也仅仅把这篇文章作为初稿,我会不断修订他的。最后感谢看雪、Sunbird、CCG以及看雪论坛所有成员对我的支持,感谢一切帮助过我的人,没有你们的鼓励,这篇文章我是没有动力写完的,谢谢,谢谢大家!

<全文完>


主要参考文献

张禾瑞,《近世代数基础》,高等教育出版社,1978
闵嗣鹤 严士健,《初等数论》,高等教育出版社,1982
段云所,《网络信息安全》第三讲,北大计算机系
Michael Rosing ,chapter5《Implementing Elliptic Curve Cryptography》,Softbound,1998
《SEC 1: Elliptic Curve Cryptography》,Certicom Corp.,2000
《IEEE P1363a / D9》,2001
说真的,如果发贴子,要多发象“ECC加密算法入门介绍”这样的,你知道这篇文章有多珍贵!ZMWorm 曾向我询问过是否知道一些加密算法的理论出发点文章,我都以各种理由推托了。因为这些东西是受专利权严格保护的!不要说你想了解它的理论,就是用一用现成的代码都得向他缴授权费!在国外Cracker想搞到这些东西,是需要花大价钱雇商业间谍偷才能得到的!更是鲜有公布的!!!可以说这篇文章字字值千金呀!
推荐一本书《计算机密码学——计算机网络中的数据保密与安全》 卢开澄 编著 清华大学出版社
椭圆曲线密码算法介绍
一种相对比较新的技术–椭圆曲线加密系统,已经逐渐被人们用做基本的数字签名系统。
椭圆曲线作为数字签名的基本原理大致和RSA与DSA的功能相同,并且数字签名的产生与认
证的速度要比RSA和DSA快。下面我们简单的介绍一下椭圆曲线和椭圆曲线上的密码算法。
1. 有限域上的椭圆曲线
设K表示一个有限域,E是域K上的椭圆曲线,则E是一个点的集合:
E/K = { ( x, y ) | y2+ a1xy + a3y = x3 + a2×2 + a4x + a6,
a1, a3, a2, a4, a6 x, y K } { O } 其中O表示无穷远点。
在E上定义‘+’运算,P + Q = R,R是过P、Q的直线与曲线的另一交点关于x轴的对称点,
当P = Q时R是P点的切线与曲线的另一交点关于x轴的对称点。这样,( E, + )构成可换群
( Abel群),O是加法单位元(零元)。
椭圆曲线离散对数问题(ECDLP)定义如下:给定定义在K上的椭圆曲线E,一个n阶的点P
E/K,和点Q E/ K,如果存在l,确定整数l, 0 l n – 1, Q = lP。我们知道,RSA是基于因
子分解,其算法的核心就是如何寻找大叔的因子分解,但ECDLP是比因子分解难得多的问题

椭圆曲线上的加法: P + Q = R
椭圆曲线上一点的2倍: P + P = R.
2. 椭圆曲线上的密码算法
基于该难题,1985年N.Koblitz和Miller提出将椭圆曲线用于密码算法,分别利用有限域上
椭圆曲线的点构成的群实现了离散对数密码算法。在《数字签名分析和实现》中详细地介
绍过的DSA算法,被广泛应用在椭圆曲线上的变化,称为椭圆曲线数字签名算法ECDSA,由
IEEE工作组和ANSI(Amercian National Standards Institute)X9组织开发。随即展开了
椭圆曲线密码学研究,除椭圆曲线外,还有人提出在其它类型的曲线如超椭圆曲线上实现
公钥密码算法。其根据是有限域上的椭圆曲线上的点群中的离散对数问题ECDLP。ECDLP是
比因子分解问题更难的问题,许多密码专家认为它是指数级的难度。从目前已知的最好求
解算法来看,160比特的椭圆曲线密码算法的安全性相当于1024比特的RSA算法。
此后,有人在椭圆曲线上实现了类似ElGamal的加密算法,以及可恢复明文的数字签名方案
。除有限域上的椭圆曲线密码算法外,人们还探索了在椭圆曲线上实现RSA算法,如KMOV等

3.椭圆曲线密码算法的发展
RSA算法是大家熟悉的公钥密码算法,用它可以实现数字签名,PGP软件用到的就是RSA算法
。RSA算法是基于大数的因子分解难题,由于计算水平的提高,人们逐渐可以用计算机分解
更大的数。因此RSA算法的密钥也就越来越长。在电子商务的SET协议中,规定用户使用10
24比特的RSA密钥,认证中心CA使用2048比特的RSA密钥。长密钥带来两个问题,一是运算
速度较慢,另一个是密钥存储和管理问题。如果用16位的IC卡实现电子钱包,使用1024比
特的RSA算法速度就很慢,要以秒计算。而固化RSA算法的IC卡或32位的IC卡价格则较贵。
椭圆曲线加密系统由很多依赖于离散算法问题的加密系统组成,DSA就是一个很好的例子,
成,DSA就是一个很好的例子,
DSA是以离散对数为基础的算法。椭圆曲线数字签名系统已经被研究了很多年并创造了很多
商业价值。
由于其自身优点,椭圆曲线密码学一出现便受到关注。现在密码学界普遍认为它将替代RS
A成为通用的公钥密码算法,SET( Secure Electronic Transactions )协议的制定者已把
它作为下一代SET协议中缺省的公钥密码算法,目前已成为研究的热点,是很有前途的研究
方向。
应用椭圆曲线的数字签名同时可以很容易地使用到小的有限资源的设备中例如:小卡(信
用卡大小的包含有微小处理芯片的塑料卡片)。椭圆曲线上的密码算法速度很快,分别在
32位的PC机上和16位微处理器上实现了快速的椭圆曲线密码算法,其中16位微处理器上的
EDSA数字签名不足500ms。