【Java小工匠聊密码学】--消息摘要--SHA3算法
1、SHA3概述
1.1 SHA3简介
由于近年来对传统常用Hash 函数如MD4、MD5、SHA0、SHA1、RIPENMD 等的成功攻击,美国国家标准技术研究所(NIST)在2005年、2006年分别举行了2届密码Hash 研讨会;同时于2007年正式宣布在全球范围内征集新的下一代密码Hash算法,举行SHA-3竞赛·新的Hash算法将被称为SHA-3,并且作为新的安全Hash标准,增强现有的FIPS 180-2标准。算法提交已于2008年10月结束,NIST 将分别于2009年和2010年举行2轮会议,通过2轮的筛选选出进入最终轮(final round)的算法,最后将在2012年公布获胜算法。公开竞赛的整个进程仿照高级加密标准AES 的征集过程。2012年10月2日,Keccak被选为NIST竞赛的胜利者, 成为SHA-3.。
1.2 SHA3作者
Keccak算法由意法[半导体] 的Guido Bertoni、Joan Daemen(AES算法合作者)和Gilles Van Assche,以及恩智浦半导体的Michaël Peeters联合开发。NIST计算机安全专家Tim Polk说,Keccak的优势在于它与SHA-2设计上存在极大差别,适用于SHA-2的攻击方法将不能作用于Keccak。
1.3 海绵引擎
Keccak的海绵结构中,输入的数据在进行填充后,要经过吸收阶段和挤出阶段,最终生成输出的散列值。
“海绵结构”这个名字听上去有点怪,请大家想象一下将一块海绵泡在水里吸水,然后再将里面的水挤出来的情形。同样地,Keccak 的海绵结构是先将输入的消息吸收到内部状态中,然后再根据内部状态挤出相应的散列值。
1.4 实现难度
Keccak采用了创新的的“海绵引擎”散列消息文本。它是快速的,在英特尔酷睿2处理器下的平均速度为12.5周期每字节。它设计简单,方便硬件实现。
1.5 防攻击
Keccak已可以抵御最小的复杂度为2n的攻击,其中N为散列的大小。它具有广泛的安全边际。至目前为止,第三方密码分析已经显示出Keccak没有严重的弱点。
2、SHA3 算法实现
package lzf.cipher.bc; import java.nio.charset.Charset; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.SHA3Digest; import org.bouncycastle.crypto.digests.SHAKEDigest; import org.bouncycastle.util.encoders.Hex; /** * @author Java 小工匠 */ public class BCSha3Utils { // SHA3-224 算法 public static String sha3224(byte[] bytes) { Digest digest = new SHA3Digest(224); digest.update(bytes, 0, bytes.length); byte[] rsData = new byte[digest.getDigestSize()]; digest.doFinal(rsData, 0); return Hex.toHexString(rsData); } // SHA3-256 算法 public static String sha3256(byte[] bytes) { Digest digest = new SHA3Digest(256); digest.update(bytes, 0, bytes.length); byte[] rsData = new byte[digest.getDigestSize()]; digest.doFinal(rsData, 0); return Hex.toHexString(rsData); } // SHA3-384 算法 public static String sha3384(byte[] bytes) { Digest digest = new SHA3Digest(384); digest.update(bytes, 0, bytes.length); byte[] rsData = new byte[digest.getDigestSize()]; digest.doFinal(rsData, 0); return Hex.toHexString(rsData); } // SHA3-512 算法 public static String sha3512(byte[] bytes) { Digest digest = new SHA3Digest(512); digest.update(bytes, 0, bytes.length); byte[] rsData = new byte[digest.getDigestSize()]; digest.doFinal(rsData, 0); return Hex.toHexString(rsData); } // SHAKE-128 算法 public static String shake128(byte[] bytes) { Digest digest = new SHAKEDigest(128); digest.update(bytes, 0, bytes.length); byte[] rsData = new byte[digest.getDigestSize()]; digest.doFinal(rsData, 0); return Hex.toHexString(rsData); } // SHAKE-256 算法 public static String shake256(byte[] bytes) { Digest digest = new SHAKEDigest(256); digest.update(bytes, 0, bytes.length); byte[] rsData = new byte[digest.getDigestSize()]; digest.doFinal(rsData, 0); return Hex.toHexString(rsData); } public static void main(String[] args) { byte[] bytes = "java小工匠".getBytes(Charset.forName("UTF-8")); String sha3224 = sha3224(bytes); System.out.println("sha3-224:" + sha3224 + ",lengh=" + sha3224.length()); String sha3256 = sha3256(bytes); System.out.println("sha3-256:" + sha3256 + ",lengh=" + sha3256.length()); String sha3384 = sha3384(bytes); System.out.println("sha3-384:" + sha3384 + ",lengh=" + sha3384.length()); String sha3512 = sha3512(bytes); System.out.println("sha3-512:" + sha3512 + ",lengh=" + sha3512.length()); String shake128 = shake128(bytes); System.out.println("shake-128:" + shake128 + ",lengh=" + shake128.length()); String shake256 = shake256(bytes); System.out.println("shake-256:" + shake256 + ",lengh=" + shake256.length()); } }
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】
个人公众号,欢迎关注,查阅更多精彩历史!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【Java小工匠聊密码学】--消息摘要--RIPEMD算法
1、什么是RIPEMD RIPEMD(RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校验消息摘要,是Hans Dobbertin等3人在md4,md5的基础上,于1996年提出来的。算法共有4个标准128、160、256和320,其对应输出长度分别为16字节、20字节、32字节和40字节。不过,让人难以致信的是RIPEMD的设计者们根本就没有真正设计256和320位这2种标准,他们只是在128位和160位的基础上,修改了初始参数和s-box来达到输出为256和320位的目的。所以,256位的强度和128相当,而320位的强度和160位相当。RIPEMD建立在md的基础之上,所以,其添加数据的方式和md5完全一样。 2、RIPEMD 应用案例 比特币在生成地址算法中,使用了该算法。 3、RIPEMD算法实现 package lzf.cipher.bc; import java.nio.charset.Charset; import org.bouncycastle.crypto.Digest; import or...
- 下一篇
Python全栈工程师(Linux基本操作)
ParisGabriel Python 入门基础 Linux :Ubuntu操作系统 首先我们说的是Linux操作系统常用的快捷键以及终端命令 一. VMware Workstation 虚拟机 快捷键: Ctrl+Alt+Ent 调节虚拟机内操作系统的全屏以及窗口 Ctrl+Alt 释放虚拟机占用鼠标 二. 终端命令: 命令格式:命令名+选项+参数 1.打开终端: 手动找到终端打开 Alt+F2 打开搜索窗口输入:gnome-terminal Ctrl+Alt+T 打开终端(推荐) 2.终端窗口快捷键 Ctrl+Shift+“+” 放大终端 Ctrl+“-”缩小终端 Ctrl+L 清屏 Ctrl+d (exit) 退出关闭 Ctrl+C 终止当前命令的执行 Ctrl+S 隐藏终端输出 Ctrl+Q 恢复终端输出 3.终端命令行 “.” 代表当前目录 “..” 代表上一级目录 “~” 代表用户主目录 “/” 代表根 (最高目录) Windows有 C: D: F: 盘符之分 Linux系统...
相关文章
文章评论
共有0条评论来说两句吧...