258425法西斯是什么意思?

ISO是什么?相机ISO是什么意思?
ISO是什么?相机ISO是什么意思?  针对ISO是什么的问题,相机中的是的意思,在光线比较暗的情况下把ISO调高的话会降低也就是说可以让照出的照片不是很模糊但是有得必有失,高的ISO使照片颗粒感很强的,低的ISO会是画面细腻。分别是ISO100、200、400等。普通情况下一般是用ISO100。同时相当与以前传统柯达有100的和200一个意思。相机ISO工作原理  ISO感光度的高低代表了在相同EV曝光值时,选择更高的ISO感光度,在光圈不变的情况下能够使用更快的快门速度获得同样的曝光量。反之,在快门不变的情况下能够使用更小的光圈而保持获得正确的曝光量。因此,在光线比较暗淡的情况下进行拍摄,往往可以选择较高的ISO感光度。当然,对于而言还可以选择使用较大口径的镜头,提高光通量。而对于一般因为采用的是固定镜头,惟有通过提高ISO感光度来适应暗淡光线情况下的拍摄,特别是在无法使用辅助光线的情况下。  传统相机所使用的胶片是通过控制染料对光线的敏感度的不同来实现提高胶片感光度的目的。但是,感光度的提高会降低影象清晰度,增加反差,也就是减少了动态范围。数码相机的感光元件属于主动元件,存在暗电流,普通模式下设置了截止电流,并不会使用到存在噪声干扰的部分,高感光度模式是利用到了存在噪声较大的部分,这些背景噪声反映到图像上就是随机的杂色。只要感光元件没有改进,光圈不改变,该问题无法有真正的改善,最多利用算法弱化噪声的直观感受,这也是高iso的相机往往有更大的镜头和更大尺寸感光元件的原因。  因此,当现场光线条件不好时应当首先考虑辅助光(闪光灯和反光板)的应用,在无法使用辅助光时再考虑三脚架的使用和防抖,最后才考虑提高ISO感光度的办法。  对于经常拍摄舞台等光线较暗,并且不允许使用闪光灯或不便于使用三脚架的场所,可以尽量选择镜头口径较大焦距较短,较大的数码相机,单反数码相机可以选择使用口径较大的镜头来进行拍摄(当然,大光圈也会降低景深)。  夜景拍摄常常使用较大的光圈和较长的曝光时间,假如选择较高的ISO感光度必将不可避免的产生噪点和杂色。这时可以使用三脚架和自拍,有可能的再使用快门线,选择较低的ISO感光度就可以避免噪点和杂色的产生。  编后语:关于ios是什么?相机IOS是什么意思?小编在文中给出了详细的解答。因此,在购买数码相机时就需要考虑选择具有最大iso和较大尺寸的相机,其比较有利于弱光情况下的拍摄。在拍摄时尽可能的使用辅助光源和较长曝光时间等。关于ios和感光度的更多问题,小编在相关阅读中推荐,网友们可以参考一下。相关阅读:尼康D90感光度问题佳能7D感光度问题感光度是什么&
最热数码词条排行
热门数码专区排行您的位置: >
大家说说究竟hpv是什么意思呢?
来源: 互联网
  大家说说究竟hpv是什么意思呢?人乳头瘤病毒(HPV)是一种属于乳多空病毒科的乳头瘤空泡病毒A属,是球形DNA病毒,能引起人体皮肤黏膜的鳞状上皮增殖。性病的种类极多,对于人们来说,不管是哪一种性病,对病人的危害都是非常有危害的,所以人们在发现了性病后就得第一时间发现,尖锐湿疣就是其中的一种,对于这样的性病,人们就得多多关注了,要早点去医治,这样对病人的好处才大。那么目前尖锐湿疣的有效治疗方法是什么?下面我们就一起来看看吧。
  1、手术切除:对带蒂的较大、孤立的疣体可考虑手术切除。尖锐湿疣一般不主张手术切除,因为手术医治后,尖锐湿疣非常轻易反复发作,使医治失败。但对带蒂的较大的疣体或疑有恶变者,可考虑手术切除。有的病人尖锐湿疣生长过于迅速,或大如菜花,其他医治十分困难,可考虑手术医治。为防止反复发作,术后配合其他医治。依据疣块、覆盖面积,挑选病灶切除或外阴切除。
  2、微波医治:它的原理是利用微波的高频震动,使疣体内部水分蒸发,坏死脱落。微波医治的特点是,疣体破坏彻底,不易反复发作,但创面恢复较慢,轻易继发感染。所以微波医治非常适用于医治疣体较大的,孤立、散在的,同时要阔别包皮系带的尖锐湿疣,以防损伤包皮系带,影响男人的性功能。大家说说究竟hpv是什么意思呢?
  3、激光医治:对外阴、肛门四周等表浅的湿疣恰当;它的特点是见效快,在医治确当时,疣体即可脱落。经常运用的是二氧化碳激光,烧灼疣体,一般1次即可使疣体脱落。但是,因为激光的光束过于集中的原故,激光医治只适用于疣体较小的尖锐湿疣。
  大家说说究竟hpv是什么意思呢?通过上面的叙述,知道尖锐湿疣的医治办法是有非常多的,病人必然要选对办法医治,只有用对办法,病人才会很快地医治好疾病。祝患者们早日康复。
标签: jlw
[技术来源:互联网]【2014跑江湖地摊复古项链怀表毛主席翻盖怀表十二生肖怀表(热销)】2014跑江湖地摊复古项链怀表毛主席翻盖怀表十二生肖怀表(热销)价格 - 中国供应商
您好,欢迎回来
您好,欢迎来到中国供应商!
当前位置:
&2014跑江湖地摊复古项链怀表毛主席翻盖怀表十二生肖怀表(热销)
2014跑江湖地摊复古项链怀表毛主席翻盖怀表十二生肖怀表(热销)
订货量(个)
发 &货&期:不限
供货总量:0块(个)
最小起订量:
联系人:石亮先生
经营模式:
中国 宁夏 银川市兴庆区 丽景北街副食品批发市场9-5号
主营产品:
供应信息分类
联系人:石亮
职 位 :总经理
地 址 :中国 宁夏 银川市兴庆区 丽景北街副食品批发市场9-5号
价格:¥43.00
价格:¥2380.00
价格:¥100.00
价格:¥100.00
价格:¥100.00
价格:¥100.00
价格:¥100.00
产品类别:怀表
机芯:石英
表盘形状:圆形
风格:仿古
产地:永康
加印LOGO:不可以
加工定制:是
外壳材质:金属
品牌:建辉
2014跑江湖地摊复古项链怀表毛主席翻盖怀表十二生肖怀表(热销)
热销枸杞至尊豪礼苟杞正宗宁夏枸杞贡果600g装精品高档礼盒原产地特价¥:138.00元月销1258件免洗高档枸杞礼盒 250g头茬中宁枸杞 中药贡果宁夏枸杞子特优级¥:28.00元月销1258件送礼佳品至尊豪礼宁夏枸杞子贡果1000克家庭实惠装原产地特价¥:118.00元月销1258件2014年新货头茬 中宁枸杞批发 250克自封口袋装苟杞子¥:16.50元月销1258件野生黑果枸杞300克青海黑枸杞精装大礼盒精品包装¥:698.00元月销1258件枸杞子180粒特优级头茬精选非宁夏枸杞 250g¥:65.00元月销1258件测试极品头茬中宁红枸杞300克精品高档礼盒装中宁枸杞子特价批发¥:180.00元月销1258件2014年新货头茬 中宁枸杞批发 500克自封口袋装苟杞子¥:37.00元月销1258件野生黑果枸杞子新货精选黑枸杞240克礼盒装特价¥:499.00元月销1258件新货正品枸杞贡果500克装特优级苟杞礼盒厂价特惠批发¥:68.00元月销1258件新货正品宁夏枸杞子中宁枸杞极品贡果500g精美礼盒铁盒装特价批发¥:60.00元月销1258件&最新跑江湖热销产品,好机会不容错过专业厂家低价热销复古项链怀表毛主席翻盖怀表十二生肖怀表建辉商贸独家供应限量销售中华复古怀表20元模式最赚钱的项目【复古纪念怀表】20元模式!经过一个多月的市场摸索,事实证明,日入千元很容易!特点一:轻松 ,一个手提袋,一个折叠桌,在菜市,庙会,赶集&&均可操作,傻瓜模式,配合录音,无需讲口,直接收钱。特点二:为什么这个项目一定会受消费者的欢迎?怀表,相信现在的很多九零后见都没有见过,现在的很多钟表店已经看不见他的身影了!这是一个时代的印记,我们去菜市场试地,那些四五十岁的人都是蜂蛹而上啊!20块一块手表,不仅实惠,更重要的是有很高的收藏价值!年轻人也是很喜欢的,怀表可以拿来做服饰搭配,裙子,t恤,毛衣,外套,都可以,也非常的时尚,有特色!学校周围也比较好销,学生进考场不能带手机,带闹钟也非常麻烦,这是我们亲自试地后的经验。特点三:&很多顾客都是3个5个的买,买十二生肖送孙子,有些退休老干部买来送战友,还遇到有些买一套十二生肖收藏的&&一直坚持用事实说话,从不瞎吹牛乱打广告,我们有自己亲自卖货后的无数经验,目前此项目,只在银川,贵州,重庆,江西等地有客户在做,很多一线城市还是一片空白!所以希望大家不要错过机遇,初步估计,此项目一定会成为2014地摊项目的一个传奇.怀旧纪念表 人到老年必怀旧独守中老年追捧 不管你是做早市的 赶集的 庙会 展销会的 这绝对是一款暴利的产品 拿货就送录音 送广告画,100副一件货 有十几个花型 随机发货。银川,义乌,青岛三地现货 可上门货 全国座子一件代发。&早市火爆热销场面实拍订货送销售录音,广告喷绘。“复古青铜纪念怀表”在全国多地试销,均试地成功!浙江 义乌早市2小时销售业绩1250元浙江义乌三挺路夜市销售业绩1600元山西吕梁上午销售业绩1770元福建福州全天销售业绩3200元山东龙口集市销售1160元苏州吴江市菜市场下午销售业绩900元内蒙古包头全天销售业绩2600元哈尔滨早市一个半小时销售业绩830元云南大理展销会全天销售3800元各位朋友本产品已完全试地成功!不挑地,不挑人,只要会收钱,看摊都能做!========================================QQ:订货电话(胡经理)厂家合作(小米)官方网站:www.jianhui.cc========================================本文来自:银川建辉商贸(关注微信号公众号jianhui5918可以免费订阅更多新产品信息并赠送价值298的江湖地摊内部学习资料)&我公司自2004年成立以来,一直致力于新奇特系列,工艺品产品的批发、加工以及新奇特产品的研发等业务。新奇特产品以其新颖、奇特、外观小巧实用,价格低廉、普通市场不易购买等特点,一直以来都倍受各类用户的青睐。自主开发的品牌有建辉牌军袜,昕辉清洁膏,建辉电池,建辉军用鞋垫,建辉牌浴巾等众多热销产品。本公司采取和厂家联合制造,入股生产的多种方式保证最低的价格、最好的品质、最优的服务,是我们始终秉承的经营理念和经营准则。关注我们每个月推出的最新产品。携手建辉商贸,让我们共同发展,共同进步。诚信经营,合作共赢是我们的企业文化。欢迎各界人士和我们携手共创更广泛的市场。联 系 人:王建平&先生电 & & 话:86 移动电话:传 & & 真:86 8邮 & & 编:258425地 & & 址:中国 宁夏 银川市兴庆区 中国国际商贸城公司主页:/
宁夏汇丰好又多商贸有限公司经销批发的宁夏枸杞、小食品畅销消费者市场,在消费者当中享有较高的地位,公司与多家零售商和代理商建立了长期稳定的合作关系。宁夏汇丰好又多商贸有限公司经销的宁夏枸杞、小食品品种齐全、价格合理。宁夏汇丰好又多商贸有限公司实力雄厚,重信用、守合同、保证产品质量,以多品种经营特色和薄利多销的原则,赢得了广大客户的信任。
主营产品或服务:
主营行业:
经营模式:
注册资本:
公司成立日期:
公司所在地:
中国 宁夏 银川市兴庆区 丽景北街副食品批发市场9-5号
企业类型:
中国 宁夏 银川市兴庆区 丽景北街副食品批发市场9-5号
宁夏汇丰好又多商贸有限公司
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥35.60
价格:¥399.00
价格:¥398.00
价格:¥6.80
日-5日上海新国际博览中心
日-7日上海新国际博览中心
日-16日南京国际博览中心
日-29日中国国际展览中心(老馆)
日-8日上海新国际博览中心
日-28日深圳会展中心
日-25日义乌国际博览中心
日-24日国家会展中心(上海)
日-30日中国进出口商品交易会展馆
日-20日广东现代国际展览中心
日-7日义乌国际博览中心
日-16日中国进出口商品交易会展馆
免责声明:
本商铺内所展现的2014跑江湖地摊复古项链怀表毛主席翻盖怀表十二生肖怀表(热销)信息及其他相关信息均由商铺所属企业自行提供,信息的真实性、准确性和合法性由商铺所属企业完全负责。中国供应商对此不承担任何保证责任。
友情提醒:
建议您在购买相关产品前务必确认供应商资质及产品质量,过低的价格有可能是虚假信息,请谨慎对待,谨防欺诈行为。
地址:中国 宁夏 银川市兴庆区 丽景北街副食品批发市场9-5号&&
按拼音检索:
技术支持:MD5_百度百科
关闭特色百科用户权威合作手机百科
收藏 查看&MD5
Message Digest Algorithm MD5(中文名为第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。MD5即Message-Digest Algorithm 5(信息-摘要5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译、),主流编程语言普遍已有MD5实现。将(如)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、和。MD5算法具有以下特点:1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。2、容易计算:从原数据计算出MD5值很容易。3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。MD5的作用是让大容量信息在用软件签署私人前被&&成一种保密的格式(就是把一个任意长度的字节串变换成一定长的数字串)。除了MD5以外,其中比较有名的还有、以及等。外文名Message Digest Algorithm MD5别&&&&称摘要算法应用学科信息技术,计算机科学适用领域范围软件下载站、论坛数据库、系统文件安全
Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法后结果是唯一的(即不同信息加密后的结果不同)。为了加MD5强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64位表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。
尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。1991年,Rivest开发出技术上更为趋近成熟的。它在MD4的基础上增加了&安全-带子&(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。MD5的md5典型应用是对一段(Message)产生信息(Message-Digest),以防止被篡改。比如,在下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515
这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程:
大家都知道,地球上任何人都有自己独一无二的,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的md5“”,如果任何人对文件做了任何改动,其也就是对应的“数字指纹”都会发生变化。
我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次,以确保我们获得的文件与该站点提供的文件为同一文件。
具体来说文件的MD5值就像是这个文件的“”。每个文件的MD5值是不同的,如果任何人对文件做了任何改动,其也就是对应的“数字指纹”就会发生变化。比如下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用我这个算法重新计算下载文件的MD5值,通过比较这两个值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。
利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、安全等方面。MD5的典型应用是对一段Message(字节串)产生fingerprint(),以防止被“”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。MD5还广泛用于的登陆认证上,如Unix、各类登录密码、等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为&跑字典&的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于Unix系统中,这也是为什么Unix系统比一般更为坚固一个重要原因。对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
总体流程如下图所示, 表示第i个分组,每次的运算都由前一轮的128位结果值和第i块512bit值进行运算。
MD5算法的整体流程图[1]
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448,并且填充必须进行,即使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。
填充的方法如下:
1) 在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
2) 在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二
进制表示的填充前信息长度超过64位,则取低64位。
经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
2. 初始化变量
初始的128位值为初试链接变量,这些参数用于第一轮的运算,以来表示,他们分别为: A=0x,B=0x89ABCDEF,C=0xFEDCBA98,D=0x。
(每一个变量给出的数值是高字节存于内存低地址,低字节存于内存高地址,即大端字节序。在程序中变量A、B、C、D的值分别为0xxEFCDAB89,0x98BADCFE,0x)
3. 处理分组数据
每一分组的算法流程如下:
第一分组需要将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。从第二分组开始的变量为上一分组的运算结果,即A = a, B = b, C = c, D = d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以下是每次操作中用到的四个非线性函数(每轮一个)。
F( X ,Y ,Z ) = ( X & Y ) | ( (~X) & Z )
G( X ,Y ,Z ) = ( X & Z ) | ( Y & (~Z) )
H( X ,Y ,Z ) =X ^ Y ^ Z
I( X ,Y ,Z ) =Y ^ ( X | (~Z) )
(&是与(And),|是或(Or),~是非(Not),^是异或(Xor))
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
假设Mj表示消息的第j个子分组(从0到15),常数ti是*abs( sin(i) )的整数部分,i 取值从1到64,单位是弧度。(=232)
FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + F(b,c,d) + Mj + ti) && s)
GG(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + G(b,c,d) + Mj + ti) && s)
HH(a ,b ,c ,d ,Mj ,s ,ti) 操作为 a = b + ( (a + H(b,c,d) + Mj + ti) && s)
II(a ,b ,c ,d ,Mj ,s ,ti) 操作为 a = b + ( (a + I(b,c,d) + Mj + ti) && s)
注意:“&&”表示循环左移位,不是左移位。
这四轮(共64步)是:
FF(a ,b ,c ,d ,M0 ,7 ,0xd76aa478 )
FF(d ,a ,b ,c ,M1 ,12 ,0xe8c7b756 )
FF(c ,d ,a ,b ,M2 ,17 ,0x242070db )
FF(b ,c ,d ,a ,M3 ,22 ,0xc1bdceee )
FF(a ,b ,c ,d ,M4 ,7 ,0xf57c0faf )
FF(d ,a ,b ,c ,M5 ,12 ,0x4787c62a )
FF(c ,d ,a ,b ,M6 ,17 ,0xa8304613 )
FF(b ,c ,d ,a ,M7 ,22 ,0xfd469501)
FF(a ,b ,c ,d ,M8 ,7 ,0x )
FF(d ,a ,b ,c ,M9 ,12 ,0x8b44f7af )
FF(c ,d ,a ,b ,M10 ,17 ,0xffff5bb1 )
FF(b ,c ,d ,a ,M11 ,22 ,0x895cd7be )
FF(a ,b ,c ,d ,M12 ,7 ,0x6b901122 )
FF(d ,a ,b ,c ,M13 ,12 ,0xfd987193 )
FF(c ,d ,a ,b ,M14 ,17 ,0xa679438e )
FF(b ,c ,d ,a ,M15 ,22 ,0x49b40821 )
GG(a ,b ,c ,d ,M1 ,5 ,0xf61e2562 )
GG(d ,a ,b ,c ,M6 ,9 ,0xc040b340 )
GG(c ,d ,a ,b ,M11 ,14 ,0x265e5a51 )
GG(b ,c ,d ,a ,M0 ,20 ,0xe9b6c7aa )
GG(a ,b ,c ,d ,M5 ,5 ,0xd62f105d )
GG(d ,a ,b ,c ,M10 ,9 ,0x )
GG(c ,d ,a ,b ,M15 ,14 ,0xd8a1e681 )
GG(b ,c ,d ,a ,M4 ,20 ,0xe7d3fbc8 )
GG(a ,b ,c ,d ,M9 ,5 ,0x21e1cde6 )
GG(d ,a ,b ,c ,M14 ,9 ,0xc33707d6 )
GG(c ,d ,a ,b ,M3 ,14 ,0xf4d50d87 )
GG(b ,c ,d ,a ,M8 ,20 ,0x455a14ed )
GG(a ,b ,c ,d ,M13 ,5 ,0xa9e3e905 )
GG(d ,a ,b ,c ,M2 ,9 ,0xfcefa3f8 )
GG(c ,d ,a ,b ,M7 ,14 ,0x676f02d9 )
GG(b ,c ,d ,a ,M12 ,20 ,0x8d2a4c8a )
HH(a ,b ,c ,d ,M5 ,4 ,0xfffa3942 )
HH(d ,a ,b ,c ,M8 ,11 ,0x )
HH(c ,d ,a ,b ,M11 ,16 ,0x6d9d6122 )
HH(b ,c ,d ,a ,M14 ,23 ,0xfde5380c )
HH(a ,b ,c ,d ,M1 ,4 ,0xa4beea44 )
HH(d ,a ,b ,c ,M4 ,11 ,0x4bdecfa9 )
HH(c ,d ,a ,b ,M7 ,16 ,0xf6bb4b60 )
HH(b ,c ,d ,a ,M10 ,23 ,0xbebfbc70 )
HH(a ,b ,c ,d ,M13 ,4 ,0x289b7ec6 )
HH(d ,a ,b ,c ,M0 ,11 ,0xeaa127fa )
HH(c ,d ,a ,b ,M3 ,16 ,0xd4ef3085 )
HH(b ,c ,d ,a ,M6 ,23 ,0x04881d05 )
HH(a ,b ,c ,d ,M9 ,4 ,0xd9d4d039 )
HH(d ,a ,b ,c ,M12 ,11 ,0xe6db99e5 )
HH(c ,d ,a ,b ,M15 ,16 ,0x1fa27cf8 )
HH(b ,c ,d ,a ,M2 ,23 ,0xc4ac5665 )
II(a ,b ,c ,d ,M0 ,6 ,0xf4292244 )
II(d ,a ,b ,c ,M7 ,10 ,0x432aff97 )
II(c ,d ,a ,b ,M14 ,15 ,0xab9423a7 )
II(b ,c ,d ,a ,M5 ,21 ,0xfc93a039 )
II(a ,b ,c ,d ,M12 ,6 ,0x655b59c3 )
II(d ,a ,b ,c ,M3 ,10 ,0x8f0ccc92 )
II(c ,d ,a ,b ,M10 ,15 ,0xffeff47d )
II(b ,c ,d ,a ,M1 ,21 ,0x85845dd1 )
II(a ,b ,c ,d ,M8 ,6 ,0x6fa87e4f )
II(d ,a ,b ,c ,M15 ,10 ,0xfe2ce6e0 )
II(c ,d ,a ,b ,M6 ,15 ,0xa3014314 )
II(b ,c ,d ,a ,M13 ,21 ,0x4e0811a1 )
II(a ,b ,c ,d ,M4 ,6 ,0xf7537e82 )
II(d ,a ,b ,c ,M11 ,10 ,0xbd3af235 )
II(c ,d ,a ,b ,M2 ,15 ,0x2ad7d2bb )
II(b ,c ,d ,a ,M9 ,21 ,0xeb86d391 )
所有这些完成之后,将a、b、c、d分别在原来基础上再加上A、B、C、D。
即a = a + A,b = b + B,c = c + C,d = d + D
然后用下一分组数据继续运行以上算法。
最后的输出是a、b、c和d的级联。
当你按照我上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。
MD5 (&&) = d41d8cd98f00b204e9800998ecf8427e
MD5 (&a&) = 0cc175b9c0f1b6a831c399e
MD5 (&abc&) = cd24fb0de17f72
MD5 (&message digest&) = f96b697d7cbf31aaf161d0
MD5 (&abcdefghijklmnopqrstuvwxyz&) = c3fcd3ddfb496cca67e13b
MD5 (&ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&) =
f29939a25efabaef3b87e2cbfe641315
MD5 (&8a683566bccd8b0cf35fd97&) =cf2cb5c89c5e5eeebef4a76becddfcfd现以字符串“jklmn”为例。
该字符串在内存中表示为:6A 6B 6C 6D 6E(从左到右为低地址到高地址,后同),信息长度为40 bits, 即0x28。
对其填充,填充至448位,即56字节。结果为:
6A 6B 6C 6D 6E 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
剩下64位,即8字节填充填充前信息位长,按小端字节序填充剩下的8字节,结果为。
6A 6B 6C 6D 6E 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00 00 00 00
(64字节,512 bits)
初始化A、B、C、D四个变量。
将这64字节填充后数据分成16个小组(程序中对应为16个数组),即:
M0:6A 6B 6C 6D (这是内存中的顺序,按照小端字节序原则,对应数组M(0)的值为0x6D6C6B6A,下同)
M1:6E 80 00 00
M2:00 00 00 00
M14:28 00 00 00
M15:00 00 00 00
经过“3. 分组数据处理”后,a、b、c、d值分别为0xDx837E726CA、0x1BB6E5FE
在内存中为a:60 3F 52 D8
b:44 01 7E 83
c:CA 26 77 51
d:FE E5 B6 1B
a、b、c、d按内存顺序输出即为最终结果:603F52DCA267751FEE5B61B。这就是字符串“jklmn”的MD5值。#include&iostream&
#include&string&
using&namespace&
#define&shift(x,&n)&(((x)&&&&(n))&|&((x)&&&&(32-(n))))//右移的时候,高位一定要补零,而不是补充符号位
#define&F(x,&y,&z)&(((x)&&&(y))&|&((~x)&&&(z)))
#define&G(x,&y,&z)&(((x)&&&(z))&|&((y)&&&(~z)))
#define&H(x,&y,&z)&((x)&^&(y)&^&(z))
#define&I(x,&y,&z)&((y)&^&((x)&|&(~z)))
#define&A&0x
#define&B&0xefcdab89
#define&C&0x98badcfe
#define&D&0x
//strBaye的长度
unsigned&int&
//A,B,C,D的临时变量
unsigned&int&
unsigned&int&
unsigned&int&
unsigned&int&
//常量ti&unsigned&int(abs(sin(i+1))*(2pow32))
const&unsigned&int&k[]={
0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
&&&&&&&&0xf57c0faf,0xxaxfdx,
&&&&&&&&0x8b44f7af,0xffff5bb1,0x895cd7be,0x6bxfd987193,
&&&&&&&&0xax49be0b340,0x265e5a51,
&&&&&&&&0xe9b6c7aa,0xd62f105d,0xxd8a1e681,0xe7d3fbc8,
&&&&&&&&0x21e1cde6,0xcxf4d50d87,0x455a14ed,0xa9e3e905,
&&&&&&&&0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa1f681,
&&&&&&&&0x6d9d6122,0xfdebeea44,0x4bdecfa9,0xf6bb4b60,
&&&&&&&&0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef81d05,
&&&&&&&&0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac92244,
&&&&&&&&0x432aff97,0xabxfc93a039,0x655b59c3,0x8f0ccc92,
&&&&&&&&0xffeff47d,0x8x6fa87e4f,0xfe2ce6e0,0xa3014314,
&&&&&&&&0x4exfxbd3af235,0x2ad7d2bb,0xeb86d391};
//向左位移数
const&unsigned&int&s[]={7,12,17,22,7,12,17,22,7,12,17,22,7,
&&&&&&&&12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
&&&&&&&&4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,
&&&&&&&&15,21,6,10,15,21,6,10,15,21,6,10,15,21};
const&char&str16[]=&abcdef&;
void&mainLoop(unsigned&int&M[])
unsigned&int&f,g;
unsigned&int&a=
unsigned&int&b=
unsigned&int&c=
unsigned&int&d=
for&(unsigned&int&i&=&0;&i&&&64;&i++)
f=F(b,c,d);
}else&if&(i&32)
f=G(b,c,d);
&&&&&&&&&&&&g=(5*i+1)%16;
&&&&&&&&}else&if(i&48){
&&&&&&&&&&&&f=H(b,c,d);
&&&&&&&&&&&&g=(3*i+5)%16;
&&&&&&&&}else{
&&&&&&&&&&&&f=I(b,c,d);
&&&&&&&&&&&&g=(7*i)%16;
unsigned&int&tmp=d;
b=b+shift((a+f+k[i]+M[g]),s[i]);
&&&&btemp=b+
&&&&ctemp=c+
&&&&dtemp=d+
*处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64)
*填充方式为先加一个1,其它位补零
*最后加上64位的原来长度
unsigned&int*&add(string&str)
unsigned&int&num=((str.length()+8)/64)+1;//以512位,64个字节为一组
unsigned&int&*strByte=new&unsigned&int[num*16];&&&&//64/4=16,所以有16个整数
strlength=num*16;
for&(unsigned&int&i&=&0;&i&&&num*16;&i++)
strByte[i]=0;
for&(unsigned&int&i=0;&i&&str.length();&i++)
strByte[i&&2]|=(str[i])&&((i%4)*8);//一个整数存储四个字节,i&&2表示i/4&一个unsigned&int对应4个字节,保存4个字符信息
strByte[str.length()&&2]|=0x80&&(((str.length()%4))*8);//尾部添加1&一个unsigned&int保存4个字符信息,所以用128左移
&&&&*添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位
&&&&strByte[num*16-2]=str.length()*8;
&&&&return&strB
string&changeHex(int&a)
string&str1;
&&&&string&str=&&;
&&&&for(int&i=0;i&4;i++)
b=((a&&i*8)%(1&&8))&0&&&//逆序处理每个字节
for&(int&j&=&0;&j&&&2;&j++)
str1.insert(0,1,str16[b%16]);
str+=str1;
string&getMD5(string&source)
unsigned&int&*strByte=add(source);
for(unsigned&int&i=0;i&strlength/16;i+=16)
unsigned&int&num[16];
for(unsigned&int&j=0;j&16;j++)
num[j]=strByte[i*16+j];
mainLoop(num);
return&changeHex(atemp).append(changeHex(btemp)).append(changeHex(ctemp)).append(changeHex(dtemp));
unsigned&int&main()
string&s=getMD5(&abc&);
public&class&MD5{
&&&&*四个链接变量
&&&&private&final&int&A=0x;
&&&&private&final&int&B=0xefcdab89;
&&&&private&final&int&C=0x98
&&&&private&final&int&D=0x;
&&&&*ABCD的临时变量
&&&&private&int&Atemp,Btemp,Ctemp,D
&&&&*常量ti
&&&&*公式:floor(abs(sin(i+1))×(2pow32)
&&&&private&final&int&K[]={
&&&&&&&&0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
&&&&&&&&0xf57c0faf,0xxaxfdx,
&&&&&&&&0x8b44f7af,0xffff5bb1,0x895cd7be,0x6bxfd987193,
&&&&&&&&0xax49be0b340,0x265e5a51,
&&&&&&&&0xe9b6c7aa,0xd62f105d,0xxd8a1e681,0xe7d3fbc8,
&&&&&&&&0x21e1cde6,0xcxf4d50d87,0x455a14ed,0xa9e3e905,
&&&&&&&&0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa1f681,
&&&&&&&&0x6d9d6122,0xfdebeea44,0x4bdecfa9,0xf6bb4b60,
&&&&&&&&0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef81d05,
&&&&&&&&0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac92244,
&&&&&&&&0x432aff97,0xabxfc93a039,0x655b59c3,0x8f0ccc92,
&&&&&&&&0xffeff47d,0x8x6fa87e4f,0xfe2ce6e0,0xa3014314,
&&&&&&&&0x4exfxbd3af235,0x2ad7d2bb,0xeb86d391};
&&&&*向左位移数,计算方法未知
&&&&private&final&int&s[]={7,12,17,22,7,12,17,22,7,12,17,22,7,
&&&&&&&&12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
&&&&&&&&4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,
&&&&&&&&15,21,6,10,15,21,6,10,15,21,6,10,15,21};
&&&&*初始化函数
&&&&private&void&init(){
&&&&&&&&Atemp=A;
&&&&&&&&Btemp=B;
&&&&&&&&Ctemp=C;
&&&&&&&&Dtemp=D;
&&&&*移动一定位数
&&&&private&&&&int&&&&shift(int&a,int&s){
&&&&&&&&return(a&&s)|(a&&&(32-s));//右移的时候,高位一定要补零,而不是补充符号位
&&&&*主循环
&&&&private&void&MainLoop(int&M[]){
&&&&&&&&int&F,g;
&&&&&&&&int&a=A
&&&&&&&&int&b=B
&&&&&&&&int&c=C
&&&&&&&&int&d=D
&&&&&&&&for(int&i&=&0;&i&&&64;&i&++){
&&&&&&&&&&&&if(i&16){
&&&&&&&&&&&&&&&&F=(b&c)|((~b)&d);
&&&&&&&&&&&&&&&&g=i;
&&&&&&&&&&&&}else&if(i&32){
&&&&&&&&&&&&&&&&F=(d&b)|((~d)&c);
&&&&&&&&&&&&&&&&g=(5*i+1)%16;
&&&&&&&&&&&&}else&if(i&48){
&&&&&&&&&&&&&&&&F=b^c^d;
&&&&&&&&&&&&&&&&g=(3*i+5)%16;
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&F=c^(b|(~d));
&&&&&&&&&&&&&&&&g=(7*i)%16;
&&&&&&&&&&&&}
&&&&&&&&&&&&int&tmp=d;
&&&&&&&&&&&&d=c;
&&&&&&&&&&&&c=b;
&&&&&&&&&&&&b=b+shift(a+F+K[i]+M[g],s[i]);
&&&&&&&&&&&&a=
&&&&&&&&Atemp=a+A
&&&&&&&&Btemp=b+B
&&&&&&&&Ctemp=c+C
&&&&&&&&Dtemp=d+D
&&&&*填充函数
&&&&*处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64)
&&&&*填充方式为先加一个0,其它位补零
&&&&*最后加上64位的原来长度
&&&&private&int[]&add(String&str){
&&&&&&&&int&num=((str.length()+8)/64)+1;//以512位,64个字节为一组
&&&&&&&&int&strByte[]=new&int[num*16];//64/4=16,所以有16个整数
&&&&&&&&for(int&i=0;i&num*16;i++){//全部初始化0
&&&&&&&&&&&&strByte[i]=0;
&&&&&&&&int&&&&i;
&&&&&&&&for(i=0;i&str.length();i++){
&&&&&&&&&&&&strByte[i&&2]|=str.charAt(i)&&((i%4)*8);//一个整数存储四个字节,小端序
&&&&&&&&strByte[i&&2]|=0x80&&((i%4)*8);//尾部添加1
&&&&&&&&/*
&&&&&&&&*添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位
&&&&&&&&*/
&&&&&&&&strByte[num*16-2]=str.length()*8;
&&&&&&&&&&&&return&strB
&&&&*调用函数
&&&&public&String&getMD5(String&source){
&&&&&&&&init();
&&&&&&&&int&strByte[]=add(source);
&&&&&&&&for(int&i=0;i&strByte.length/16;i+=16){
&&&&&&&&int&num[]=new&int[16];
&&&&&&&&for(int&j=0;j&16;j++){
&&&&&&&&&&&&num[j]=strByte[i*16+j];
&&&&&&&&MainLoop(num);
&&&&&&&&return&changeHex(Atemp)+changeHex(Btemp)+changeHex(Ctemp)+changeHex(Dtemp);
&&&&*整数变成16进制字符串
&&&&private&String&changeHex(int&a){
&&&&&&&&String&str=&&;
&&&&&&&&for(int&i=0;i&4;i++){
&&&&&&&&&&&&str+=Integer.toHexString(((a&&i*8)%(1&&8))&0xff);
&&&&&&&&return&
&&&&private&static&MD5&
&&&&public&static&MD5&getInstance(){
&&&&&&&&if(instance==null){
&&&&&&&&&&&&instance=new&MD5();
&&&&&&&&return&
&&&&private&MD5(){};
&&&&public&static&void&main(String[]&args){
&&&&&&&&String&str=MD5.getInstance().getMD5(&&);
&&&&&&&&System.out.println(str);
ImportsSystem
ImportsSystem.Security.Cryptography
ImportsSystem.Text
ModuleExample
'哈希输入字符串并返回一个32字符的十六进制字符串哈希。
FunctiongetMd5Hash(ByValinputAsString)AsString
'创建新的一个MD5CryptoServiceProvider对象的实例。
Dimmd5HasherAsNewMD5CryptoServiceProvider()
'输入的字符串转换为字节数组,并计算哈希。
DimdataAsByte()=puteHash(Encoding.Default.GetBytes(input))
'创建一个新的StringBuilder收集的字节,并创建一个字符串。
DimsBuilderAsNewStringBuilder()
'通过每个字节的哈希数据和格式为十六进制字符串的每一个循环。
DimiAsInteger
Fori=0Todata.Length-1
sBuilder.Append(data(i).ToString(&x2&))
'返回十六进制字符串。
ReturnsBuilder.ToString()
EndFunction
'验证对一个字符串的哈希值。
FunctionverifyMd5Hash(ByValinputAsString,ByValhashAsString)AsBoolean
'哈希的输入。
DimhashOfInputAsString=getMd5Hash(input)
'创建StringComparer1的哈希进行比较。
DimcomparerAsStringComparer=StringComparer.OrdinalIgnoreCase
pare(hashOfInput,hash)Then
ReturnTrue
ReturnFalse
EndFunction
DimsourceAsString=&HelloWorld!&
DimhashAsString=getMd5Hash(source)
Console.WriteLine(&进行MD5加密的字符串为:&+source+&加密的结果是:&+hash+&.&)
Console.WriteLine(&验证哈希...&)
IfverifyMd5Hash(source,hash)Then
Console.WriteLine(&哈希值是相同的。&)
Console.WriteLine(&哈希值是不相同的。&)
'此代码示例产生下面的输出:
'进行MD5加密的字符串为:HelloWorld!加密的结果是:ed365e841e92bfc50d8c.
'验证哈希...
'哈希值是相同的。
//Note:Allvariablesareunsigned32bitsandwrapmodulo2^32whencalculatingvarint[64]r,k//rspecifiestheper-roundshiftamountsr[0..15]:={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22}r[16..31]:={5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20}r[32..47]:={4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23}r[48..63]:={6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21}//Usebinaryintegerpartofthesinesofintegersasconstants:forifrom0to63k[i]:=floor(abs(sin(i+1))×2^32)//Initializevariables:varinth0:=0xvarinth1:=0xEFCDAB89varinth2:=0x98BADCFEvarinth3:=0x//Pre-processing:append&1&bittomessageappend&0&bitsuntilmessagelengthinbits≡448(mod512)appendbitlengthofmessageas64-bitlittle-endianintegertomessage//Processthemessageinsuccessive512-bitchunks:foreach512-bitchunkofmessagebreakchunkintosixteen32-bitlittle-endianwordsw[i],0≤i≤15//Initializehashvalueforthischunk:varinta:=h0varintb:=h1varintc:=h2varintd:=h3//Mainloop:forifrom0to63if0≤i≤15thenf:=(bandc)or((notb)andd)g:=ielseif16≤i≤31f:=(dandb)or((notd)andc)g:=(5×i+1)mod16elseif32≤i≤47f:=bxorcxordg:=(3×i+5)mod16elseif48≤i≤63f:=cxor(bor(notd))g:=(7×i)mod16temp:=dd:=cc:=bb:=((a+f+k[i]+w[g])leftrotater[i])+ba:=temp//Addthischunk'shashtoresultsofar:h0:=h0+ah1:=h1+bh2:=h2+ch3:=h3+dvarintdigest:=h0appendh1appendh2appendh3//(expressedaslittle-endian)MD5加密工具
利用MD5的算法原理,可以使用各种计算机语言进行实现,形成各种各样的MD5加密校验工具。有很多的在线工具可以实现这一点,这些在线工具一般是采用语言实现,使用非常方便快捷。[2]
Van oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。日的美国圣巴巴拉的国际会议(Crypto’2004)上,来自中国山东大学的教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。(注意:并非是真正的破解,只是加速了杂凑冲撞)
令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。MD5验证可执行文件不再可靠的消息MD5破解工程权威网站是为了公开征集专门针对MD5的攻击而设立的,网站于日宣布:“人员发现了完整MD5算法的碰撞;Wang,Feng,Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近年来领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5碰撞。……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。
在2004年8月之前,国际密码学界对这个名字并不熟悉。2004年8月,在美国圣芭芭拉召开的国际密码大会上,并没有被安排发言的王小云教授拿着自己的研究成果找到,没想到慧眼识珠的会议主席破例给了她15分钟时间来介绍自己的成果,而通常发言人只被允许有两三分钟的时间。王小云与助手展示了MD5、SHA-0及其他相关杂凑函数的杂凑冲撞。所谓杂凑冲撞指两个完全不同的讯息经杂凑函数计算得出完全相同的杂凑值。根据,以有长度限制的杂凑函数计算没有长度限制的讯息是必然会有冲撞情况出现的。可是,一直以来,电脑保安专家都认为要任意制造出冲撞需时太长,在实际情况上不可能发生,而王小云等的发现可能会打破这个必然性。就这样,王小云在国际会议上首次宣布了她及她的研究小组的研究成果——对、MD5、HAVAL-128和等四个著名密码算法的破译结果。
在公布到第三个成果的时候,会场上已经是掌声四起,报告不得不一度中断。报告结束后,所有与会专家对他们的突出工作报以长时间的掌声,有些学者甚至起立鼓掌以示他们的祝贺和敬佩。由于版本问题,作者在提交时使用的一组常数和先行标准不同,在发现这一问题之后,王小云教授立即改变了那个常数,在很短的时间内就完成了新的分析,这段有惊无险的小插曲更证明了他们论文的信服力,攻击方法的有效性,验证了研究工作的成功。
2005年8月,王小云、,以及姚期智妻子(即为Knuth起名的人)联手于国际密码讨论年会尾声部份提出SHA-1杂凑函数杂凑冲撞演的改良版。此改良版使破解SHA-1时间缩短。
,教授于第13次院士大会和第8次院士大会上以“国际通用Hash函数的破解”获颁信息技术科学奖。
2009年,冯登国、谢涛二人利用差分攻击,将MD5的碰撞算法复杂度从王小云的2^42进一步降低到2^21,极端情况下甚至可以降低至2^10。仅仅2^21的复杂度意味着即便是在2008年的计算机上,也只要几秒便可以找到一对碰撞。[1]
MD5(&&)= d41d8cd98f00b204e9800998ecf8427e[3]
PHP md5() 函数定义和用法
md5() 函数计算字符串的 MD5 散列。[4]
md5() 函数使用 RSA 数据安全,包括 MD5 报文摘要算法。
来自 RFC 1321 的解释 - MD5 报文摘要算法:MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的&指纹信息&或&报文摘要&值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是为数字签名应用程序而设计的;在这个数字签名应用程序中,较大的文件将在加密(这里的加密过程是通过在一个密码系统下[如:RSA]的公开密钥下设置私有密钥而完成的)之前以一种安全的方式进行压缩。
如需计算文件的 MD5 散列,请使用 md5_file() 函数。
md5(string,raw)
参数描述string必需。规定要计算的字符串。raw可选。规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数
如果成功则返回已计算的 MD5 散列,如果失败则返回 FALSE。
PHP 版本:
更新日志:
在 PHP 5.0 中,raw 参数变成可选的。
输出 md5() 的结果:
&?php$str=&Hello&;echo&Thestring:&.$str.&&br&&;echo&TRUE-Raw16characterbinaryformat:&.md5($str,TRUE).&&br&&;echo&FALSE-32characterhexnumber:&.md5($str).&&br&&;?&
新手上路我有疑问投诉建议参考资料 查看}

我要回帖

更多关于 6666是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信