版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31301681/article/details/77753574
一.对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
二.对称加密算法中常用的算法有: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);
}