密码学系列之:memory-bound函数
密码学系列之:memory-bound函数
简介
memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工作数据所需的内存量。和之相对应的就是计算受限compute-bound的函数,在计算受限的函数中,计算所需要的计算步骤是其决定因素。
本文将会介绍一下内存受限函数和它跟内存函数的关系。
内存函数
内存函数和内存受限函数看名字好像很类似,其实他们的作用是不同的,我们先来看下内存函数。
在学习算法中,有一个非常简单好用的算法叫做递归算法,熟悉递归算法的朋友可能都知道,递归算法虽然好用,但是有个缺点就是会重复计算递归过程中的函数,比如说递归中最经典的斐波拉赫数列:
Recursive_Fibonacci (n)
{
if (n == 0)
return 0
if (n == 1)
return 1
return Recursive_Fibonacci (n-1) + Recursive_Fibonacci (n-2)
}
很简单,但是我们来考虑下计算过程,F(3)=F(2)+F(1), 而F(4)=F(3)+F(2),在这个过程中需要计算2次F(2)的值。如果计算的N值够大的话,重复计算的值还会更多。
一个解决方法就是将之前计算过的结果使用内存存起来,这种方法就叫做内存函数:
Fibonacci (n)
{
for i = 0 to n-1
results[i] = -1 // -1 means undefined
return Fibonacci_Results (results, n);
}
Fibonacci_Results (results, n)
{
if (results[n] != -1) // If it has been solved before,
return results[n] // look it up.
if (n == 0)
val = 0
else if (n == 1)
val = 1
else
val = Fibonacci_Results(results, n-2 ) + Fibonacci_Results(results, n-1)
results[n] = val // Save this result for re-use.
return val
}
虽然直接递归的逻辑很简单,写起来也很方便,但是它的时间复杂度会更高。
内存受限函数
内存受限函数主要用来描述一个使用XOR的函数,它由一系列计算组成,其中每一次计算都依赖于前一次计算。
因为这样的内存依赖关系,所以内存受限函数主要用在密码学中,可以防止密码的暴力破解工作。
下面举个内存受限函数在防止垃圾邮件中的使用。
内存受限函数的使用
使用内存受限函数来防止垃圾邮件,主要使用的是POW的原理,也就是说,你可以给我发垃圾邮件,但是前提是需要付出一些代价。
当然,最初的防垃圾邮件的原理是使用CPU受限函数。
1992年,IBM的研究科学家Cynthia Dwork和Moni Naor在CRYPTO上发表了一篇题为《通过定价来阻止垃圾邮件》的论文,他们提出了一种利用CPU受限函数的功能来阻止滥用者发送垃圾邮件的可能性。
该方案的原理是:如果滥发邮件的成本很低,那么垃圾邮件就可能横行。如果能够通过以昂贵的CPU计算的形式为发送邮件添加额外的计算成本,就可以减少垃圾邮件。使用CPU受限函数,使得每发一次邮件都需要消耗一定的CPU资源,从而防止在短时间内发送大量的垃圾邮件。
CPU受限函数是一种突破,但是也有其缺点。
因为快CPU的计算速度比慢CPU快得多。此外,高端计算机系统也有复杂的流水线和其他有利于计算的优化功能。因此,拥有高端系统的垃圾邮件发送者几乎不会受到这种CPU受限函数的影响。
从而会因为不同用户机器性能的不同,导致非常大的计算时间差异。比如如果一个算法在高级计算机上需要几秒钟,那么在老的计算机上可能需要1分钟,而在性能更差点的手机上可能会需要几分钟,那么这个算法肯定是无法被手机用户接受的。
因此,研究者们关注的是如何找到一种在大多数计算机系统都以大致相同的速度运行的函数,虽然在高级计算机上速度会更快,但也只是稍微快一点而已,不是几何级数的快,那么就可以在容忍范围之内。
这种方法就是使用内存受限函数。内存受限函数是指计算时间由访问内存的时间支配的函数。内存受限函数以一种不可预测的方式访问大内存区域的位置,从而无法使用缓存来提升性能。
使用内存受限而不是CPU受限也有其工业上的原因,近年来,虽然CPU的计算速度急剧增长,但在开发更快的主内存方面进展相对较小。所以可以预见,在未来的一定时间内,内存受限函数还会有越来越多的应用场景。
本文已收录于 http://www.flydean.com/memory-bound/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
密码学系列之:memory-bound函数的更多相关文章
- 密码学系列之:memory-hard函数
密码学系列之:memory-hard函数 目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory ...
- shell编程系列6--shell中的函数
shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...
- 密码学系列之:碰撞抵御和碰撞攻击collision attack
密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...
- 密码学系列之:feistel cipher
密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...
- 密码学系列之:Argon2加密算法详解
目录 简介 密钥推导函数key derivation function Password Hashing Competition Argon2算法 Argon2的输入参数 处理流程 简介 Argon2 ...
- 进程间通信系列 之 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器
这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...
- 密码学系列之:Merkle–Damgård结构和长度延展攻击
密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...
- 密码学系列之:海绵函数sponge function
目录 简介 海绵函数的结构 海绵函数的应用 简介 海绵函数sponge function是密码学中使用的一种函数,它接收一定长度的输入,然后输出一定长度的输出,中间包含了有限个内部状态. 因为海绵函数 ...
随机推荐
- 用virtualenv建立Python独立开发环境
1.用pip安装virtualenv sudo apt-get install python-virtualenv 2.1 创建python2的虚拟环境,进入要创建虚拟环境的目录下,我是放在/home ...
- openresty 学习笔记三:连接redis和进行相关操作
openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...
- 快速导入GitHub上面的公钥
有时候新装了一台linux机器, 又要找公钥导进去, 或者在自己电脑上执行ssh-copy-id, 有时候手边没有电脑就比较麻烦, 我们可以将GitHub上配置的公钥导入到机器里 首先包装GitHub ...
- 使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存
一.问题背景 自己开发的Java项目中占用太多的Heap Space.即使在Eclipse的虚拟机参数中设置"-Xms128m -Xms2048m -XX:MetaspaceSize=512 ...
- 将TVM集成到PyTorch
将TVM集成到PyTorch 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.PyTo ...
- Apollo 自动驾驶开发套件(D-KIT)
Apollo 自动驾驶开发套件(D-KIT)
- GraphX编程指南
GraphX编程指南 概述 入门 属性图 属性图示例 图算子 算子摘要列表 属性算子 结构化算子 Join算子 最近邻聚集 汇总消息(aggregateMessages) Map Reduce三元 ...
- H.264/H265码流解析
H.264/H265码流解析 一.H.264码流解析 一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成 一个原始的 ...
- guavacache源码阅读笔记
guavacache源码阅读笔记 官方文档: https://github.com/google/guava/wiki/CachesExplained 中文版: https://www.jianshu ...
- B站英文教学视频的字幕获取 学习必看!
前言 最近在B站看一些纯英文的课程,视频课程有的是纯中文字幕的,有的是纯英文字幕的.由于英文的重要性,一份字幕的文档在我们观看后,留着日后粗略再读是很有益处的.但是为了得到这个英文字幕走了许多弯路.最 ...