当前位置: 首页 > 后端技术 > Java

快速了解常用的对称加密算法,再也不用担心面试官的盘问

时间:2023-04-01 20:41:52 Java

面试官:说说你常用的加密算法有哪些?加密算法一般分为对称加密和非对称加密两种。其中,对称加密算法使用相同的密钥进行加密和解密;非对称加密算法使用不同的密钥进行加密和解密,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是一种不可逆的数据汇总算法。这次我们来看对称加密算法。对称加密算法对称加密算法使用相同的密钥进行加密和解密,或者使用两个很容易相互推导出来的密钥。在大多数对称加密算法中,加密和解密密钥是相同的。它需要两方在安全通信之前就密钥达成一致。对称算法的安全性取决于密钥。泄露密钥意味着任何人都可以解密他们发送的信息,这是对称加密算法的主要缺点之一。常见的对称加密算法有:DES算法、3DES算法、AES算法。DES算法DES算法(DataEncryptionStandard)是一种通用的块加密算法。面试官:什么是区块加密算法?分块加密算法是将明文分成固定长度的组,每组用相同的密钥和算法加密,输出的也是固定长度的密文。1972年由IBM开发,1976年被美国联邦政府国家标准局确定为联邦数据处理标准(FIPS),随后在国际上广泛传播。在DES算法中,密钥的长度固定为64位。将明文按64位进行分组,分组后的明文组与密钥进行替换或交换形成密文组,然后将密文组组装成密文。密钥的每8位设置一个奇偶校验位,即第8、16、24、32、40、48、56、64位,所以参与加密的密钥实际长度为56位。我们用Java写一个例子:importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;importjava.security.GeneralSecurityException;importjava.util.Base64;publicclassDesUtil{privatestaticfinalStringDES="DES";私人静态最终字符集CHARSET=StandardCharsets.UTF_8;/***加密**@paraminput明文*@paramkey密匙*@return密文*@throwsGeneralSecurityException*/publicstaticStringencrypt(Stringinput,Stringkey)throwsGeneralSecurityException{Ciphercipher=Cipher.getInstance(DES);SecretKeykeySpec=newSecretKeySpec(key.getBytes(CHARSET),DES);cipher.init(Cipher.ENCRYPT_MODE,keySpec);byte[]data=cipher.doFinal(input.getBytes(CHARSET));返回Base64.getEncoder().encodeToString(数据);}/***解密**@paraminput密文*@paramkeykey*@returnplaintext*@throwsGeneralSecurityException*/publicstaticStringdecrypt(Stringinput,Stringkey)throwsGeneralSecurityException{Ciphercipher=Cipher.getInstance(DES);SecretKeykeySpec=newSecretKeySpec(key.getBytes(CHARSET),DES);cipher.init(Cipher.DECRYPT_MODE,keySpec);byte[]data=cipher.doFinal(Base64.getDecoder().decode(input));返回新字符串(数据,字符集);}publicstaticvoidmain(String[]args)throwsGeneralSecurityException{Stringmsg="我喜欢你,你可以做我女朋友吗?";Stringkey="One-More";System.out.println("加密前:"+msg);Stringpwd=DesUtil.encrypt(msg,key);System.out.println("加密后:"+pwd);System.out.println("解密后:"+DesUtil.decrypt(pwd,key));}}运行结果如下:加密前:我喜欢你,可以做我女朋友吗?加密后:i5LZ5aJMrlgN+Pr5IQm87Q14k0kmDLFIPnJmtrGA/xBHG0SivGrqCrc3vXjZoCBm解密后:我喜欢你,你可以是我女朋友?DES不再是一种安全的加密方式,主要是因为它使用的密钥太短,容易被暴力破解。DES加密。由于计算机计算能力的增强,DES算法由于密钥长度太短,很容易被暴力破解;3DES算法提供了一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一个全新的分组密码算法。在DES算法中,固定密钥长度为192位。加解密时,密钥被分成三个64位的密钥。采访者:3DES算法加解密的过程是怎样的?加密过程如下:使用第一个密钥对明文进行加密。使用第二个密钥解密上一步的结果。用第三个密钥加密上一步的结果。解密过程如下:用第三把钥匙解密明文。用第二个密钥加密上一步的结果。使用第一个密钥解密上一步的结果。我们用Java写一个例子:importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;importjava.security.GeneralSecurityException;importjava.util.Base64;publicclassTripleDesUtil{privatestaticfinalStringDESede="DESede";私人静态最终字符集CHARSET=StandardCharsets.UTF_8;/***加密**@paraminput明文*@paramkey密匙*@return密文*@throwsGeneralSecurityException*/publicstaticStringencrypt(Stringinput,Stringkey)throwsGeneralSecurityException{Ciphercipher=Cipher.getInstance(DESede);SecretKeykeySpec=newSecretKeySpec(key.getBytes(CHARSET),DESede);cipher.init(Cipher.ENCRYPT_MODE,keySpec);byte[]data=cipher.doFinal(input.getBytes(CHARSET));返回Base64.getEncoder().encodeToString(数据);}/***解密**@paraminputciphertext*@paramkeykey*@returnplaintext*@throwsGeneralSecurityException*/publicstaticStringdecrypt(Stringinput,Stringkey)throwsGeneralSecurityException{Ciphercipher=Cipher.getInstance(DESede);}SecretKeykeySpec=newSecretKeySpec(key.getBytes(CHARSET),DESede);cipher.init(Cipher.DECRYPT_MODE,keySpec);byte[]data=cipher.doFinal(Base64.getDecoder().decode(input));返回新字符串(数据,字符集);}publicstaticvoidmain(String[]args)throwsGeneralSecurityException{Stringmsg="我喜欢你,你可以做我女朋友吗?";Stringkey="One-More12345678One.More";System.out.println("加密前:"+msg);Stringpwd=TripleDesUtil.encrypt(msg,key);System.out.println("加密后:"+pwd);System.out.println("解密后:"+TripleDesUtil.decrypt(pwd,key));}}结果如下:加密前:我喜欢你,可以做我女朋友吗?加密后:q/ZWtjDGoxIjmd30he0oZ3XLjJhh/ACedaXaj12Zi3Wtlqz+ZzJmQuScjKuZoONF解密后:我喜欢你,你可以做我女朋友吗?3DES算法虽然在安全性上有所提高,但由于使用了3??次DES算法,加解密速度相对较慢。AES算法AES(AdvancedEncryptionStandard,高级加密标准)主要是为了取代DES加密算法。3DES加密方式,但由于其加密时间是DES算法的3倍以上,所以密钥位数仍然不能满足安全要求。1997年1月2日,美国国家标准技术研究院(NIST)宣布希望征集先进的加密标准来替代DES。世界各地的许多密码学家都提交了他们自己设计的算法。经过遴选,高级加密标准于2001年11月26日由美国国家标准技术研究院在FIPSPUB197中发布,并于2002年5月26日成为有效标准。该算法由比利时密码学家JoanDaemen和文森特·里杰曼。结合两位作者的名字,高级加密标准的选择过程以Rijndael的名义提交。面试官:AES算法的密钥长度是固定的吗?AES算法的密钥长度是固定的,密钥长度可以是128位、192位或256位。AES算法也是一种块加密算法,它的块长度只能是128位。分组后的明文组和密钥用几种不同的方法进行排列和置换运算,形成密文组,然后将密文组组装成密文。我们用Java写一个例子:importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;importjava.security.GeneralSecurityException;importjava.util.Base64;publicclassAesUtil{privatestaticfinalStringAES="AES";私人静态最终字符集CHARSET=StandardCharsets.UTF_8;/***加密**@paraminput明文*@paramkey密匙*@return密文*@throwsGeneralSecurityException*/publicstaticStringencrypt(Stringinput,Stringkey)throwsGeneralSecurityException{Ciphercipher=Cipher.getInstance(AES);SecretKeykeySpec=newSecretKeySpec(key.getBytes(CHARSET),AES);cipher.init(Cipher.ENCRYPT_MODE,keySpec);byte[]data=cipher.doFinal(input.getBytes(CHARSET));返回Base64.getEncoder().encodeToString(数据);}/***解密**@paraminput密文*@paramkeykey*@returnplaintext*@throwsGeneralSecurityException*/publicstaticStringdecrypt(Stringinput,Stringkey)throwsGeneralSecurityException{Ciphercipher=Cipher.getInstance(AES);SecretKeykeySpec=newSecretKeySpec(key.getBytes(CHARSET),AES);cipher.init(Cipher.DECRYPT_MODE,keySpec);byte[]data=cipher.doFinal(Base64.getDecoder().decode(input));返回新字符串(数据,字符集);}publicstaticvoidmain(String[]args)throwsGeneralSecurityException{Stringmsg="我喜欢你,你可以做我女朋友吗?";Stringkey="One-More12345678One.More87654321";System.out.println("加密前:"+msg);Stringpwd=AesUtil.encrypt(msg,key);System.out.println("加密后:"+pwd);System.out.println("解密后:"+AesUtil.decrypt(pwd,key));}}运行结果如下:加密前:我喜欢你,可以做我女朋友吗?加密后:dT29xX+XpPTO3OMuDw1ASyU/+aNfJ1K+endNUJ84h2KZhqRDNfiO4hAQjOXMCoN4解密后:我喜欢你,可以做我女朋友吗?AES算法是目前使用最广泛的对称加密算法。总结对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法有:DES算法、3DES算法、AES算法。DES算法和3DES算法由于安全性低,加解密效率低,不推荐使用。AES算法是目前使用最广泛的对称加密算法。这点我早就看出来了,你我一定是有缘,留下你的喜欢和关注,你日后必成大器。