面试官:说说你常用的加密算法有哪些?加密算法一般分为对称加密和非对称加密两种。其中,对称加密算法使用相同的密钥进行加密和解密;非对称加密算法使用不同的密钥进行加密和解密,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是一种不可逆的数据汇总算法。这次我们来看消息摘要算法。MessageDigestAlgorithmMessageDigestAlgorithm是一种将任意长度的输入组合起来产生固定长度的伪随机结果的算法。在信息安全中,许多重要的应用都是使用消息摘要算法实现的,例如数字签名和消息认证码。对于任何给定的数据,消息摘要算法可以很容易地计算出摘要结果。很难从已知的汇总结果中推导出原始数据。修改数据内容而不改变汇总结果是行不通的。两个不同的数据产生相同汇总结果的可能性很小。常见的对称加密算法有:MD5算法、SHA。MD5算法MD5算法(MessageDigest5)是一种密码哈希函数,它产生一个128位的哈希值,可以用长度为32的十六进制字符串表示。MD5算法是由美国密码学家RonaldLinnRivest(the大佬是R,他发明了RSA算法),1992年发表,取代了之前的MD4算法(之前有MD3算法和MD2算法)。MD5算法将原始数据分成每组512位,再将每组分成16个32位的子组,与之前定义的4个幻数进行一系列的位运算循环,最终得到4个32位数据包,连接这四个32位数据包将生成一个128位哈希值。让我们用Java写一个例子:privatestaticfinalStringMD5="MD5";私人静态最终字符集CHARSET=StandardCharsets.UTF_8;publicstaticStringbuild(Stringinput)抛出NoSuchAlgorithmException{MessageDigestmd5=MessageDigest.getInstance(MD5);byte[]digest=md5.digest(input.getBytes(CHARSET));返回新的BigInteger(1,digest).toString(16);}publicstaticvoidmain(String[]args)throwsNoSuchAlgorithmException{Stringmsg="我喜欢你,你可以做我女朋友吗?";System.out.println("原文:"+msg);System.out.println("总结:"+build(msg));}}运行结果如下:原文:我喜欢你,你可以做我女朋友吗?摘要:f9fa148f2cfffda9b5e15a9e5bf34b662004年,MD5算法被证明无法防止碰撞攻击,因此不适用于安全认证。2009年,中科院谢韬和冯登国仅用了$2^{20.96}$的碰撞算法复杂度就破解了MD5的抗碰撞性。这种攻击只需几秒钟即可在普通计算机上运行。2011年,IETF(InternetEngineeringTaskForce,互联网工程任务组)发布RFC6151,禁止将MD5用作密钥散列消息认证码。总之,MD5已经不安全了,不要继续用了。SHASHA(SecureHashAlgorithm,安全哈希算法)是密码哈希函数族,是通过FIPS(FederalInformationProcessingStandards,联邦信息处理标准)认证的安全哈希算法。SHA家族包含了一套逐渐发展起来的算法,包括1993年发布的SHA-0、1995年发布的SHA-1、2001年发布的SHA-2、2015年发布的SHA-3。由于MD5的成功破解和SHA-0和SHA-1的理论破解方法,推荐使用SHA-2,或者更安全的SHA-3。我们用Java写一个SHA-2的例子:importjava.math.BigInteger;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;publicclassShaUtil{privatestaticfinalStringSHA_256="SHA-256";privatestaticfinalStringSHA_512="SHA-512";privatestaticfinalStringSHA3_256="SHA3-256";privatestaticfinalStringSHA3_512="SHA3-512";私人静态最终字符集CHARSET=StandardCharsets.UTF_8;publicstaticStringbuild(Stringinput,Stringalgorithm)throwsNoSuchAlgorithmException{MessageDigestmd5=MessageDigest.getInstance(算法);byte[]digest=md5.digest(input.getBytes(CHARSET));返回新的BigInteger(1,digest).toString(16);}publicstaticvoidmain(String[]args)throwsNoSuchAlgorithmException{Stringmsg="我喜欢你,可以做我女朋友吗?";系统.out.println("Original:"+msg);System.out.println("SHA2-256Digest:"+build(msg,SHA_256));System.out.println("SHA2-512Digest:"+build(msg,SHA_512));System.out.println("SHA3-256Digest:"+build(msg,SHA3_256));System.out.println("SHA3-512Digest:"+build(msg,SHA3_512));}}Theresultoftheoperationisasfollows:Originaltext:Ilikeyou,canyoubemygirlfriend?SHA2-256摘要:b6da8ee261f2b852c1140cf181e8d64b180ca6c884651ddb871bdff25afc836bSHA2-512摘要:d65f455eb38a565fae8e7c3ea6dbc005612071d5e57b688f32674e9641ab9aa6f056381222ba47cc973c86380f24fd10f4078ad7bfd3d498210d721734740a5aSHA3-256摘要:fc5f1427fc5a1bb2f231eec52fdaa5ac84652730143a3c7598dc2148ccd05cecSHA3-512摘要:5d8ba707c40c39f37c8cffd2eabf8da8d6d4ede70c697402a5e5ea6228c5710c3d76a6abbc1d46413bfced66280f72621feac12ce3ef49aed60902091ca1979fJDK8及以下版本不支持SHA-3,所以运行以上代码时会出现NoSuchAlgorithmException:SHA3-256MessageDigestnotavailable异常总结消息摘要算法Itisanalgorithmthatkneadsinputsofarbitrarylengthtogeneratepseudo-randomresultsoffixedlength.Commonsymmetricencryptionalgorithmsare:MD5algorithm,SHA.TheMD5algorithmshouldnolongerbeused.在SHA家族中,推荐使用SHA-2,或者更安全的SHA-3。这点我早就看出来了,你我一定是有缘,留下你的喜欢和关注,你日后必成大器。
