java加密解密

1、Base64编码
是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。(来自百度百科)
运算原理:
3*8=4*6
大家都知道,计算机是8位的存数,所以计算机将字符转换成二进制后,base64则会按照6位进行抽取,这样就可以将24位字符分解成4组6位的字符,然后计算机会对每一组进行高位补0,补足8位,最后转成ascii码,再对照base64的RFC2045~RFC2049表进行转换。

加密用BASE64Encoder

解密用BASE64Decoder

加密前要先将String类型的内容转换为Byte[],再进行加密

解密后的类型为byte[]数组,再转化为String类型

代码如下:


 
 
public class Test {
 public static void main(String[] args) throws Exception {
  Test test=new Test();
  test.testEncrypt();
  test.testDecrypt();
  
 }
 /**
  * BASE64加密
  * @throws Exception
  */
 public void testEncrypt() throws Exception {
  String pwd="123456";
  System.out.println(pwd);
  byte[] i=pwd.getBytes();//加密前,将String类型转化为byte[]
  System.out.println(i);
  String input= (new BASE64Encoder()).encodeBuffer(i); //加密 
  //String input= BaseUtil.encryptBASE64(i);//加密 
  System.out.println(input);  
 }
 /**
  * BASE64解密
  * @throws Exception
  */
 public void testDecrypt() throws Exception {
  String pwd="MTIzNDU2";
  System.out.println(pwd);
  byte[] o=(new BASE64Decoder()).decodeBuffer(pwd);//解密后的类型为byte[]
  //byte[] o=BaseUtil.decryptBASE64(pwd);//解密后的类型为byte[]
  System.out.println(o);
  String output=new String(o);//byte[]类型转换为String
  System.out.println(output);
 }
}

输出:

123456
[B@10dea4e
MTIzNDU2

MTIzNDU2 [B@
1909752 123456

 2、DES加密解密算法。

对称加密算法。所谓对称加密算法即:加密和解密使用相同密钥的算法。

import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DESTest {
 public static void main(String[] args) {
  DESTest t=new DESTest();
  String data="123456";
  String encode_data=t.encode("123456");
  System.out.println(encode_data);
  String decode_data=t.decode(encode_data);
  System.out.println(decode_data);
  
 }
 public static final String ALGORITHM_DES="DES";//指定算法名称
 public static final String SIGN_KEY="20170313EHR";
 /**
  * DES加密
  * @param data 要加密的字符串
  * @return 加密后的字符创
  */
 public String encode(String data) {
  if(data==null)
   return null;
  try {
   String key=SIGN_KEY;
   DESKeySpec dks=new DESKeySpec(key.getBytes());
   SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES");
   Key secretKey=keyFactory.generateSecret(dks);//获取init需要的key
   Cipher cipher=Cipher.getInstance(ALGORITHM_DES);
   cipher.init(Cipher.ENCRYPT_MODE, secretKey);//加密模式
   byte[] bytes=cipher.doFinal(data.getBytes());
   return byte2str(bytes);
  }catch(Exception e) {
   e.printStackTrace();
   return data;
  }
 }
 /**
  * DES解密
  * @param data 要解密的字符串
  * @return 解密后的字符串
  */
 public String decode(String data) {
  if(data==null)
   return null;
  try {
   String key=SIGN_KEY;
   DESKeySpec dks=new DESKeySpec(key.getBytes());
   SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES");
   Key secretKey=keyFactory.generateSecret(dks);//获取init需要的key
   Cipher cipher=Cipher.getInstance(ALGORITHM_DES);
   cipher.init(Cipher.DECRYPT_MODE, secretKey);//解密模式
   byte[] bytes=cipher.doFinal(str2byte(data.getBytes()));
   return new String(bytes);
  }catch(Exception e) {
   e.printStackTrace();
   return data;
  }
 }
 /**
     * 字符串转字节数组
     * @param 字符串的字节数组
     * @return 字节数组
     */
   private static byte[] str2byte(byte[] b) {  
       if((b.length%2)!=0)     //判断是否为偶数
           throw new IllegalArgumentException();  
       byte[] b2 = new byte[b.length/2];  
       for (int n = 0; n < b.length; n+=2) {  
           String item = new String(b,n,2);  
           b2[n/2] = (byte)Integer.parseInt(item,16);  //将字符串转换成16进制的byte
       }  
       return b2;  
   }
   
   /** 
    * 字节数组转字符串 
    * @param 字节数组
    * @return 转换之后的字符串
    */  
   private static String byte2str(byte[] b) {  
       StringBuilder hs = new StringBuilder();  
       String stmp;  
       for (int n = 0; b!=null && n < b.length; n++) {  
           stmp = Integer.toHexString(b[n] & 0XFF);    //将int转换成base16的字符串,
                                                       //b[n] & 0XFF将会判断b[n]的值,如果为正,则不变化,如果为负,则转换成对应的byte 的1~255的值
           if (stmp.length() == 1)  
               hs.append('0');  
           hs.append(stmp);  
       }  
       return hs.toString().toUpperCase();  
   }
}

 输出结果:

1730D210F056D4D8
123456
原文地址:https://www.cnblogs.com/BonnieWss/p/9151684.html