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

  使用过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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值