博文

Format Preserving Encryption

图片
Format Preserving Encryption Format Preserving Encryption 保格式加密(format preserving encryption,简称FPE)是一种 对称密码学 工具,它能够在保证原有格式的情况下进行加密. 对于明文空间中的一条信息,其加密结果也应该是中的一条信息. 比如对于一个手机号的加密结果还是一个手机号. 因此,保格式加密相当于对进行了一次排列,将其映射到另一条信息. 形式化的说,FPE是一个四元函数​ E : K × N × T × X → X ∪ { ⊥ } E: \mathcal{K}\times\mathcal{N}\times\mathcal{T}\times\mathcal{X}\rightarrow\mathcal{X}\cup\{\perp\} E : K × N × T × X → X ∪ { ⊥ } 其中 K \mathcal{K} K ​表示密钥集合,​​​​​​ T \mathcal{T} T 表示格式集合,​ T \mathcal{T} T 表示调整键集合,​ X \mathcal{X} X 表示域空间. 上述所有集合都非空并且​. 对于一个特定的FPE可以缩写为​,其表示为使用密钥​和调整键​在格式​的情况下对​进行加密. 一个理想的FPE表现为域 ​ 中的一个随机排列. 对于FPE而言,目前主流的方法是使用块加密来构建. 关于块加密方法的对比可以参考 这里 . 视频教学可以参照 这里 . 应用 FPE主要应用在老旧系统的向下兼容:业已存在的系统不需要经过太大的改动就能够进行加密匹配. 例如系统中需要使用信用卡号,如果使用AES进行加密,那么其产生的结果将会包含16进制字符,因此系统需要进行较大修改才能够保证正常使用. 如果使用FPE,那么其结果同样会是一个信用卡号,对于已有系统的改动就会较小 [1] . 除此之外,FPE还能适用于数据库当中. 例如某个用户想将自己的加密信用卡号存储在一个数据库中,他就可以使用FPE加密自己的信用卡号,而服务端则会将其当作信用卡号进行存储. 如果使用AES进行加密,那么服务端将不能识别其为一个信用卡号 [1] . 算法 基本原理——排序加密法 由于之前关于FPE的介绍我们可以得知...

密码学工具汇总

密码学工具汇总 “工欲善其事,必先利其器.” 就像在程序设计中存在如数组,链表,二叉树等基本数据结构,在密码学协议当中也存在各种基本的原语( 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 的情况下...

读书笔记-《Succeed: How We Can Reach Our Goals》

--- --- 目标设定 想要成功,首先得设定一个目标,否则就不存在一个可以用来衡量自己是否成功得标准. 因此,设定一个目标非常重要.在进行目标设定时,需要注意两点:一个宏观层面;另一个则是微观层面. 首先说说宏观层面,在进行目标设定时,一个首要原则是,目标需 清晰且有一定难度 . 一个清晰得目标,比如说“今天我要看完1篇论文”;就比“今天我要努力看论文”要好. 因为对于后者来说,如何判定自己是否努力了呢?人是具有自我解释得倾向得,即很容易为自己寻找各种理由. 目标有一定得难度是因为太过容易得目标在完成之后也不能带来什么成就感,反而容易让人陷入地低成就快感当中. 在微观层面,尽量为自己设置 成长性目标而不是展示性目标 . 成长性目标关注的是自己能够从要做的这件事当中学到什么,比如说在LeetCode上面做题是为了更好学习算法知识,学习某一门课是为了更好的了解这门课的内容等. 而展示性目标则是,在LeetCode上面做题是为了展示自己算法厉害,获得评论区的认可,学习某一门课是为了那90分以上,展示自己聪明. 虽然设定展示性目标在目标比较容易且激励明显的时候能够带来很强的动力,但是在遇到困难的时候,展示性目标则很容易选择放弃或者不愿寻求帮助. 因为遇到困难和寻求他人帮助就意味着自己 并不擅长 此事,显得自己不聪明,没有优良品质. 而成长性目标则会让人更好的坚持,提供更强劲的动力. 因为成长性目标更关注 自己学到了什么 ,而困难则意味着自己可以从中了解到之前没有考虑到的东西,向他人寻求帮助能学习他人做事情或者看问题的角度和方法. 心态 在设定号目标之后,接下来就应该调整自己的心态了. 首先是对目标设定的乐观,接着则是对行动上心态的调整. 乐观是一个好品质. 但是在设计目标设定时则存在着两种方式的乐观: 一种是对结果完成后自己收获的乐观. 比如只要高考完上一个好大学就能够有光明的前途了. 一种是对过程乐观. 比如高考其实还是很容易的,随便准备准备就行了. 对于对过程乐观而言,它在完成目标却不是一件好事. 因为它会让人在具体对目标进行行动的时候不做好充足的打算,这样就很容易出现一些意料之外的状态. 由于把对过程过于乐观,这就和现实产生了冲突,这样就很容易产生放弃的心理. 因为这时言行和行动不一致,而人本身的心理决定人是厌恶这一点的. 对结果乐...