如何学好hac函数与sha256算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何学好hac函数与sha256算法相关的知识,希望对你有一定的参考价值。

参考技术A SHA 家族
SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而现在的人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。
SHA-0 和 SHA-1
最初载明的算法于 1993年发布,称做安全散列标准 (Secure Hash Standard),FIPS PUB 180。这个版本现在常被称为 "SHA-0"。它在发布之后很快就被 NSA 撤回,并且以 1995年发布的修订版本 FIPS PUB 180-1 (通常称为 "SHA-1") 取代。根据 NSA 的说法,它修正了一个在原始算法中会降低密码安全性的错误。然而 NSA 并没有提供任何进一步的解释或证明该错误已被修正。1998年,在一次对 SHA-0 的攻击中发现这次攻击并不能适用于 SHA-1 — 我们不知道这是否就是 NSA 所发现的错误,但这或许暗示我们这次修正已经提升了安全性。SHA-1 已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它现在被认为是安全的。
SHA-0 和 SHA-1 会从一个最大 2^64 位元的讯息中产生一串 160 位元的摘要然后以设计 MD4 及 MD5 讯息摘要算法的 MIT 教授 Ronald L. Rivest 类似的原理为基础来加密。
SHA-0 的密码分析
在 CRYPTO 98 上,两位法国研究者展示了一次对 SHA-0 的攻击 (Chabaud and Joux, 1998): 散列碰撞可以复杂到 2^61 时被发现;小于 2^80 是理想的相同大小散列函数。
2004年时,Biham 和 Chen 发现了 SHA-0 的近似碰撞 — 两个讯息可以散列出相同的数值;在这种情况之下,142 和 160 位元是一样的。他们也发现了 SHA-0 在 80 次之后减少到 62 位元的完整碰撞。
2004年8月12日,Joux, Carribault, Lemuet 和 Jalby 宣布了完整 SHA-0 算法的散列碰撞。这是归纳 Chabaud 和 Joux 的攻击所完成的结果。发现这个碰撞要复杂到 2^51, 并且用一台有 256 颗 Itanium2 处理器的超级电脑耗时大约 80,000 CPU 工作时 。
2004年8月17日,在 CRYPTO 2004 的 Rump 会议上,Wang, Feng, Lai, 和 Yu 宣布了攻击 MD5、SHA-0 和其他散列函数的初步结果。他们对 SHA-0 攻击复杂到 2^40,这意味着他们攻击的成果比 Joux 还有其他人所做的更好。该次 Rump 会议的简短摘要可以在 这里找到,而他们在 sci.crypt 的讨论,例如: 这些结果建议计划使用 SHA-1 作为新的密码系统的人需要重新考虑。
更长的变种
NIST 发布了三个额外的 SHA 变体,每个都有更长的讯息摘要。以它们的摘要长度 (以位元计算) 加在原名后面来命名:"SHA-256", "SHA-384" 和 "SHA-512"。它们发布于 2001年的 FIPS PUB 180-2 草稿中,随即通过审查和评论。包含 SHA-1 的 FIPS PUB 180-2,于 2002年以官方标准发布。这些新的散列函数并没有接受像 SHA-1 一样的公众密码社群做详细的检验,所以它们的密码安全性还不被大家广泛的信任。2004年2月,发布了一次 FIPS PUB 180-2 的变更通知,加入了一个额外的变种 "SHA-224",定义了符合双金钥 3DES 所需的金钥长度。
Gilbert 和 Handschuh (2003) 研究了新的变种并且没有发现弱点。
SHAd
SHAd 函数是一个简单的相同 SHA 函数的重述:
SHAd-256(m)=

如何学好C语言的数据结构与算法?

C语言的数据结构与算法,难就难在链表,学会了链表,可能后面就一点都不难了。书籍推荐《数据结构与算法分析—C语言描述版》,要深入学习的话可以选择这本书,因为针对链表的讲解是比较详细的,所以可以很快理解链表。

跟着书上一点点实现基本操作(增删改查)动手很重要,遇到bug解决bug也重要,会让我们对链表理解的更加深刻。

数据结构的学习分为四层

首先,简单的理解方法,比如我们知道栈是先进后出,队列是先进先出就可以了,这个都很好理解。
其次,简单的应用方法,比如比如你知道
顺序表
的实现由数组和链表的方式,他们各自的优缺点,在某种场景使用,然后会写他们的test文件,就是怎么去初始化一个表,调用一下插入方法啊,删除啊,求长度啊之类的。
之后,理解具体的实现,能看懂具体的实现方法,比如链表插入的函数,逻辑可以跟上,大概就是如何新建一个节点,怎么把数据放入节点,怎么让前一个节点只想这个节点之类的,这时候照着书上的代码敲出来,保证可以运行。

最后,通过系列的学习和刷题,可以直接默写代码。

刷题之前必备掌握基础

不要基础还没有掌握扎实就开始刷题了,如果你想开始刷题了,那么一定要具备的基础有:
1、常见数据结构:链表、树(如二叉树)。
2、常见算法思想:贪婪法、分治法、穷举法、动态规划,回溯法。
以上列出来的算是最基本的吧。就是说你刷题之前,要把这些过一遍再去刷题。如果你连这些最基本的都不知道的话,那么你再刷题的过程中,会很难受的,思路也会相对比较少。
总之,千万不要急,先把这些基本的过一遍,力求理解,再去刷题。这些基础的数据结构与算法,可以通过看书学习,可以看的书是:
1、算法分析与分析基础:这本比较简单,推荐新手看。
2、数据结构与算法分析—-C语言描述:代码用C写的,推荐看。
3、挑战程序设计竞赛(第二版):也是很不错的一本书,推荐看。
刷题方法放送

在做题的时候一定要有追求完美的态度,不要把一个题做出来之后就直接刷过去。
算法的能力提升和做题数量有一定关系,但更多的是积累+优化。第一次做题粗略做出来就可以了,但是下一遍的时候要思考如何降低时间复杂度或者空间复杂度。想不明白的话,也有很多大佬分享自己的做法。

常见的刷题网站就是

剑指Offer_在线编程+题解_牛客题霸_牛客网 (该网址为《剑指offer》原题,里面70%的手撕代码题目)
leetcode:如果大家时间够的话,建议还是要刷一刷的,很多企业的笔试题目的来源之地
mysql:相关内容,大家需要练习!
【这可能不只是一篇面经】_笔经面经_牛客网(这是一篇完整的面试经,不要以为时间太久了,但是经典永远是经典哈)
最后:看课入门->看书深入->动手去做->刷题,数据结构和算法,或者说刷题,是一个要长期坚持的事情。

以上是关于如何学好hac函数与sha256算法的主要内容,如果未能解决你的问题,请参考以下文章

比特币背后的算法与数学

什么是安全散列算法SHA256

Python中hashlib模块的使用

MD5,sha1,sha256分别输出多少位啊?

SHA256

SHA-256算法