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;
}
}
分享到:
相关推荐
在Delphi这个强大的面向对象的编程环境中,我们可以利用其丰富的字符串处理函数和自定义算法来实现移位密码的编码和解码功能。下面将详细介绍如何在Delphi中实现移位密码的原理以及编写相关代码。 首先,移位密码的...
由于Java的`char`类型是Unicode编码,我们需要确保结果落在Unicode的可打印字符范围内。我们可以使用`Character.isLetter(char)`检查字符是否为字母,并且使用`Character.toUpperCase(char)`或`Character....
在C和C++中,字符串是字符数组,处理字符串时需要了解字符编码,如ASCII或Unicode。代码中可能使用了`for`循环遍历字符串,并用条件语句判断字符是否为字母,以便只对字母进行移位操作。 5. **数学应用**: 凯撒...
移位加密解密算法是一种简单但历史悠久的加密技术,它基于字符或数据块的移位操作来实现信息的隐藏。在本课程设计中,我们将深入探讨这种算法的原理及其在Visual C++ 6.0环境下的实现。密码学是一门研究加密与解密...
### ASCII字符编码表详解 ...随着技术的进步,虽然出现了更多的字符编码标准(如Unicode),但ASCII码仍然在许多场合发挥着重要作用。理解ASCII码对于学习计算机基础知识、进行编程和数据分析都是非常有帮助的。
在实现移位加密的过程中,首先需要了解字符编码,如ASCII码或Unicode。每个字符都有一个对应的数值,加密时就是对这些数值进行移位操作。例如,如果选择右移3位,那么字符"A"(ASCII码65)就会变成"F"(ASCII码68)...
1. 字符编码:C#中,字符通常以Unicode编码存储,因此在进行位移操作前,需要将字符转换为整型表示,如ASCII或Unicode值。 2. 位运算:C#提供了位运算符,如(左移)和>>(右移),用于执行位移操作。例如,`value ...
对于非ASCII字符,如中文、日文、韩文等多语言字符,它们的编码通常是UTF-8或其他Unicode编码,每个字符可能由一个或多个百分号和16进制数字组成,例如,中文字符“中”在UTF-8编码下为`%E4%B8%AD`。 4. **URL编码...
涵盖了ASCII编码、Base64/32/16编码、shellcode编码、Quoted-printable编码、XXencode编码、UUencode编码、URL编码、Unicode编码、Escape/Unescape编码、HTML实体编码、敲击码、莫尔斯电码等多种编码方式,同时也...
2. Unicode编码:Unicode是一个包含全世界大多数字符的字符集,它为每个字符分配了一个唯一的数字,称为码点。Unicode的实现有UTF-8、UTF-16等多种形式。在CTF中,理解Unicode可以帮助解码含有非英文字符的信息。 3...
Unicode码是目前最常用的编码方式,使用十六位二进制数字表示一个字符。 3. 数制之间的转换 数制之间的转换是计算机中的一种基本操作。常用的转换方式有二进制到十进制、八进制到十六进制等。转换的方法有多种,...
8. Unicode 编码:Unicode 编码是一种用于表示 Unicode 字符的编码方式。 9. Escape/Unescape 编码:Escape/Unescape 编码是一种用于将特殊字符转换为可传输的字符的编码方式。 10. HTML 实体编码:HTML 实体编码...
8. Unicode编码:一种通用字符集,包含世界各地语言的字符。常见的Unicode编码格式有UTF-8、UTF-16等。 9. Escape/Unescape编码:在编程语言中,用于表示特殊字符的转义序列。 10. HTML实体编码:用于在HTML文档中...
- 对于中文字符的加密,可以利用Unicode编码范围进行计算,`C = (P + 移位量) % 字符总数`,解密操作相同。 - 在Python中,可以通过字典映射实现加密和解密过程,不加密标点符号和英文字符。 6. **代码实现**: ...
8. Unicode 编码:Unicode 是一种字符编码标准,使用 16 位二进制数来表示字符。 9. Escape/Unescape 编码:Escape/Unescape 是一种编码方式,使用“\”符号来表示特殊字符。 10. HTML 实体编码:HTML 实体编码是...
Java系统会根据操作系统的默认编码字符集来确定字符串的初始编码,同时Java系统的输入和输出也是基于操作系统的默认编码。 为了确保Java系统正确处理和显示汉字,需要统一Java系统的输入、输出以及操作系统的编码...
- SO (14): 移位输出,用于双字节编码系统中改变字符集。 - SI (15): 移位输入,恢复原来的字符集。 - ESC (27): 换码,用于发送控制序列以改变字符集或屏幕模式。 - BEL (7): 报警,通常会发出声音。 - DEL (127): ...
1. 字符编码:在Python中,我们通常使用ASCII或Unicode编码处理文本。ASCII编码只包含基本的拉丁字母、数字、标点符号等,而Unicode则包含了世界上大部分语言的字符。对于凯撒密码,我们通常处理英文文本,因此可以...
- SO(移位输出):ASCII值14,用于字符集的交替。 - SI(移位输入):ASCII值15,恢复原来的字符集。 - DEL(删除):ASCII值127,用于删除字符。 ASCII码在计算机科学中扮演着核心角色,因为它是大多数早期操作...