des简单介绍
des对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。
DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,很轻松即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现。
PS:des被证明是可以破解的,明文+密钥=密文,这个公式只要知道任何两个,就可以推导出第三个,在已经知道明文和对应密文的情况下,通过穷举和暴力破解是可以破解des的。
注意:des加密和解密过程中,密钥长度都必须是8的倍数
base64简单介绍
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
base64编码:把二进制数据转为字符;
base64解码:把字符转为二进制数据;
运行效果图
TestActivity.java
package top.gaojc; import top.gaojc.util.DataEncryptionUtil; public class MainActivity extends Activity { private String str = "迪迦,yyds,永远相信光!"; private String s; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.test).setOnClickListener(v -> { //加密操作 s = DataEncryptionUtil.desEncrypt(str); System.out.println("原数据:" + str); System.out.println("加密后:" + s); /* //解密操作 s = DataEncryptionUtil.desDecode(str); System.out.println("原数据:" + str); System.out.println("解密后:" + s); */ }); } }
DataEncryptionUtil.java
package top.gaojc.util; import android.util.Base64; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; //数据加密工具类 public class DataEncryptionUtil { private static final String ENCRYPT_KEY = "12345xyz";//8位密钥 private static final String DES = "DES"; /** * des加密 + base64编码 */ public static String desEncrypt(String data) { String resultData = null; try { // des算法要求有一个可信任的随机数源 SecureRandom random = new SecureRandom(); // 创建DESKeySpec对象 DESKeySpec desKeySpec = new DESKeySpec(ENCRYPT_KEY.getBytes()); // 创建密钥工厂 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); // 将DESKeySpec对象转换成SecretKey对象 SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // Cipher对象完成加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); // des数据加密 byte[] bytesData = cipher.doFinal(data.getBytes("UTF-8")); // 进行Beas64编码处理 resultData = Base64.encodeToString(bytesData, Base64.DEFAULT); } catch (Exception e) { e.printStackTrace(); } return resultData; } /** * base64解码 + des解密 */ public static String desDecode(String data) { String resultData = null; try { // base64解码 byte[] bytes = Base64.decode(data, Base64.DEFAULT); // des算法要求有一个可信任的随机数源 SecureRandom random = new SecureRandom(); // 创建一个DESKeySpec对象 DESKeySpec desKeySpec = new DESKeySpec(ENCRYPT_KEY.getBytes()); // 创建一个密钥工厂 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); // 将DESKeySpec对象转换成SecretKey对象 SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // Cipher对象完成解密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, secretKey, random); // 解密 byte[] bytesData = cipher.doFinal(bytes); resultData = new String(bytesData); } catch (Exception e) { e.printStackTrace(); } return resultData; } }