密码学系列之: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是密码学中使用的一种函数,它接收一定长度的输入,然后输出一定长度的输出,中间包含了有限个内部状态. 因为海绵函数 ...
随机推荐
- 收购公司、孵化(产品)和被收购的20个短篇故事-BI产品的历史
原文地址: 20 short tales of acquiring companies, incubating (ideas into products) and being acquired. | ...
- 小程序中在设置了textarea后三个祖级内事件失效
在一次写小程序项目中收货地址中的详细地址时,我用的是文本域,下边的三个bindtap事件却不能使用了:下图: 报错信息如下图: 通过一番查找以及尝试之后,我发现是因为textarea标签的问题,但是依 ...
- [leetcode] 30. 与所有单词相关联的字串(cn第653位做出此题的人~)
30. 与所有单词相关联的字串 这个题做了大概两个小时左右把...严重怀疑leetcode的judge机器有问题.同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一 ...
- Python+Selenium自动化 模拟鼠标操作
Python+Selenium自动化 模拟鼠标操作 在webdriver中,鼠标的一些操作如:双击.右击.悬停.拖动等都被封装在ActionChains类中,我们只用在需要使用的时候,导入这个类就 ...
- JavaScript 中数组 sort() 方法的基本使用
在日常的代码开发中,关于数组排序的操作可不少,JavaScript 中可以调用 sort 方法对数组进行快速排序. 今天,就数组的 sort 方法来学习一下,避免日后踩坑的悲惨遭遇. 概念 sort ...
- BIO/NIO/ANO笔记
一: netty服务器启动过程 serverBootstrap.bind(hostname, port)---> doBind(localAddress);--> 1.1: initAnd ...
- Java 面试题关于包装类
这几个问题的知识点涉及的内容非常的刁钻,值得自己好好的理解. 问以下程序的输出结果是: 问题一: Object object=true ? new Integer(1):new Double(2.0) ...
- 信道均衡之非线性均衡——Tomlinson-Harashima Precoding(THP)
线性均衡可以做在接收端,也可以做在发送端,而DFE只能做在接收端.对于DFE的讨论都是建立在判决器能够判决正确的情况下,但是如果每一个发送的符号含有多比特信息,比如PAM16,由于发送信号的最大能量是 ...
- mapboxgl 互联网地图纠偏插件(一)
之前写过一个 leaflet 互联网地图纠偏插件,引用插件后一行代码都不用写,就能解决国内互联网地图瓦片的偏移问题. 最近想对 mapboxgl 也写一个这样的插件. 原因是自己发布的OSM矢量瓦片地 ...
- 为什么我严重不建议去培训机构参加SAP培训?
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 关于是否要参加SAP培训的话题已经是老生常谈了,知乎上随便一搜有好多人在问是否要去参加SAP培训,底下已经有很多人在上面给出了正确建议.但也 ...