密码学工具汇总
密码学工具汇总 “工欲善其事,必先利其器.” 就像在程序设计中存在如数组,链表,二叉树等基本数据结构,在密码学协议当中也存在各种基本的原语( cryptographic primitives ),就像一个个基础的构建来建成一座高楼大厦一样. 这些源于组成了密码学的工具箱,在设计密码学协议时可以直接使用或参考他们的思想. 加密( Encryption )其中包括对称加密( symmetric encryption )和非对称加密( asymmetric encryption ). 两者区别就是前者解密和加密都是使用同一个密钥;而后者加密使用公钥( public key ),解密需要使用私钥( private key ). 前者加密解密速度可以比后者高出几个数量级,但是需要对密钥进行严格保密,不能直接适用于需要进行通信的场景中,实际中经常使用的方案是块加密( block cipher ),其密钥是一个固定的大小,视情况而言可能需要对明文进行padding;而后者虽然速度较慢,但是由于分开进行密钥管理,能够很好的应用于交互式场景,例如Alice发布自己的公钥,Bob就可以使用其对自己要发送的信息进行加密,然后Alice使用自己的私钥进行解密从而实现Alice和Bob的秘密通信. 当然在实际中还会涉及到一个安全密钥交换的过程,具体方案可以参考 Diffie-Hellman密钥交换协议 . 秘密分享( Secret share ),给定一个秘密s,秘密分享能够把s分布在n个用户当中,其中每个用户都不知道s. 只有当达到法定人数k时,这些用户才能够恢复相应的秘密s. 因此,秘密分享方案一般也被称为(k,n)-秘密分享,其中k代表恢复阈值,而n代表总的分享份数。其中一个经典的论文可以参照 这里 ,一个实现可以参考 这里 . 函数加密( Functional Encryption ). 函数加密一种公钥加密方法( public key encryption ),它允许一个中央( authority )生成并且分发与函数 f 1 , … , f q f_1,\ldots,f_q f 1 , … , f q 相关联的函数性密钥( functional keys ),利用这些函数性密钥,用户可以在给定 密文 x x x 的情况下...