一.对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
二.对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES 等
三.优缺点:
对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担
DES 的实现方式:jdk 的实现 , BouncyCastle 的实现方式,两者的实现方式很相似,只是获取秘钥使用不同的累去获取
- /**
- * 生成秘钥
- * @return
- * @throws Exception
- */
- public static byte [] JDK_DES_GetSecretKey() throws Exception{
- KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
- keyGenerator.init(56); // 秘钥的长度
- SecretKey secretKey = keyGenerator.generateKey();
- return secretKey.getEncoded();
- }
- /**
- * 生成秘钥
- * @return
- * @throws Exception
- */
- public static byte [] BC_DES_GetSecretKey() throws Exception{
- Security.addProvider(new BouncyCastleProvider());
- KeyGenerator keyGenerator = KeyGenerator.getInstance("DES","BC");
- keyGenerator.init(56); // 秘钥的长度
- SecretKey secretKey = keyGenerator.generateKey();
- return secretKey.getEncoded();
- }
- /**
- * 使用 des 对数据进行加密
- * @param src 需要加密的数据
- * @param encryptKey 加密的秘钥
- * @return
- * @throws Exception
- */
- public static byte [] JDK_DES_Encrypt(String src,byte [] encryptKey) throws Exception{
- //Key 的转换
- DESKeySpec keySpec = new DESKeySpec(encryptKey);
- SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
- Key secretKey = factory.generateSecret(keySpec);
- //加密
- Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- byte [] result = cipher.doFinal(src.getBytes());
- return result;
- }
- /**
- * 使用 des 对数据进行解密
- * @param bytes 需要解密的数组
- * @param encryptKey 解密的秘钥
- * @return
- * @throws Exception
- */
- public static String JDK_DES_Decrypt(byte [] encryptBytes ,byte [] encryptKey) throws Exception{
- //Key 的转换
- DESKeySpec keySpec = new DESKeySpec(encryptKey);
- SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
- Key secretKey = factory.generateSecret(keySpec);
- //加密
- Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
- cipher.init(Cipher.DECRYPT_MODE, secretKey);
- String result = new String(cipher.doFinal(encryptBytes));
- return result;
- }
- /**
- * 使用 des 对数据进行加密
- * @param src 需要加密的数据
- * @param encryptKey 加密的秘钥
- * @return
- * @throws Exception
- */
- public static byte [] BC_DES_Encrypt(String src,byte [] encryptKey) throws Exception{
- return JDK_DES_Encrypt(src,encryptKey);
- }
- /**
- * 使用 des 对数据进行解密
- * @param bytes 需要解密的数组
- * @param encryptKey 解密的秘钥
- * @return
- * @throws Exception
- */
- public static String BC_DES_Decrypt(byte [] encryptBytes ,byte [] encryptKey) throws Exception{
- return JDK_DES_Decrypt(encryptBytes,encryptKey);
- }