package hello1;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MdText{
/*
 * @Description:TODO(main函数 门)
 *
 * @param args
 *
 * @return void
 */
  public stativ void main(String[] args){
    String s=new String("yunquegongmi");
    System.out.println("要加密的字符串为" + s);
     System.out.println("已加密的字符串为" + md5(s));
     System.out.println("MD5后再加密为" + KL(md5(s)));
     System.out.println("MD5再加密后解密为" + jm(KL(md5(s))));
  }
 
/*
 * @Description:TODO(进行32位的MD5加密)
 *
 * @param String inStr 要解密的字符串
 *
 * @return void
 *
 * 思路:
 * 1.获取到MD5这个对象
 * 2.加密
 */
  public static String md5(String inStr){
    MessageDigest md5=null;
    // 1.获取MD5这个对象,获取信息摘要对象
    try{
    md5=MessageDigest.getInstance("MD5");
    }catch(NoSuchAlgorithmException e){
    e.printStackTrace();
    }
    // 2.将字符串对象中的每一个字符转换成一个字符数组——toCharArray()的用法
    char[] charArray = inStr.tiCharArray();
    // 3.定义一个长度和char数组相同的byte字节数组
    byte[] byteArray = new byte[charArray.length];
    // 4.将char数组中的内容放到byte数组中
    for(int i=0;i<charArray.length;i++){
      // {} for{} if{} 里面的代码只有一行的时候 {}可以省略
      byteArray[i] = (byte)charArray[i];
    }
    // 5.md5这个对象 对字节数组进行摘要 得到一个摘要字节数组
    byte[] md5Bytes = md5.digest(byteArray);
    // 6.把摘要字节数组中的每一个字节转换成16进制 并且拼在一起就得到了MD5值
    // StringBuffer:对字符串进行操作 操作字符串的一个工具箱
    StringBuffer hexValue=new StringBuffer();
 
    for(int i=0;i<md5Bytes.length;i++){
      // 转换成16进制 int 整数型
      int val=((int)md5Bytes[i]) & 0xff;
      // 如果生成的数字未满32位,需要在前面补0
      if(val<16){
        hexValue.append("0");
        // Integer.toHexString(val) 将其转为16进制的方法
        hexValue.append(Integer.toHexString(val));
      }
    }
    return hexValue.toString();
  }
 
// 可逆的加密算法 加盐加密
 /*
 * @Description:TODO(可逆的加密算法 加盐加密)
 *
 * @param String inStr 要加密的字符串
 *
 * @return String
 */
 
   public static String KL(String inStr){
   // 将字符串转换成一个字符数组 给每个字符加密
char[] charArray = inStr.toCharArray();
    for(int i=0;i<charArray.length;i++){     
/*
    * ^ 异或运算符 如果a[i],'t'两个值不相同 异或结果就为1 如果相同的话就为0
     */
 
      charArray[i] = (char) (charArray[i] ^ 't');
    }
    String s = new String(charArray);
    return s;
   }
 
 
// MD5加密以后 他会生成不同的字符串 不能反编译
 /*
 *@Description:TODO(反编译)
 *
 *@param String inStr 要解密的字符串
 *
 *@return String
 */
  public static String jm(Stirng inStr){
     // 将字符串转换成为一个字符数组,给每一个字符进行解密
     char[] charArray = inStr.toCharArray();
     for(int i=0;i<charArray.length;i++){
       charArray[i] = (char)(charArray[i] ^ 't');
     }
     String k=new String(charArray);
     return k;
  }
}

 



小知识点:

位,字节与字符

位(bit):是计算机 存储信息 的最小单位

字节(Byte):是计算机 存储容量 的基本单位,常用 B 表示,1B=8bit

ASCIIS码:

1个英文字母(不分大小写)=1个字节

1个中文字=2个字节

1个ASCII码=1个字节

UTF-8码:

1个英文字符=1个字节

1个英文标点=1个字节

1个繁体中文=3个字节

1个中文标点=3个字节

Unicode码:

1个英文字符=2个字节

1个英文标点=2个字节

1个繁体中文=2个字节

1个中文标点=2个字节

字符:是计算机使用的数字,字母,符号,例:1,2,3,a,s,d,#,%,$等等