第1关:哈希函数
题目
任务描述
相关知识
为了完成本关任务,你需要掌握:1.密码学哈希函数的概念及特性,2.安全哈希算法。
密码学哈希函数的概念及特性
我们需要理解的第一个密码学的基础知识是密码学哈希函数,哈希函数是一个数学函数,具有以下三个特性: ● 其输入可为任意大小的字符串。 ● 它产生固定大小的输出。为使本章讨论更具体,我们假设输出值大小为256
位,但是,我们的讨论适用于任意规模的输出,只要其足够大。 ● 它能进行有效计算,简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。更准确地说,对应n位的字符串,其哈希值计算的复杂度为O(n)
。 这些特性定义了一般哈希函数,以这个函数为基础,我们可以创建数据结构,例如哈希表。我们将只专注于加密的哈希函数,要使哈希函数达到密码安全,我们要求其具有以下三个附加特性:
下面具体阐述这三个特性
安全哈希算法
安全哈希算法(SecureHashAlgorithm256
,简称SHA−256
)。哈希函数有很多,但SHA−256
是一个主要被比特币世界采用,并且效果还很不错的哈希函数。 回想一下,我们要求哈希函数可以用于任意长度输入。幸运的是,只要我们能建立一个用于固定长度输入的哈希函数,然后通过一般方法,就可以将接受固定长度的哈希函数转化为可接受任意长度输入的哈希函数,我们称这个转换过程为MD
(Merkle−Damgard
)变换,SHA−256
是采用这种变换方法的常用哈希函数之一。在通用术语中,这种基础型,可用于固定长度,具备碰撞阻力的哈希函数被称为是压缩函数(compressionfunction
)。经过验证,如果基本压缩函数具有碰撞阻力的特性,那么经过转换而生成的哈希函数也具有碰撞阻力。 MD
变换很简单。比如压缩函数代入长度为m
的输入值,并产生长度短一些为n
的输出值。哈希函数的输入(可为任意大小)被分为长度为m−n
的区块。MD
变换运作过程如下:将每个区块与之前区块的输出一起代入压缩函数,注意,输入长度则变为(m−n)+n=m
,也刚好就是压缩函数的输入长度。对于第一个区块而言,之前没有的区块,我们需要选取一个初始向量。每次调用哈希函数,这个数字都会被再一次使用,而在实践中,你可以直接在标准文档中找到它。最后一个区块的输出也就是你返回的结果。 SHA−256
函数利用了这样的一个压缩函数,这个压缩函数把一个768
位的输入压缩成一个256
位的输出,每一个区块的大小是512
位。
编程要求
根据提示,在右侧编辑器补充代码,输出每个字符串的次数,具体格式看样例,输出按照字符串的字典序从小到大输出。