java实现对称加密

今天药忘吃喽~ 2022-06-12 01:47 350阅读 0赞

一、对称加密算法概述

对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。

优缺点:

优点:算法公开、计算量小、加密速度快、加密效率高。

缺点:

  1. 1)交易双方都使用同样钥匙,安全性得不到保证。
  2. 2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。

常用对称加密算法:
基于“对称密钥”的加密算法主要有DES、3DES(TripleDES)、AES、PBE、IDEA、RC2、RC4、RC5和Blowfish等。本文只介绍最常用的对称加密算法DES、3DES(TripleDES)和AES。

二、对称加密算法—DES

DES算法全称为DATA Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:KEY、DATA、MODE。其中KEY为8个字节共64位,是DES算法的工作密钥;DATA也为8个字节64位,是要被加密或被解密的数据;MODE为DES的工作方式,有两种:加密或解密。

算法原理:

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:
(1)初始置换

  1. 其功能是把输入的64位数据块按位重新组合,并把输出分为L0R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结为:L0=D58D50……D8R0=D57D49……D7
  2. 2)逆置换
  3. 经过16次迭代运算后,得到L16R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

DES:数据加密标准,是对称加密算法领域中的典型算法
特点:密钥偏短(56位)、生命周期短(避免被破解)

具体算法如下图:

Center

例子:

  1. package rmd_intl_app.Test;
  2. import java.security.Key;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.SecretKeyFactory;
  7. import javax.crypto.spec.DESKeySpec;
  8. import org.apache.commons.codec.binary.Hex;
  9. public class ImoocRSA {
  10. private static String src = "abc123";
  11. public static void main(String[] args) {
  12. jdkDES();
  13. }
  14. public static void jdkDES() {
  15. //生成密钥
  16. try {
  17. KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
  18. //指定keysize
  19. keyGenerator.init(56);
  20. SecretKey secretKey = keyGenerator.generateKey();
  21. byte[] bytesKey = secretKey.getEncoded();
  22. //key转换
  23. DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
  24. SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
  25. Key convertSecretKey = factory.generateSecret(desKeySpec);
  26. //加密
  27. Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  28. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  29. byte[] resultBytes = cipher.doFinal(src.getBytes());
  30. System.out.println("jdk des encrypt : " + Hex.encodeHexString(resultBytes));
  31. //解密
  32. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  33. resultBytes = cipher.doFinal(resultBytes);
  34. System.out.println("jdk des decrypt : " + new String(resultBytes));
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. //jdk des encrypt : 719e81b53b891b1309b138c3e8c8a068cc6d476aaf51c288
  39. //jdk des decrypt : imooc security des
  40. }
  41. }

三、对称加密算法—3DES

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple DATA Encryption ALGORITHM)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

算法原理
使用3条56位的密钥对 数据进行三次加密。3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准)。
其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))

3DES:将密钥长度增至112位或168位,通过增加迭代次数提高安全性

缺点:处理速度较慢、密钥计算时间较长、加密效率不高

例子:

  1. package rmd_intl_app.Test;
  2. import java.security.Key;
  3. import java.security.SecureRandom;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.KeyGenerator;
  6. import javax.crypto.SecretKey;
  7. import javax.crypto.SecretKeyFactory;
  8. import javax.crypto.spec.DESedeKeySpec;
  9. import org.apache.commons.codec.binary.Hex;
  10. public class ImoocRSA {
  11. private static String src = "abc123";
  12. public static void main(String[] args) {
  13. jdk3des();
  14. }
  15. private static void jdk3des() {
  16. // 生成密钥
  17. try {
  18. KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
  19. // 指定keysize
  20. //keyGenerator.init(168);
  21. //生成默认长度的KEY
  22. keyGenerator.init(new SecureRandom());
  23. SecretKey secretKey = keyGenerator.generateKey();
  24. byte[] bytesKey = secretKey.getEncoded();
  25. // key转换
  26. DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey);
  27. SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
  28. Key convertSecretKey = factory.generateSecret(desKeySpec);
  29. // 加密
  30. Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
  31. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  32. byte[] resultBytes = cipher.doFinal(src.getBytes());
  33. System.out.println("jdk 3des encrypt : " + Hex.encodeHexString(resultBytes));
  34. // 解密
  35. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  36. resultBytes = cipher.doFinal(resultBytes);
  37. System.out.println("jdk 3des decrypt : " + new String(resultBytes));
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }

四、对称加密算法—AES

AES是目前使用最多的对称加密算法
AES的优势之一是至今尚未被破解,AES通常用于移动通信系统加密以及基于SSH协议的软件。

AES:高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击

特点:密钥建立时间短、灵敏性好、内存需求低、安全性高

具体算法如下图:

Center 1

例子:

  1. package rmd_intl_app.Test;
  2. import java.security.Key;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.spec.SecretKeySpec;
  7. import org.apache.commons.codec.binary.Base64;
  8. public class ImoocRSA {
  9. private static String src = "abc123";
  10. public static void main(String[] args) {
  11. jdkAES();
  12. }
  13. public static void jdkAES() {
  14. try {
  15. // 生成key
  16. KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  17. keyGenerator.init(128);
  18. SecretKey secretKey = keyGenerator.generateKey();
  19. byte[] keybytes = secretKey.getEncoded();
  20. // key的转换
  21. Key key = new SecretKeySpec(keybytes, "AES");
  22. // 加密
  23. // AES/工作模式/填充方式
  24. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  25. cipher.init(Cipher.ENCRYPT_MODE, key);
  26. byte[] result = cipher.doFinal(src.getBytes());
  27. System.out.println("jdk aes encrypt : " + Base64.encodeBase64String(result));
  28. // 解密
  29. cipher.init(Cipher.DECRYPT_MODE, key);
  30. result = cipher.doFinal(result);
  31. System.out.println("jdk aes decrypt : " + new String(result));
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

五、对称加密算法—PBE

通过前面的例子,会发现AES、DES和3重DES在使用上比较一致。
PBE算法结合了消息摘要算法和对称加密算法的优点
PBE(PASSWORD Based Encryption)基于口令加密

具体算法如下图:

Center 2

例子:

  1. package rmd_intl_app.Test;
  2. import java.security.Key;
  3. import java.security.SecureRandom;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.SecretKeyFactory;
  6. import javax.crypto.spec.PBEKeySpec;
  7. import javax.crypto.spec.PBEParameterSpec;
  8. import org.apache.commons.codec.binary.Base64;
  9. public class ImoocRSA {
  10. private static String src = "abc123";
  11. public static void main(String[] args) {
  12. jdkPBE();
  13. }
  14. public static void jdkPBE() {
  15. try {
  16. //初始化盐
  17. SecureRandom random = new SecureRandom();
  18. byte[] salt = random.generateSeed(8);
  19. //加密
  20. //定义密码
  21. String password = "imooc";
  22. //把密码转换成密钥
  23. PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
  24. SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
  25. Key key = factory.generateSecret(pbeKeySpec);
  26. //加密过程
  27. PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 100);
  28. Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
  29. cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
  30. byte[] result = cipher.doFinal(src.getBytes());
  31. System.out.println("jdk pbe encrypt : " + Base64.encodeBase64String(result));
  32. //解密
  33. cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
  34. result = cipher.doFinal(result);
  35. System.out.println("jdk pbe decrypt : " + new String(result));
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }

注意:推荐使用AES算法

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读