`

字符Unicode编码移位输出

    博客分类:
  • Java
阅读更多
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 把字符串转换成十六进制的Unicode编码后保存,输出的
 * 为每个字符的十六进制最后一位为前面一个字符的十六进、
 * 制编码的最后一位。
 * @author jzj
 */
public class Encrypt {
	public static void main(String[] args) {
		try {
			//生成加密文件 
			//createEncryptFile();
			//读取解密文件 
			System.out.println(decryptFromFile());

		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

	private static StringBuffer decryptFromFile() throws FileNotFoundException, IOException {
		String fileName;
		StringBuffer fileContentSb;
		//--读加密文件 
		fileName = "e:/tmp/encrypt.txt";
		fileContentSb = readFile(fileName);

		String fileConString = fileContentSb.toString();
		Pattern p = Pattern.compile(".{4}");
		Matcher m = p.matcher(fileConString);
		String[] encryptArr = new String[fileConString.length() / 4];
		int index = 0;
		while (m.find()) {
			encryptArr[index++] = m.group();
		}
		//解密 
		StringBuffer decryptSb = decrypt(encryptArr);
		return decryptSb;
	}

	private static StringBuffer createEncryptFile() throws FileNotFoundException, IOException {
		String fileName;
		StringBuffer fileContentSb;
		//--读源文件 
		fileName = "e:/tmp/source.txt";
		fileContentSb = readFile(fileName);

		//加密 
		String[] hexStrArr = encrypt(fileContentSb);

		//--生成加密文件 
		fileName = "e:/tmp/encrypt.txt";
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < hexStrArr.length; i++) {
			sb.append(hexStrArr[i]);
		}
		writeFile(fileName, sb);
		return fileContentSb;
	}

	private static void writeFile(String fileName, StringBuffer sb2) throws FileNotFoundException,
			IOException {
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fileName));
		osw.write(sb2.toString());
		osw.close();
	}

	private static StringBuffer decrypt(String[] hexStrArr) {
		StringBuffer sb2 = new StringBuffer();
		for (int i = 0; i < hexStrArr.length; i++) {
			char encryptChar = 0;
			String prefixChar;
			if (i != 0) {
				prefixChar = hexStrArr[i - 1];
			} else {
				prefixChar = hexStrArr[hexStrArr.length - 1];
			}
			encryptChar = prefixChar.charAt(prefixChar.length() - 1);

			sb2.append((char) (Integer
					.parseInt(hexStrArr[i].replaceAll(".$", encryptChar + ""), 16)));
		}
		return sb2;
	}

	private static String[] encrypt(StringBuffer sb) {
		//存储密文 
		String[] hexStrArr = new String[sb.length()];
		for (int i = 0; i < sb.length(); i++) {
			//加密字符 
			char encryptChar = 0;
			//下一个字符 
			String nextString;
			if (i != sb.length() - 1) {
				nextString = Integer.toString(sb.charAt(i + 1), 16);
			} else {
				nextString = Integer.toString(sb.charAt(0), 16);
			}
			encryptChar = nextString.charAt(nextString.length() - 1);

			//原有字符转成十六进制 
			String tmpstr = Integer.toHexString(((sb.charAt(i)) & 0x0000FFFF) | 0xFFFF0000)
					.substring(4);

			//把原来字符十六进制最后一位替换成下一个字符的最后一位 
			hexStrArr[i] = tmpstr.replaceAll(".$", String.valueOf(encryptChar));
		}
		return hexStrArr;
	}

	private static StringBuffer readFile(String fileName) throws FileNotFoundException, IOException {
		InputStreamReader isr;
		isr = new InputStreamReader(new FileInputStream(fileName));
		char[] tmpCharArr = new char[1024];
		int readCount = isr.read(tmpCharArr);
		StringBuffer sb = new StringBuffer();
		while (readCount != -1) {
			sb.append(tmpCharArr, 0, readCount);
			readCount = isr.read(tmpCharArr);
		}
		isr.close();
		return sb;
	}
}

 

分享到:
评论

相关推荐

    CTF中那些脑洞大开的编码和加密[汇编].pdf

    涵盖了ASCII编码、Base64/32/16编码、shellcode编码、Quoted-printable编码、XXencode编码、UUencode编码、URL编码、Unicode编码、Escape/Unescape编码、HTML实体编码、敲击码、莫尔斯电码等多种编码方式,同时也...

    CTF中那些脑洞大开的编码和加密

    8. Unicode 编码:Unicode 编码是一种用于表示 Unicode 字符的编码方式。 9. Escape/Unescape 编码:Escape/Unescape 编码是一种用于将特殊字符转换为可传输的字符的编码方式。 10. HTML 实体编码:HTML 实体编码...

    CTF中那些脑洞大开的编码和加密.doc

    8. Unicode 编码:Unicode 是一种字符编码标准,使用 16 位二进制数来表示字符。 9. Escape/Unescape 编码:Escape/Unescape 是一种编码方式,使用“\”符号来表示特殊字符。 10. HTML 实体编码:HTML 实体编码是...

    java语言程序设计期末复习综合练习题答案.doc

    Unicode 编码方案是 Java 语言采用的字符编码方案,它是国际标准化组织(ISO)制定的通用字符集,每个 Unicode 码占用 16 个比特位。Unicode 编码方案可以表示世界上所有的语言和符号。 5. 设 a = 8,那么表达式 a ...

    Java2入门经典.rar

    Java和Unicode码 本章:小结 参考资源 第二章:程序、数据、变量和计算 数据和变量 变量的命名 变量名和Unicode码 变量和类型 整型数据类型 整型字面值 整型变量的声明 浮点数据类型 浮点字面值 浮点型变量的声明 ...

    java2入门经典.part01

    Java和Unicode码 本章:小结 参考资源 第二章:程序、数据、变量和计算 数据和变量 变量的命名 变量名和Unicode码 变量和类型 整型数据类型 整型字面值 整型变量的声明 浮点数据类型 浮点字面值 浮点型变量的声明 ...

    c# 加密和解密相关代码

    本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法进行详细讲解。 ToChar 方法返回指定的Unicode...

    二进制,十进制,十六进制,bit转换工具【Ucode++ v1.8.3.1】

    个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...

    javascript文档

    charCodeAt 方法 返回指定字符的 Unicode 编码。 逗号运算符 (,) 使两个表达式连续执行。 /*..*/ (多行注释语句) 使多行注释部分被 JScript 语法分析器忽略。 注释语句 - 单行(//) 使 JScript 语法分析器忽略...

    JScript 语言参考

    charCodeAt 方法 返回指定字符的 Unicode 编码。 逗号运算符 (,) 使两个表达式连续执行。 /*..*/ (多行注释语句) 使多行注释部分被 JScript 语法分析器忽略。 注释语句 - 单行(//) 使 JScript 语法分析器忽略...

    微软JavaScript手册

    charCodeAt 方法 返回指定字符的 Unicode 编码。 逗号运算符 (,) 使两个表达式连续执行。 /*..*/ (多行注释语句) 使多行注释部分被 JScript 语法分析器忽略。 注释语句 - 单行(//) 使 JScript 语法分析器忽略...

    JAVA笔试选择题6.pdf

    8. Java语言使用的字符集是Unicode。 9. Java的int型变量占内存的字节是4个字节。 10. 实型常量可以是浮点数或指数形式,如12.4或2e4f。 11. 对象可以有属性和方法,属性可以是简单变量或对象。 12. Boolean类型的...

    宋劲彬的嵌入式C语言一站式编程

    6. 字符类型与字符编码 3. 简单函数 1. 数学函数 2. 自定义函数 3. 形参和实参 4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. ...

Global site tag (gtag.js) - Google Analytics