开门见山,先说主题,这篇文章讲的是java中的加密解密一些常用的算法。
首先介绍base64算法,base64算法的加解密算法都是公开的,所以只能糊弄一般的群众,对稍微懂一点互联网以及代码知识的人基本无用,不说了,上代码:
String text = "123456"; //需要加密的数据
//base64加密解密
//1.加密
Base64.Encoder encoder = Base64.getEncoder();
byte[] encode = encoder.encode(text.getBytes());
System.out.println(new String(encode)); //加密后的密文是:MTIzNDU2,成功加密
//2.解密
Base64.Decoder decoder = Base64.getDecoder();
byte[] decode = decoder.decode(encode);
System.out.println(new String(decode)); //解密后是:123456,成功解密
2.DES对称加密算法。
DES加密最重要的是有一个暗号,也就是密钥,这个密钥要求至少是8位的字符,只要密钥不泄露,那么加密就没问题。上代码:
String text = "123456";
String key = "哈哈哈哈哈哈哈哈哈哈";
//1.生成密钥
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory desKeyFactory = SecretKeyFactory.getInstance("des");
SecretKey secretKey = desKeyFactory.generateSecret(desKeySpec);
//2.密钥上面已经生成,现在进行加密
Cipher cipher = Cipher.getInstance("des");
cipher.init(Cipher.ENCRYPT_MODE,secretKey,new SecureRandom());//密钥在这里应用了
byte[] encryptData = cipher.doFinal(text.getBytes());
System.out.println(new String(encryptData));//打印的数据是:�b:���,成功加密
//3.为了便于观察加密数据,再使用base64转换密文
Base64.Encoder encoder = Base64.getEncoder();
byte[] encode = encoder.encode(encryptData);
System.out.println(new String(encode));//打印的数据是:gQ33YjqHy+I= (这样的数据就好看多了)
//4.des解密
cipher.init(Cipher.DECRYPT_MODE,secretKey,new SecureRandom());//解密的时候这里再次用到了加密时候的secretKey
byte[] decodeData = cipher.doFinal(encryptData);
System.out.println(new String(decodeData));//打印的解密数据是:123456,成功解密
3.MD5加密算法
md5加密算法是一种单向加密算法,只能加密,无法解密。这种不可逆加密算法可以用于验证数据的完整性或用于登陆密码这样的功能。
String text = "123456"; //需要解密的数据
//1.创建md5加密对象
MessageDigest md5 = MessageDigest.getInstance("md5");
//2.进行加密操作
byte[] digest = md5.digest(text.getBytes());
//3.转化为十六进制的字符串
StringBuilder stringBuilder = new StringBuilder();
for (byte data: digest) {
String s = Integer.toHexString(data & 0xff); //byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。
stringBuilder.append(s.length() == 1 ? "0" + s : s);// 如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串。
}
System.out.println(stringBuilder.toString()); //打印结果e10adc3949ba59abbe56e057f20f883e,成功加密
4.RSA非对称加密算法。
RSA非堆成加密是指用于加密的密钥是一对,一个叫做公钥,一个叫做私钥,这两个密钥是不一样的,但是它们任何一方加密,对方都会解密。一般服务器用私钥进行加密,客户端用公钥进行解密。当然客户端也可以用公钥加密,服务器用私钥解密。
//RSA加密
String text = "123456"; //需要解密的数据
//1.创建密钥对KeyPair
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa");
keyPairGenerator.initialize(1024);//密钥长度是1024
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//2.获取公钥和私钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
//3.用私钥加密数据
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.ENCRYPT_MODE,privateKey,new SecureRandom());
byte[] cipherData = cipher.doFinal(text.getBytes());
System.out.println(new String(cipherData));//打印密文: ���i�,�2���WC1��b�m�S���&�����5�����WFB�����HJ��HN��]�;Pq�A������}G�
//4.使用公钥解密
cipher.init(Cipher.DECRYPT_MODE,publicKey,new SecureRandom());
byte[] decodeData = cipher.doFinal(cipherData);
System.out.println(new String(decodeData)); //解密数据:123456,解密成功
//5.通过私钥和密文对传输的数据生成数字签名
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateKey);
signature.update(cipherData);
byte[] sign = signature.sign();
System.out.println(new String(sign));//打印签名:���k��T��%�ȣ86o�ک!�W�7���
//6.根据公钥和密文验证数据是否被修改过
signature.initVerify(publicKey);
signature.update(cipherData);
boolean verify = signature.verify(sign);
System.out.println(verify); //打印结果,验证结果:true
//注意,我们发现RSA加密后的数据也是可读性很差,所以,我们可以用base64转换数据之后再传输