我想加密存储在磁盘上的文本(配置)文件。尝试使用DES加密我在客户端机器上遇到了致命错误,后来我发现该算法无法处理重音字符(!)我怀疑这是因为我使用的是旧包(sun.misc.BASE64Decoder
) - 但我不确定那是原因。
但是,我正在寻找一个更简单的解决方案——我需要一个非常简单的加密(我知道有些人不会同意这一点)——而不是128 位密钥的RSA,只是从好奇的眼睛中掩盖了文本。
我在网上找不到一个简单的解决方案真的很奇怪。
如何实现简单的加密方案?
Jasypt 是一个 java 库,它允许开发人员以最小的努力将基本的加密功能添加到他/她的项目中,而无需深入了解密码学的工作原理。
- 高安全性、基于标准的加密技术,适用于单向和双向加密。加密密码、文本、数字、二进制文件...
- 与 Hibernate 的透明集成。
- 适合集成到基于 Spring 的应用程序中,也可以与 ACEGI (Spring Security) 透明地集成。
- 用于加密应用程序(即数据源)配置的集成功能。
- 开放 API 可与任何 JCE 提供程序一起使用。
- ...以及更多
我正在使用这个简单的 One-Time-Pad算法:
import org.apache.commons.codec.binary.Base64;
public class Cipher {
private static final String KEY = "some-secret-key-of-your-choice";
public String encrypt(final String text) {
return Base64.encodeBase64String(this.xor(text.getBytes()));
}
public String decrypt(final String hash) {
try {
return new String(this.xor(Base64.decodeBase64(hash.getBytes())), "UTF-8");
} catch (java.io.UnsupportedEncodingException ex) {
throw new IllegalStateException(ex);
}
}
private byte[] xor(final byte[] input) {
final byte[] output = new byte[input.length];
final byte[] secret = this.KEY.getBytes();
int spos = 0;
for (int pos = 0; pos < input.length; ++pos) {
output[pos] = (byte) (input[pos] ^ secret[spos]);
spos += 1;
if (spos >= secret.length) {
spos = 0;
}
}
return output;
}
不要忘记添加commons-codec
到类路径。
ROT13怎么样?这可能是有史以来最简单和最糟糕的加密(它也被称为凯撒密码)
这是 Jay Kominek 在 Java 中的一个基本实现:
import java.io.*;
public class rot13 {
public static void main (String args[]) {
int abyte = 0;
try { while((abyte = System.in.read())>=0) {
int cap = abyte & 32;
abyte &= ~cap;
abyte = ((abyte >= 'A') && (abyte <= 'Z') ? ((abyte - 'A' + 13) % 26 + 'A') : abyte) | cap;
System.out.print(String.valueOf((char)abyte));
} } catch (IOException e) { }
System.out.flush();
}
}
如果您不想真正加密文本,为什么不使用 Base64 编码呢?它看起来像胡说八道,而且很容易解码。另外,您已经在使用 Base64 代码...
如果您有一段文本要加密,那么一次性密码呢?一次性便笺簿很容易创建;您所需要的只是一个与您正在加密的数据长度相同的随机字节序列
请参阅如何在 Java 中使用 3des 加密/解密? BASE64Encoder
用于表示加密的字节数组,而不是实际输入。