欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Delphi的(xor)转成java(xor),以及加密解密

程序员文章站 2022-07-15 15:30:40
...

1.xor —> 异或算法的加密原理:
一个整数 a 和任意一个整数 b 异或两次,得到的结果是整数 a 本身,即: a == a ^ b ^ b。

这里的 a 就是需要加密的原数据,b 则是**。a ^ b 就是加密过程,异或的结果就是加密后的密文。密文 (a ^ b) 再与** b 异或,就是解密过程,得到的结果就是原数据 a 本身。

a = 原数据
b = **
	
// 一次异或, 加密得到密文
c = a ^ b

// 二次异或, 解密得到原数据(d == a)
d = c ^ b

2.代码实例
2.1 xor加密工具类封装:XorUtils
如图所示:

Delphi的(xor)转成java(xor),以及加密解密
Delphi的(xor)转成java(xor),以及加密解密

代码如下:

package com.xinqiao.utils;

public class XorUtils {

	//异或算法(xor)
	//定义成byte字节的数组(8个字节16进制)   XOR 加密/解密用的原始密码
	private static byte[] cipKey = {(byte)0xAA,(byte)0x55,(byte)0x22,(byte)0x11,(byte)0xBB,(byte)0x66,(byte)0xEE,(byte)0x77};

	
	
	/**
	 * 异或算法加密/解密
	 * @param data  数据(密文/明文)
	 * @param key  **
	 * @return 返回解密/加密后的数据
	 */
	public static  byte[] encrypt(byte[] data, byte[] key) {
		if (data == null || data.length == 0 || key == null || key.length == 0) {
			return data;
		}
		byte[] result = new byte[data.length];
		// 使用**字节数组循环加密或解密
		for (int i = 0; i < data.length; i++) {
			// 输入的字符串第 i 位与**中第 i 位进行异或
			result[i] = (byte) (data[i] ^ key[i]);
		}
		return result;
	}


	// 加密数据, 返回密文
	public static  String byteHex(String content) {
		byte[] cipherBytes = encrypt(content.getBytes(), cipKey);
		String byteToHex = byteToHex(cipherBytes);
		return byteToHex.toUpperCase();
	}

	// 解密数据, 返回明文
	public static  String getPwd(String byteToHex) {
		byte[] hexToByte = hexToByte(byteToHex);
		byte[] plainBytes = encrypt(hexToByte, cipKey);
		return new String(plainBytes);
	}
	
	// byte[] 转换成16进制。
	public static  String byteToHex(byte[] bytes) {
		String strHex = "";
		StringBuilder sb = new StringBuilder("");
		for (int n = 0; n < bytes.length; n++) {
			strHex = Integer.toHexString(bytes[n] & 0xFF);
			sb.append((strHex.length() == 1) ? "0" + strHex : strHex); // 每个字节由两个字符表示,位数不够,高位补0
		}
		return sb.toString().trim();
	}

	/**
	 * hex转byte数组 16转byte[]
	 * @param hex
	 * @return
	 */
	public static  byte[] hexToByte(String hex) {
		int m = 0, n = 0;
		int byteLen = hex.length() / 2; // 每两个字符描述一个字节
		byte[] ret = new byte[byteLen];
		for (int i = 0; i < byteLen; i++) {
			m = i * 2 + 1;
			n = m + 1;
			int intVal = Integer.decode("0x" + hex.substring(i * 2, m) + hex.substring(m, n));
			ret[i] = Byte.valueOf((byte) intVal);
		}
		return ret;
	}
	
	
}

3.调用方式:
如图所示:
Delphi的(xor)转成java(xor),以及加密解密

代码如下:

package com.xinqiao.user.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.xinqiao.utils.XorUtils;

@CrossOrigin
@Controller
@RequestMapping(value="/user")
public class UserController {
	
	@RequestMapping(value="/toUserLogin")
	public ModelAndView toUserLogin( Model model,HttpServletRequest req){
		ModelAndView mode = new ModelAndView();
		mode.setViewName("/main/user_login");
		return mode;
	}
	
	@RequestMapping(value="/xorData")
	@ResponseBody
	public Map<String, String> xorData(
			@RequestParam(value = "userName", required = false) String userName){
		Map<String, String> data = new HashMap<String, String>();
		String aa = XorUtils.byteHex(userName); //xor加密,解密
		data.put("data", aa);
		return data;
	}

}

备注1:xor方式调用可以选择main或者controller层调用byteHex(参数)加密的方法,解密getPwd(参数)方法。

4.Delphi的代码如下;
如图所示:
Delphi的(xor)转成java(xor),以及加密解密
备注2:以上就是java代码的异或算法和Delphi代码的异或算法互相转换。得出结果是一致的。

5.测试效果图:(前端页面可自己编写)

Delphi的(xor)转成java(xor),以及加密解密
备注3:输入字符串aa,点击确定即可获取密码 为CB34。
当前的CB34就是XOR算法加密的。

总结:以上就是我解决思路。纯属个人见解,记录一下以防万一。如果您有更好的解决方式,欢迎留言指教。

相关标签: 后端