加密解密

Posted 项羽齐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密解密相关的知识,希望对你有一定的参考价值。

数据加密处理:

技术分享图片
package MD5;

import java.io.UnsupportedEncodingException;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
  
/** 
 * 数据加密解密处理 
 * @author Administrator 
 * 
 */  
public class QuickSDKDesUtil {  
      
    //正则表达式,用于匹配  
    private final static Pattern pattern = Pattern.compile("\\d+");  
  
    private final static String charset="utf-8";  
  
    //加密处理  
    public static String encode(String src,String key) {   
        try {  
            //得到一个指定的编码格式的字节数组,Linux和windows默认的编码格式不同,所以要指定特定的编码  
            byte[] data = src.getBytes(charset);  
            byte[] keys = key.getBytes();  
            StringBuilder sb = new StringBuilder();  
            for (int i = 0; i < data.length; i++) {  
                //结合key和相应的数据进行加密操作,ofxx的作用是补码,byte是8bits,而int是32bits  
                int n = (0xff & data[i]) + (0xff & keys[i % keys.length]);  
                sb.append("@" + n);  
            }  
            return sb.toString();  
        }catch (UnsupportedEncodingException e){  
            e.printStackTrace();  
        }  
        return src;  
    }  
  
    //解密处理  
    public static String decode(String src,String key) {  
        if(src == null || src.length() == 0){  
            return src;  
        }  
        //正则表达式字符串匹配  
        Matcher m = pattern.matcher(src);  
          
        List<Integer> list = new ArrayList<Integer>();  
        //find方法(部分匹配):尝试去发现输入串中是否匹配相应的子串  
        while (m.find()) {  
            try {  
                //返回匹配到的子字符串  
                String group = m.group();  
                list.add(Integer.valueOf(group));  
            } catch (Exception e) {  
                e.printStackTrace();  
                return src;  
            }  
        }  
          
        //如果有匹配的字符串  
        if (list.size() > 0) {  
            try {  
                byte[] data = new byte[list.size()];  
                byte[] keys = key.getBytes();  
                //相对于加密过程的解密过程  
                for (int i = 0; i < data.length; i++) {  
                    data[i] = (byte) (list.get(i) - (0xff & keys[i % keys.length]));  
                }  
                return new String(data, charset);  
            } catch (UnsupportedEncodingException e){  
                e.printStackTrace();  
            }  
            return src;  
        } else {  
            return src;  
        }  
    }  
}  
数据解密处理

 

技术分享图片
package MD5;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;

public class QuickSDKSignUtil {
    static final String encode="UTF-8";    
    //对传递的数据进行md5加密
    public static String sign(String signStr){
        //DigestUtils.md5Hex()方法Java调用Apache commons codec实现md5加密,计算MD5摘要并返回值为32个字符的十六进制字符串
        return shuffleSign(DigestUtils.md5Hex(signStr));
    } 
private static byte[][] shufflePos=new byte[][]{{1,13},{5,17},{7,23}};
    private static String shuffleSign(String src){
        if(src == null || src.length() == 0){
            return src;
        }
        try {
            //得到一个指定的编码格式的字节数组
            byte[] bytes=src.getBytes("utf-8");
            byte temp;
            //循环遍历shufflePos,将二维数组中每位一维数组中的每个元素进行换位
            for(int i=0; i<shufflePos.length; i++){
                temp=bytes[shufflePos[i][0]];
                bytes[shufflePos[i][0]]=bytes[shufflePos[i][1]];
                bytes[shufflePos[i][1]]=temp;
            }
            return new String(bytes);
        } catch (UnsupportedEncodingException e) {
            return src;
        }
    }
    
}
数据解密处理

 

技术分享图片
package MD5;


/** 
 * 加密解密 
 * @author Administrator 
 * 
 */  
public class Demo {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        //双方约定好的签名  
        final String key ="1";  
        //数据  
        final String data ="{a:21}";  
          
        //对数据和签名进行加密处理  
        String nt_data = QuickSDKDesUtil.encode(data, key);  
        System.out.println("加密为:"+nt_data);  
          
        //对加密后的数据进行md5处理  
        System.out.println("对数据进行md5加密后在进行加密"+QuickSDKSignUtil.sign("nt_data=" + nt_data));  
          
        //对进过md5处理后的数据进行签名后加密  
        String nt_data2 = QuickSDKDesUtil.encode(QuickSDKSignUtil.sign("nt_data=" + nt_data), key);  
        System.out.println(nt_data2);  
                  
        //对加密后的数据进行解密处理  
        String sign_en = QuickSDKDesUtil.decode(nt_data2, key);  
        System.out.println(sign_en);   
        
        System.out.println("-------------------------------");    
         
        
        //对加密后的数据进行md5处理  
        //对进过md5处理后的数据进行签名后加密 
        nt_data = "1";
        
       nt_data2 = QuickSDKDesUtil.encode(nt_data,"fds");  
        System.out.println(nt_data2);  
        
        //对加密后的数据进行解密处理  
        sign_en = QuickSDKDesUtil.decode(nt_data2, "fds");  
        System.out.println(sign_en);
        
        
          
    }  
  
}  
写一个demo

 

以上是关于加密解密的主要内容,如果未能解决你的问题,请参考以下文章

论如何设计一款端对端加密通讯软件

Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

解密体育背后AI黑科技:花样滑冰动作识别多模视频分类和精彩片段剪辑

使用ffmpeg视频切片并加密