首页
论坛
专栏
课程

[分享]一个基于口令加密协议及其实现(附源代码)

2009-6-4 10:52 6830

[分享]一个基于口令加密协议及其实现(附源代码)

2009-6-4 10:52
6830
一个基于口令的简单可靠的加密协议


加密:

  • 将口令T经过hash算法H1,得到K1
  • 保存K1
  • T经过hash算法H2,得到K2
  • 将数据DK2进行加密(算法EA),得到密文ED,销毁K2
  • 秘密保存口令T
  • 解密:

  • 将将口令T经过hash算法H1,得到结果DK1
  • DK1K1进行比较,相同则认证通过
  • T经过hash算法H2,得到K2
  • 将密文数据EDK2EA对应的解密算法DA解密,得到明文D
  • 假定:
    hash算法H1H2可靠且不相同,加密算法EA和对应的解密算法DA可靠。即无法对算法进行攻击。

    我将该协议写成了一个shell扩展,没有什么技术含量,不过有一定的实用价值
    经过简单测试通过

    源代码及编译好的dll见附件

    使用技术:
    ATL、Shell扩展
    CryptAPI

    功能:
    将一个文件加密,加密后的文件名的扩展名为“.e”
    将一个文件解密,解密后的文件的扩展名为“.d”

    安装:
    将CryptShellExt.DLL拷贝到硬盘的一个地方
    用Regsvr32命令注册

    使用:
    在explerer中用鼠标右键点击一个文件,就会看到“Crypt...”和"Decrypt..."

    卸载:
    用regsvr32带参数-u反注册即可

    编译环境:vc60,编译前,请先安装wtl71
    运行环境:xp sp2


    由于是写着玩的,做得比较粗糙,没有经过严格测试,也懒得写注释
    而且加解密过程中也没有进度指示,有空我再完善一下,当然你也可自己修改

    附件:

    [公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

    上传的附件:
    最新回复 (19)
    vrain 2009-6-4 11:40
    2
    0
    基本上没什么意义。
    搞两个哈西多此一举。
    Rootkitche 2009-6-4 11:49
    3
    0
    第一个hash是为了口令认证,不用两个hash,难道将解密密钥公开不成?
    inioo 2009-6-4 11:59
    4
    0
    等2楼大牛给一个更好的,期待。
    sunsjw 1 2009-6-4 13:12
    5
    0
    貌似和PKI体系差不多........
    WisdomZh 2009-6-4 13:28
    6
    0
    和 PKI 差的多
    这个仅仅多了一道口令验证, 而且用处有限
    关键还是那个真正的密钥如何传递的问题, 密钥安全很关键啊
    Rootkitche 2009-6-4 13:59
    7
    0
    密钥传输方案:

    发送方可以将数据解密密钥用接收方的公钥加密以后再传输
    这样,数据解密密钥只有接受方可以解密了。

    该方案只能保证在传输过程中的安全。
    nudtsong 1 2009-6-4 14:16
    8
    0
    如果使用接收方公钥来加密“密钥”,然后再传输给接收方,那么似乎不需要使用两个hash了吧。
    直接把密码加密后的密文传输过去不就行了吗?
    反正攻击方得到密文和公钥加密后的“密钥”都没啥用。
    Rootkitche 2009-6-4 14:32
    9
    0
    刚才我的讨论已经跑题了,是讨论另外一个话题了,和本主题开始公布的那个加密协议无关。
    xiaoAngel 2009-6-4 15:03
    10
    0
    赞成,支持一个。
    Rootkitche 2009-6-4 16:16
    11
    0
    发本帖的目的不是用他和其他复杂加密协议进行比较
    毕竟使用的场合不一样,无所谓孰强孰弱
    为的是给大家一个思路

    本协议可以用在不需要密钥交换的地方,如一个软件保险箱,藏一藏小秘密。
    本协议非常简单,亮点就在两个hash,否则要么无法进行认证,要么就会泄漏加密密钥。
    WisdomZh 2009-6-4 18:02
    12
    0
    这个协议需要密钥交换, 否则无法解密
    设计两个 hash 的目的仅仅在于事先验证, 没有合法的密钥, 就可以省去解密的过程了
    去掉第一个 hash 以后, 就不需要验证了, 不管来什么密钥, 直接尝试解密, 只是结果不一定对而已(这个需要事后验证)
    Rootkitche 2009-6-4 23:28
    13
    0
    我说的不需要密钥交换是指加密者和解密者是同一个人,比如张三将自己的私人日记用口令“天大地大我最大”进行加密,目的是不让别人看到自己的私人日记,而口令就保存在他的脑袋里,当那天他又要看看自己以前的日记时,他就从自己脑袋里取出口令对日记的密文进行解密就行了

    所谓的事后验证也是要有参考依据的,没有认证,就无法知道密钥是否正确,所以也无法对通过该密钥解密的结果进行验证,不能因为解密的结果是一堆垃圾就断定密钥的不正确,谁也不能保证被加密的数据本身就不是一堆垃圾!
    vrain 2009-6-5 13:08
    14
    0
    其实你的目的就是为了验证一下密钥是否正确而以。
    一个hash算法就够了,就像unix那样,产生一个随机的salt,保存 salt+hash(salt+pwd)
    加密密钥用 hash(pwd) 就是了。

    Rootkitche 2009-6-5 16:46
    15
    0
    这是一个不错的想法!
    Rootkitche 2009-6-8 23:24
    16
    0
    我将该协议实现了一下,没有什么技术含量,不过有一定的实用价值
    经过简单测试通过

    源代码及编译好的dll见附件
    jeffcjh 2009-6-9 20:50
    17
    0
    大家讨论来讨论去,其实都没有错。只是感觉LZ不应该说他提出的是一个协议,协议是在不同entity之间进行通信的流程,但是LZ说“我说的不需要密钥交换是指加密者和解密者是同一个人”,可见本文算法不是一个协议。所以WisdomZh和nudtsong会有些意见,他们是按照协议来理解的。
    Rootkitche 2009-6-9 21:17
    18
    0
    是啊,各人有各人的看法,我对加密协议的理解是加密具体步骤。
    jeffcjh 2009-6-9 21:29
    19
    0
    你所说的加密算法是用来加密数据的,加密密钥由口令生成,并且加密密钥并不需要通过网络等信道传输给另外的人,所以它不能做加密通信协议来看待,否则就要用上PKI之类的东西了。算法本身来看没什么问题的。
    Rootkitche 2009-6-9 21:45
    20
    0
    呵呵,是一个概念的理解问题
    这里指的协议是加密协议,也就是加密的步骤,和通讯协议不是一回事
    游客
    登录 | 注册 方可回帖
    返回