算法非正式
㈠ 未来的电脑会是什么样子
写作思路:写作时从大处着手,尽量阐述自己的看法或者思想,全面详雀老细的解答问题,并且紧扣问题的中心,把要表达的内容完整表述出来。
不久的将来,会出现一种电脑.它的功能奇异,主要毕改有七大特点,竟是些什么特点呢?让我来告诉你吧!
它的第一特点是它不用手操做,只要说就可以了;
第二特点是他没有笨重的身体,它的外形只是个耳机,上面连这个电脑眼镜,你戴上它会很舒服;
第三特点是它可以折叠手岁判,如果不用了可以把它折叠后装起来,只需要一个一立方分米的盒子;
第四特点是它既能打电话也能无限上网;
第五特点是它可以当雷达,可以发现什么东西靠近你了,是用卫星发射的;
第六特点是当它调到车内状态时,它可以发现近一公里以内所有的警察以及摄相头,你发现它亮了,你就开慢点,预防被警察罚超速,或被摄像头拍下来,也是用卫星发射的;
第七特点是它可以无限收看全球各个台,未来的电脑。
有了这种电脑,那生活将是多么多姿多彩呀!它能给人带来许多方便之处。但是,它是需要人去发明的。不论是十年、二十年、三十年……不论多少年,我相信,它一定会被发明出来的。
未来的东西一定都很奇妙,也许不久就会有更先进、更完美的电脑被人们发明出来。
㈡ 计算机的未来会是什么样的
假设你打算买辆新车,销售人员说:“你知道吗,这款车不光可以在路上开。”
“喔?”
“真的,你还可以用它做咐腔誉其他事。比如,这样折叠起来就是一辆不错的自行车。打开能变成一架一流的飞机。浸在水里的时候就是潜水艇。还能变身宇宙飞船哟!”
你肯定以为销售在逗你玩。不过世界上确实存在着可塑性如此高的事物,那就是计算机。我们用飞行模拟器飞跃自由女神像,用电子表格进行财务分析,用Facebook和朋友聊天,除此之外计算机还有各种各样其他用途。计算机就如同一台既是汽车又是自行车还是宇宙飞船的万能神器。
广义相对论就更棘手了。广义相对论允许奇点的存在,而奇点割裂时空的方式至今仍无人能解。纵然一干相对论者已开发出模拟某些特定物理情境的诸多技术,就我所知,还没有人对如何有效模拟广义相对论做出过完整和系统的分析。这仍然是一个悬而未决的迷人课题。
学者赫伯特·西蒙在他的着作《人工的科学》中将科学做了区分。他将科学分为物理学和生物学这种研究自然生成系统的科学;与计算机科学和经济学这种研究人造系统的科学。
乍看起来,人工科学应该属于自然科学的特例。但正如多伊奇原理所指出的,计算机这样的人工系统中蕴含的特质也许正如自然生成的系统一样丰富。想象一下,我们不仅可以用计算机模拟人类的物理定律,或许甚至可以模拟其他的物理实在。用计算机科学家艾伦·凯伊的话说,“就自然科学而言,大自然给了我们一个世界,我们来发掘它的定律。就计算机而言,我们将定律装进机器中,创造出一个世界。”多伊奇原理为统一自然科学与人工科学架设了一道桥梁。令人振奋的是,我们就快要证明出这一基本科学原理了。
文章来源:Quanta Magazine
文章作者:Michael Nielsen
编译:未来论坛 商白
文章转载请注明出处为 “未来论坛”微信账号(ID:futureforum)
㈢ 世纪的算法是什么
世纪的算法是在年份的前两位数加一,例如1990年,19+1等于20,即1990年为20世纪。
一个世纪代表一百年,通常是指连续的一百年。当用来计算日子时,世纪通常从可以被100整除的年代或此后一年开始,例如2000年或2001年。
这种奇数的纪年法来自于耶稣纪元后,其中的1年通常表示“吾主之年”(year of our lord),因此一世纪从公元1年到公元100年,而二十世纪则从公元1901年到公元2000年,因此2001年是二十一世纪的第一年。
世纪的开始和结束:
尽管一个世纪可以表示任何 100年的任意时期,但对于标准世纪的性质有两种观点。一种是基于严格的建设,一种是基于大众的认知。
根据严格的结构,公元1世纪始于公元1年,结束于公元100年,公元2世纪跨越101年至200年,同样的模式继续向前。在这个模型中,第n个世纪以“01”结束的年份开始,以“00”结束的年份结束;例如,20 世纪包括严格使用的1901 年至2000年。
在普遍的看法和实践中,世纪是通过基于共享“数百”位数字来分组年份来构建的。
在这个模型中,'n'世纪以“00”结尾的年份开始,以“99”结尾的年份结束;例如,1900 年到1999 年,在流行文化中,构成了 20 世纪。(这类似于共享“十”位 的“0 到 9 十年”的分组。)
为了便于计算机计算历法,天文年份编号和ISO 8601系统都包含零年,天文年 0 对应公元前 1 年,天文年 -1 对应公元前 2 年,以此类推。
替代命名系统
非正式地,可以根据一年中的数百个部分分组引用年份。在这个系统中,1900-1999 年被称为十九世纪(1900 年代)。除英语使用外,该系统还用于瑞典语、丹麦语、挪威语、冰岛语、芬兰语和匈牙利语。
瑞典语nittonhundratalet(或1900-talet)、丹麦语nittenhundretallet(或1900-tallet )、挪威语nittenhundretallet(或1900-tallet );
芬兰语tuhatyhdeksänsataaluku(或1900-luku)和匈牙利语ezerkilencszázas évek(或1900-as évek)明确指代 1900-1999 年。
意大利语也有类似的系统,但它只表示数百而省略了“千”一词。该系统主要作用于 11 世纪至 20 世纪:
1、ilQuattrocento(即“四百”,15世纪)
2、ilCinquecento(即“五百”,16世纪)。
当提到意大利的历史时,这些术语经常在其他语言中使用。
㈣ 如何学好hac函数与sha256算法
SHA 家族
SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而现在的人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。
SHA-0 和 SHA-1
最初载明的算法于 1993年发布,称做安全散列标准 (Secure Hash Standard),FIPS PUB 180。这个版本现在常被称为 "SHA-0"。它在发布之后很快就被 NSA 撤回,并且以 1995年发布的修订版本 FIPS PUB 180-1 (通常称为 "SHA-1") 取代。根据 NSA 的说法,它修正了一个在原始算法中会降低密码安全性的错误。然而 NSA 并没有提供任何进一步的解释或证明该错误已被修正。1998年,在一次对 SHA-0 的攻击中发现这次攻击并不能适用于 SHA-1 — 我们不知道这是否就是 NSA 所发现的错误,但这或许暗示我们这次修正已经提升了安全性。SHA-1 已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它现在被认为是安全的。
SHA-0 和 SHA-1 会从一个最大 2^64 位元的讯息中产生一串 160 位元的摘要然后以设计 MD4 及 MD5 讯息摘要算法的 MIT 教授 Ronald L. Rivest 类似的原理为基础来加密。
SHA-0 的密码分析
在 CRYPTO 98 上,两位法国研究者展示了一次对 SHA-0 的攻击 (Chabaud and Joux, 1998): 散列碰撞可以复杂到 2^61 时被发现;小于 2^80 是理想的相同大小散列函数。
2004年时,Biham 和 Chen 发现了 SHA-0 的近似碰撞 — 两个讯息可以散列出相同的数值;在这种情况之下,142 和 160 位元是一样的。他们也发现了 SHA-0 在 80 次之后减少到 62 位元的完整碰撞。
2004年8月12日,Joux, Carribault, Lemuet 和 Jalby 宣布了完整 SHA-0 算法的散列碰撞。这是归纳 Chabaud 和 Joux 的攻击所完成的结果。发现这个碰撞要复杂到 2^51, 并且用一台有 256 颗 Itanium2 处理器的超级电脑耗时大约 80,000 CPU 工作时 。
2004年8月17日,在 CRYPTO 2004 的 Rump 会议上,Wang, Feng, Lai, 和 Yu 宣布了攻击 MD5、SHA-0 和其他散列函数的初步结果。他们对 SHA-0 攻击复杂到 2^40,这意味着他们攻击的成果比 Joux 还有其他人所做的更好。该次 Rump 会议的简短摘要可以在 这里找到,而他们在 sci.crypt 的讨论,例如: 这些结果建议计划使用 SHA-1 作为新的密码系统的人需要重新考虑。
更长的变种
NIST 发布了三个额外的 SHA 变体,每个都有更长的讯息摘要。以它们的摘要长度 (以位元计算) 加在原名后面来命名:"SHA-256", "SHA-384" 和 "SHA-512"。它们发布于 2001年的 FIPS PUB 180-2 草稿中,随即通过审查和评论。包含 SHA-1 的 FIPS PUB 180-2,于 2002年以官方标准发布。这些新的散列函数并没有接受像 SHA-1 一样的公众密码社群做详细的检验,所以它们的密码安全性还不被大家广泛的信任。2004年2月,发布了一次 FIPS PUB 180-2 的变更通知,加入了一个额外的变种 "SHA-224",定义了符合双金钥 3DES 所需的金钥长度。
Gilbert 和 Handschuh (2003) 研究了新的变种并且没有发现弱点。
SHAd
SHAd 函数是一个简单的相同 SHA 函数的重述:
SHAd-256(m)=
㈤ 谁能介绍一下鬼魂算法
所谓"鬼魂算法",是一个非正式名称,网络上都搜不到,也即把蚂蚁视作鬼魂,可以彼此穿过对方的身体.
有一根27厘米的细木杆,渗郑在第3厘米、7厘米、11厘米、17厘米、23厘米丛型颂这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。租颂开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
㈥ 人工智能需要什么基础
人工智能是多学科,涵盖计算理论,数学基础,计算机编程,涵盖基因组或生物信息学,计算机非正式推理,模式滚尘识别,统计算法建模和解决。
在统计,机械推理,认知科学,生物学,工程学等中找到协同作用,从中发展实际应用。
第四次工业革命给人工智能带来了前所未有的机遇。已经熟悉的比如,机器人下棋,机器人可做一些工厂重复性作业。在人工智能基础知识中,可能会包括机器算法、计算理论,贝叶斯推理,贝叶斯网络,规划算法,机器函数语言,概率编程语言,计算机视觉,统计模式识别,信息理论,药物,视网膜眼科学,细胞蛋白质组学习。推理如计算建模,特尺宽别在数学方面,类计算,自动推理,图形推理,知识表示,定理证明,认知科学,机器学习,人际互动等方面。
初学者:掌握一门编程语言,编程语言好似与机器人交流,编程语言能让机器人完成一系列具体的动作或实验。算法包括递归,概率,随机,堆排序,线性排序,很像是数据结构中的二叉树那样的算法内容等。具体好像是建立一个模型,编写一段程大困禅序,机器人完成一系列动作应用在生产生活各个领域。
㈦ 伪算法是什么意思
伪算法即伪代码
概述:
伪码(Pseudocode)是一种算法描述语言。使用伪码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。使用伪代码, 不用拘泥于具体实现。相比程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。
定义
人们在用不同的编程语言实现同一个算法时意识到,他们的实现(注意:这里是实现,不是功能)很不同。尤其是对于那些熟练于不同编程语言的程序员要理解一个(用其他编程语言编写的程序的)功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。这样伪代码就应运而生了。伪代码提供了更多的设计信息,每一个模块的描述都必须与设计结构图一起出现。伪代码是一种非正式的,类似于英语结构的,用于描述模块结构图的语言。
应用领域
当考虑算法功能(而不是其语言实现)时,伪码常常得到应用。伪码中常被用于技术文档和科学出版物中来表示算法,也被用于在软件开发的实际编码过程之前表达程序的逻辑。伪代码不是用户和分析师的工具,而是设计师和程序员的工具。计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解。
综上,简单地说,让人便于理解的代码。不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。在数据结构讲算法的时候用的很多。伪代码用来表达程序员开始编码前的想法。
㈧ 伪代码是什么意思
伪代码是一种非正式的,类似于英语结构的,用来描述模块结构图的语言。它是半角式化、不标准的语言,可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种熟悉的文字,关键是把程序的意思表达出来)描述出来。
使用伪代码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。使用伪代码, 不用拘泥于具体实现。
简单示例:输入3个数,打印输出其中最大的数。可用如下的伪代码表示:
Begin(算法开始)
输入 A,B,C
IF A>B 则 A→Max
否则 B→Max
IF C>Max 则 C→Max
Print Max
End (算法结束)
(8)算法非正式扩展阅读
伪代码应用领域
伪代码中常被用于技术文档和科学出版物中来表示算法,也被用于在软件开发的实际编码过程之前表达程序的逻辑。伪代码不是用户和分析师的工具,而是设计师和程态裤腊序员的工具。计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解。当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。
伪代码只是像流程图一样用在程序设计的初期,帮助写出程序流程。如果把全部的程序流程写下来必定可能会浪费很多时间,那么这个时候可以采用伪代码方式。
简单地说,伪代码是让人便于理解的代码,是不依赖于语言的,用来表示程纯渗序帆滑执行过程,而不一定能编译运行的代码。
㈨ 了解数字编码的途径工作需要
了解数字编码的途径工作需要
对数字编码记忆法旦扒枯有所了解的人都知道,编码是数字记忆的重点,要求结合自己的喜好编制一套编码系统就好,那么如何编制一套适合我记忆的编码,老师跟你们分享一下几种编制的方法。
常见的数字记忆法:谐音记忆法、形象转化法和意义转化法。而且,这三种记忆法也是编码的思路非常容易学习和理解。
当你开始学习编程时,你可能会问自己的一个问题是“我应该先学习什么语言?
关于学习编码,最令人兴奋-有时甚至是压倒性的事情之一就是要学习多少东西。
但是,它不仅可以专注于学习一项特定的技术,还可以帮助学习基础 - 构建块。您可以剥离抽象层,以了解所有技术共同的基本原则。
在基本层面上了解什么是编码将使解决问题更容易,并让您更好地了解不同技术的工作原理。
本文介绍了计算机编码的基础知识以及由哪些程序组成,同时还给出了一些有关模洞如何开始学习如何编码的第一步的建议。
什么是编码?初学者的定义
计算机编码,也称为计算机编程,是一种告诉计算机该做什么的方法。
编码是一种告诉计算机它应该如何表现的方法 - 它需要采取的确切行动以及如何以有效和高效的方式采取这些行动。
具体来说,编码是创建然后向计算机提供一组详细的指令的过程,这些指令将按顺序仔细执行。
指令集称为程序或代码。
计算机是非常聪明的机器,但它们依靠人类来完成工作。
简而言之,编码是人类与计算机通信的艺术。它帮助我们解决问题并为社区创建有用的新工具,例如应用程序或网站,并使我们能够分析和处理大量数据。
编码过程概述
编码就是解决问题。
在编写代码时,您将使用逻辑推理将问题分解为越来越小的行动步骤,以最终得出结论和解决方案。
计算机从字面上理解一切,并极其注重细节。
在代码中犯一个小错误 - 例如单词中的拼写错误,错过的分号,告诉计算机重复某个操作,但不告诉它如何以及何时停止重复它 - 都会导致错误消息。
这些错误称为代码中的 bug。
识别可能的错误,找到导致问题的原因,然后修复错误以使代码按预期工作的过程称为调试。
这是编写代码和学习如何编写代码的关键部分。
为什么算法在编码中很重要
弄清楚给计算机的确切指令,以便它可以完成特定的任务,这是编码和解决问题最困难的部分。
计算机不做任何假设,它们完全按照他们被告知的方式做。这意味着他们收到的指令中不应该有歧义。
指令需要明确定义,并具有计算机解决问题应采取的正确步骤的数量和顺序。
用于解决问题和计算机完成每个任务的分步有序指令集称为算法。
算法是需要正确,高效,精确和切中要害的行动序列,它们不应该留下误解的余地。
算法不仅保留给计算机遵循。人类每天也使用算法。
我们经常使用的一种算法的一个例子是遵循烹饪食谱。
配方就是算法。您需要按照正确的顺序遵循配方中的一系列步骤,以获得所需的最终结果。
如何编写伪代码来规划算法
组织,提前计划并写下您需要遵循的步骤或算法的方法是首先编写伪代码。
伪代码是表示算法的非正式方式。
伪代码没有特定的语法。它使用一些技术术语,用简单易读的英语(或任何其他自然的人类语言)编写。
编写它的目的只是为了让程序员使用简单的短语来理解需要编写的代码/步骤背后的推理和逻辑,以解决问题。
这样做之后,程序员编写由计算机实际执行的代码。
伪代码是计算机代码的更简单版本,是编写任何计算机代码之前的第一步。
例如,假设您要编写一个程序,该程序要求用户输入密码并检查它是否等于“1234”。
如果密码等于“1234”此稿,那么你就让他们进入系统,否则他们就会被拒绝。
㈩ 公钥密码系统及RSA公钥算法
公钥密码系统及RSA公钥算法
本文简单介绍了公开密钥密码系统的思想和特点,并具体介绍了RSA算法的理论基础,工作原理和具体实现过程,并通过一个简单例子说明了该算法是如何实现。在本文的最后,概括说明了RSA算法目前存在的一些缺点和解决方法。
关键词:公钥密码体制 , 公钥 ,私钥 ,RSA
§1引言
随着计算机联网的逐步实现,Internet前景越来越美好,全球经济发展正在进入信息经济时代,知识经济初见端倪。计算机信息的保密问题显得越来越重要,无论是个人信息通信还是电子商务发展,都迫切需要保证Internet网上信息传输的安全,需要保证信息安全。信息安全技术是一门综合学科,它涉及信息论、计算机科学和密码学等多方面知识,它的主要任务是研究计算机系统和通信网络内信息的保护方法以实现系统内信息的安全、保密、真实和完整。其中,信息安全的核心是密码技术。密码技术是集数学、计算机科学、电子与通信等诸多学科于一身的交叉学科。它不仅能够保证机密性信息的加密,而且能够实现数字签名、身份验证、系统安全等功能。是现代化发展的重要科学之一。本文将对公钥密码系统及该系统中目前最广泛流行的RSA算法做一些简单介绍。
§2公钥密码系统
要说明公钥密码系统,首先来了解一下不同的加密算法:目前的加密算法按密钥方式可分为单钥密码算法和公钥密码算法。
2.1.单钥密码
又称对称式密码,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
单钥密码系统的安全性依赖于以下两个因素:第一,加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的;第二,加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
从单钥密码的这些特点我们容易看出它的主要问题有两点:第一,密钥量问题。在单钥密码系统中,每一对通信者就需要一对密钥,当用户增加时,必然会带来密钥量的成倍增长,因此在网络通信中,大量密钥的产生﹑存放和分配将是一个难以解决的问题。第二,密钥分发问题。单钥密码系统中,加密的安全性完全依赖于对密钥的保护,但是由于通信双方使用的是相同的密钥,人们又不得不相互交流密钥,所以为了保证安全,人们必须使用一些另外的安全信道来分发密钥,例如用专门的信使来传送密钥,这种做法的代价是相当大的,甚至可以说是非常不现实的,尤其在计算机网络环境下,人们使用网络传送加密的文件,却需要另外的安全信道来分发密钥,显而易见,这是非常不智是甚至是荒谬可笑的。
2.2公钥密码
正因为单钥密码系统存在如此难以解决的缺点,发展一种新的﹑更有效﹑更先进的密码体制显得更为迫切和必要。在这种情况下,出现了一种新的公钥密码体制,它突破性地解决了困扰着无数科学家的密钥分发问题,事实上,在这种体制中,人们甚至不用分发需要严格保密的密钥,这次突破同时也被认为是密码史上两千年来自单码替代密码发明以后最伟大的成就。
这一全新的思想是本世纪70年代,美国斯坦福大学的两名学者Diffie和Hellman提出的,该体制与单钥密码最大的不同是:
在公钥密码系统中,加密和解密使用的是不同的密钥(相对于对称密钥,人们把它叫做非对称密钥),这两个密钥之间存在着相互依存关系:即用其中任一个密钥加密的信息只能用另一个密钥进行解密。这使得通信双方无需事先交换密钥就可进行保密通信。其中加密密钥和算法是对外公开的,人人都可以通过这个密钥加密文件然后发给收信者,这个加密密钥又称为公钥;而收信者收到加密文件后,它可以使用他的解密密钥解密,这个密钥是由他自己私人掌管的,并不需要分发,因此又成称为私钥,这就解决了密钥分发的问题。
为了说明这一思想,我们可以考虑如下的类比:
两个在不安全信道中通信的人,假设为Alice(收信者)和Bob(发信者),他们希望能够安全的通信而不被他们的敌手Oscar破坏。Alice想到了一种办法,她使用了一种锁(相当于公钥),这种锁任何人只要轻轻一按就可以锁上,但是只有Alice的钥匙(相当于私钥)才能够打开。然后Alice对外发送无数把这样的锁,任何人比如Bob想给她寄信时,只需找到一个箱子,然后用一把Alice的锁将其锁上再寄给Alice,这时候任何人(包括Bob自己)除了拥有钥匙的Alice,都不能再打开箱子,这样即使Oscar能找到Alice的锁,即使Oscar能在通信过程中截获这个箱子,没有Alice的钥匙他也不可能打开箱子,而Alice的钥匙并不需要分发,这样Oscar也就无法得到这把“私人密钥”。
从以上的介绍可以看出,公钥密码体制的思想并不复杂,而实现它的关键问题是如何确定公钥和私钥及加/解密的算法,也就是说如何找到“Alice的锁和钥匙”的问题。我们假设在这种体制中, PK是公开信息,用作加密密钥,而SK需要由用户自己保密,用作解密密钥。加密算法E和解密算法D也都是公开的。虽然SK与PK是成对出现,但却不能根据PK计算出SK。它们须满足条件:
①加密密钥PK对明文X加密后,再用解密密钥SK解密,即可恢复出明文,或写为:DSK(EPK(X))=X
②加密密钥不能用来解密,即DPK(EPK(X))≠X
③在计算机上可以容易地产生成对的PK和SK。
④从已知的PK实际上不可能推导出SK。
⑤加密和解密的运算可以对调,即:EPK(DSK(X))=X
从上述条件可看出,公开密钥密码体制下,加密密钥不等于解密密钥。加密密钥可对外公开,使任何用户都可将传送给此用户的信息用公开密钥加密发送,而该用户唯一保存的私人密钥是保密的,也只有它能将密文复原、解密。虽然解密密钥理论上可由加密密钥推算出来,但这种算法设计在实际上是不可能的,或者虽然能够推算出,但要花费很长的时间而成为不可行的。所以将加密密钥公开也不会危害密钥的安全。
这种体制思想是简单的,但是,如何找到一个适合的算法来实现这个系统却是一个真正困扰密码学家们的难题,因为既然Pk和SK是一对存在着相互关系的密钥,那么从其中一个推导出另一个就是很有可能的,如果敌手Oscar能够从PK推导出SK,那么这个系统就不再安全了。因此如何找到一个合适的算法生成合适的Pk和SK,并且使得从PK不可能推导出SK,正是迫切需要密码学家们解决的一道难题。这个难题甚至使得公钥密码系统的发展停滞了很长一段时间。
为了解决这个问题,密码学家们考虑了数学上的陷门单向函数,下面,我们可以给出它的非正式定义:
Alice的公开加密函数应该是容易计算的,而计算其逆函数(即解密函数)应该是困难的(对于除Alice以外的人)。许多形式为Y=f(x)的函数,对于给定的自变量x值,很容易计算出函数Y的值;而由给定的Y值,在很多情况下依照函数关系f (x)计算x值十分困难。这样容易计算但难于求逆的函数,通常称为单向函数。在加密过程中,我们希望加密函数E为一个单项的单射函数,以便可以解密。虽然目前还没有一个函数能被证明是单向的,但是有很多单射函数被认为是单向的。
例如,有如下一个函数被认为是单向的,假定n为两个大素数p和q的乘积,b为一个正整数,那么定义f:
f (x )= x b mod n
(如果gcd(b,φ(n))=1,那么事实上这就是我们以下要说的RSA加密函数)
如果我们要构造一个公钥密码体制,仅给出一个单向的单射函数是不够的。从Alice的观点来看,并不需要E是单向的,因为它需要用有效的方式解密所收到的信息。因此,Alice应该拥有一个陷门,其中包含容易求出E的你函数的秘密信息。也就是说,Alice可以有效解密,因为它有额外的秘密知识,即SK,能够提供给你解密函数D。因此,我们称一个函数为一个陷门单向函数,如果它是一个单向函数,并在具有特定陷门的知识后容易求出其逆。
考虑上面的函数f (x) = xb mod n。我们能够知道其逆函数f -1有类似的形式f (x ) = xa mod n,对于合适的取值a。陷门就是利用n的因子分解,有效的算出正确的指数a(对于给定的b)。
为方便起见,我们把特定的某类陷门单向函数计为?。那么随机选取一个函数f属于?,作为公开加密函数;其逆函数f-1是秘密解密函数。那么公钥密码体制就能够实现了。
根据以上关于陷门单向函数的思想,学者们提出了许多种公钥加密的方法,它们的安全性都是基于复杂的数学难题。根据所基于的数学难题,至少有以下三类系统目前被认为是安全和有效的:大整数因子分解系统(代表性的有RSA)、椭园曲线离散对数系统(ECC)和离散对数系统(代表性的有DSA)。
§3 RSA算法
3.1简介
当前最着名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。其名称来自于三个发明者的姓名首字母。它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的着名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。
RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。
该算法基于下面的两个事实,这些事实保证了RSA算法的安全有效性:
1)已有确定一个数是不是质数的快速算法;
2)尚未找到确定一个合数的质因子的快速算法。
3.2工作原理
1)任意选取两个不同的大质数p和q,计算乘积r=p*q;
2)任意选取一个大整数e,e与(p-1)*(q-1)互质,整数e用做加密密钥。注意:e的选取是很容易的,例如,所有大于p和q的质数都可用。
3)确定解密密钥d:d * e = 1 molo(p - 1)*(q - 1) 根据e、p和q可以容易地计算出d。
4)公开整数r和e,但是不公开d;
5)将明文P (假设P是一个小于r的整数)加密为密文C,计算方法为:
C = Pe molo r
6)将密文C解密为明文P,计算方法为:
P = Cd molo r
然而只根据r和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。
3.3简单实例
为了说明该算法的工作过程,我们下面给出一个简单例子,显然我们在这只能取很小的数字,但是如上所述,为了保证安全,在实际应用上我们所用的数字要大的多得多。
例:选取p=3, q=5,则r=15,(p-1)*(q-1)=8。选取e=11(大于p和q的质数),通过d * 11 = 1 molo 8,计算出d =3。
假定明文为整数13。则密文C为
C = Pe molo r
= 1311 molo 15
= 1,792,160,394,037 molo 15
= 7
复原明文P为:
P = Cd molo r
= 73 molo 15
= 343 molo 15
= 13
因为e和d互逆,公开密钥加密方法也允许采用这样的方式对加密信息进行"签名",以便接收方能确定签名不是伪造的。
假设A和B希望通过公开密钥加密方法进行数据传输,A和B分别公开加密算法和相应的密钥,但不公开解密算法和相应的密钥。A和B的加密算法分别是ECA和ECB,解密算法分别是DCA和DCB,ECA和DCA互逆,ECB和DCB互逆。 若A要向B发送明文P,不是简单地发送ECB(P),而是先对P施以其解密算法DCA,再用加密算法ECB对结果加密后发送出去。
密文C为:
C = ECB(DCA(P))
B收到C后,先后施以其解密算法DCB和加密算法ECA,得到明文P:
ECA(DCB(C))
= ECA(DCB(ECB(DCA(P))))
= ECA(DCA(P))/*DCB和ECB相互抵消*/
=
P /*DCB和ECB相互抵消*/
这样B就确定报文确实是从A发出的,因为只有当加密过程利用了DCA算法,用ECA才能获得P,只有A才知道DCA算法,没 有人,即使是B也不能伪造A的签名。
3.4优缺点
3.4.1优点
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。该算法的加密密钥和加密算法分开,使得密钥分配更为方便。它特别符合计算机网络环境。对于网上的大量用户,可以将加密密钥用电话簿的方式印出。如果某用户想与另一用户进行保密通信,只需从公钥簿上查出对方的加密密钥,用它对所传送的信息加密发出即可。对方收到信息后,用仅为自己所知的解密密钥将信息脱密,了解报文的内容。由此可看出,RSA算法解决了大量网络用户密钥管理的难题,这是公钥密码系统相对于对称密码系统最突出的优点。
3.4.2缺点
1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
2)安全性, RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价,而且密码学界多数人士倾向于因子分解不是NPC问题。目前,人们已能分解140多个十进制位的大素数,这就要求使用更长的密钥,速度更慢;另外,目前人们正在积极寻找攻击RSA的方法,如选择密文攻击,一般攻击者是将某一信息作一下伪装(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:
( XM )d = Xd *Md mod n
前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way Hash Function对文档作HASH处理,或同时使用不同的签名算法。除了利用公共模数,人们还尝试一些利用解密指数或φ(n)等等攻击.
3)速度太慢,由于RSA的分组长度太大,为保证安全性,n至少也要600 bitx以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。为了速度问题,目前人们广泛使用单,公钥密码结合使用的方法,优缺点互补:单钥密码加密速度快,人们用它来加密较长的文件,然后用RSA来给文件密钥加密,极好的解决了单钥密码的密钥分发问题。
§4结束语
目前,日益激增的电子商务和其它因特网应用需求使公钥体系得以普及,这些需求量主要包括对服务器资源的访问控制和对电子商务交易的保护,以及权利保护、个人隐私、无线交易和内容完整性(如保证新闻报道或股票行情的真实性)等方面。公钥技术发展到今天,在市场上明显的发展趋势就是PKI与操作系统的集成,PKI是“Public
Key Infrastructure”的缩写,意为“公钥基础设施”。公钥体制广泛地用于CA认证、数字签名和密钥交换等领域。
公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。目前为止,很多种加密技术采用了RSA算法,该算法也已经在互联网的许多方面得以广泛应用,包括在安全接口层(SSL)标准(该标准是网络浏览器建立安全的互联网连接时必须用到的)方面的应用。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。
但目前RSA算法的专利期限即将结束,取而代之的是基于椭圆曲线的密码方案(ECC算法)。较之于RSA算法,ECC有其相对优点,这使得ECC的特性更适合当今电子商务需要快速反应的发展潮流。此外,一种全新的量子密码也正在发展中。
至于在实际应用中应该采用何种加密算法则要结合具体应用环境和系统,不能简单地根据其加密强度来做出判断。因为除了加密算法本身之外,密钥合理分配、加密效率与现有系统的结合性以及投入产出分析都应在实际环境中具体考虑。加密技术随着网络的发展更新,将有更安全更易于实现的算法不断产生,为信息安全提供更有力的保障。今后,加密技术会何去何从,我们将拭目以待。
参考文献:
[1] Douglas R.Stinson.《密码学原理与实践》.北京:电子工业出版社,2003,2:131-132
[2]西蒙.辛格.《密码故事》.海口:海南出版社,2001,1:271-272
[3]嬴政天下.加密算法之RSA算法.http://soft.winzheng.com/infoView/Article_296.htm,2003
[4]加密与数字签名.http://www.njt.cn/yumdq/dzsw/a2.htm
[5]黑客中级教程系列之十.http://www.qqorg.i-p.com/jiaocheng/10.html