浅谈Diffie-Hellman密钥交换算法的使用

    技术2022-05-11  34

    使用过rar/zip等压缩工具的网友都知道,这些压缩工具都有具有加密的功能。     如a想把一个文件传递给b,a可以先用rar将其压缩加密后再用网络进行传递,这可以有效地防止他人的网络窃听。     但问题是,b收到加密后的压缩包,其如何将包进行解密?因为包是a加密的,只有a知道密码,b并不知道加密口令呀!总不能让a把密码一齐发过来吧,因为这样密码本身又面临着被窃听的危险。     在此问题的困扰下,人们设计了各种各样的密钥交换方法,其中最著名最成功的就是本文介绍的dh密钥交换算法,该算法是有专利的,不久前专利刚到期,现在人们可以自由地使用了。     为了网友使用方便,本人用vb将dh算法(128位)写出来,源码就帖在本论坛里。     在介绍dh算法的使用前,先介绍几个与之有关的名词概念:         种子:一个公开的、公用的128位数,在vb中是16个成员的一个字节组dim b(15) as byte,交换的双方可以自己约定,为了便于网友使用,源码中指定了一个默认的种子,如果你不满意,可以自己指定其他的数作为种子;         私钥:自己选定的、自己密秘使用的一个128位数,在vb中是16个成员的一个字节组dim b(15) as byte;         公钥:由私钥经过计算而产生的,与私钥所对应的一个128位数,是公开的、供他人使用的,在vb中是16个成员的一个字节组dim b(15) as byte;         dh128函数:由源码提供的进行密钥交换的dh算法函数,其输入参数为两个16成员的字节组[dim indat1(15) as byte,dim indat2(15) as byte],其输出结果为一个16成员的字节组dim outdat(15) as byte;     以使用源码提供的默认的种子为例,下面介绍一下dh的两个应用:     1、密钥交换:          甲:选择自己的私钥                  dim a2(15) as byte                  并为其赋值              指定种子                  dim a1(15) as byte                  并为种子的16个成员赋值,值是0              计算自己的公钥                  dim a() as byte                  a=dh128(a1(),a2())              将公钥a告诉对方          乙:进行与甲相同的工作(当然,甲乙两人选择的自己的私钥是各自不同的!)              选择自己的私钥                  dim b2(15) as byte                  并为其赋值              指定种子(甲乙的种子一定要相同!)                  dim b1(15) as byte                  并为种子的16个成员赋值,值是0              计算自己的公钥                  dim b() as byte                  b=dh128(b1(),b2())                  将公钥b告诉对方          现在,甲有自己的私钥a2和乙的公钥b,乙有甲的公钥a和自己的私钥b2          甲计算出dh128(b(),a2()),乙计算出dh128(a(),b2()),          这就是甲乙双方通讯的密钥。          用不着怀疑,dh128(b(),a2())和dh128(a(),b2())一定是相同的:)          回到本文的开头,a现在可以用密钥dh128(b(),a2())将rar的口令加密后,将该口令发给对方了。          b用dh128(a(),b2())将收到的口令解密。     2、网络通讯程序的防盗版和用户身份的识别            [该用法有点另类:)以后本论坛还将推出一种有自主产权的、专用于该用途的密码]            与一般的程序相比,网络通讯程序有两个突出的特点:                1、用户必须上网才能使用!  废话:)                2、用户不会将自己的用户名与别人共享!                     你见过几个人用一个qq号码的吗?                     你没见成千上万台机器用一个注册码的吗?            基于该特点,本人为古老的dh算法找到了一种新用途:                   当程序出售时/用户购买时,用户选择自己的私钥,并生成相对应的公钥            用户将公钥和自己的用户名向作者备案                据我所知,通讯程序应该都有用户名吧:)            作者将正版的用户名及对应的公钥在网上公布备查            当甲收到乙的通讯请求时:                因甲有自己的私钥,同时能从网上查到乙的公钥,故可以计算出前文所说的双方间的密钥。                    本处换种叫法,管它叫双方间的“标识”好了,记作a                    同样,乙也可以计算出该标识a                甲生成16字节的随机数b                甲将a与b进行模2加(xor),得到c,把c发给乙            当乙收到甲发来的c后                用a与c进行模2加(xor),得到d                用下文的ffk函数对d进行计算,得到e,将e发回给甲            当甲收到乙发来的e后                将b用ffk函数进行计算,得到f,比较e与f                    如e=f,则乙的身份可以确认                    如e<>f,则乙是假冒的            乙也进行与甲相同的验证过程,来确认甲的身份,看看自己是否找对了人          ***************请注意***************          技术是一把双刃剑,前文的第二种用法,tom仅仅是介绍一下,告诉大家可以如此使用dh算法,仅此而已,但并不推荐使用,因为该用法是极其严厉的,从理论上讲,可以杜绝一切d版行为,但你不知道想过没有,这真得对你有好处吗?     请三思而后行!     如果qq不全民收钱,现在会有那么多的即时通讯软件异军突起吗?     如果windows没有了d版,国家的等级考试会全部考linux!     ******你永远都只能收回你应收帐款的一部分******     ****你关注的应该是收款的绝对数而不是回收率****     还是把心思放在如何写出更好的软件上来吧  

    最新回复(0)