13

我想加密存储在磁盘上的文本(配置)文件。尝试使用DES加密我在客户端机器上遇到了致命错误,后来我发现该算法无法处理重音字符(!)我怀疑这是因为我使用的是旧包(sun.misc.BASE64Decoder) - 但我不确定那是原因。

但是,我正在寻找一个更简单的解决方案——我需要一个非常简单的加密(我知道有些人不会同意这一点)——而不是128 位密钥的RSA,只是从好奇的眼睛中掩盖了文本。

我在网上找不到一个简单的解决方案真的很奇怪。

如何实现简单的加密方案?

4

7 回答 7

22

查看Java 简化加密 (Jasypt)

Jasypt 是一个 java 库,它允许开发人员以最小的努力将基本的加密功能添加到他/她的项目中,而无需深入了解密码学的工作原理。

  • 高安全性、基于标准的加密技术,适用于单向和双向加密。加密密码、文本、数字、二进制文件...
  • 与 Hibernate 的透明集成。
  • 适合集成到基于 Spring 的应用程序中,也可以与 ACEGI (Spring Security) 透明地集成。
  • 用于加密应用程序(即数据源)配置的集成功能。
  • 开放 API 可与任何 JCE 提供程序一起使用。
  • ...以及更多
于 2009-08-30T20:28:02.960 回答
8

我正在使用这个简单的 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到类路径。

于 2012-02-12T19:54:21.907 回答
7

加密算法适用于原始字节,而不是字符。

您无法处理重音字符的原因是您用于将字符转换为原始字节和从原始字节转换为原始字节的代码无法处理 Unicode。

你应该使用AES;有关如何在 Java 中使用它的示例,请参见此处

编辑:现在,您可能只是将其隐藏在好奇的眼睛中,但没有人知道未来会怎样,现在使用强加密总是好得多,直到很晚才发现您应该拥有但没有不。

于 2009-08-30T20:27:01.527 回答
4

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();
  }
}
于 2009-08-30T20:20:12.663 回答
2

如果您不想真正加密文本,为什么不使用 Base64 编码呢?它看起来像胡说八道,而且很容易解码。另外,您已经在使用 Base64 代码...

于 2009-08-30T20:24:04.513 回答
0

如果您有一段文本要加密,那么一次性密码呢?一次性便笺簿很容易创建;您所需要的只是一个与您正在加密的数据长度相同的随机字节序列

于 2009-08-30T20:22:30.537 回答
0

请参阅如何在 Java 中使用 3des 加密/解密? BASE64Encoder用于表示加密的字节数组,而不是实际输入。

于 2009-08-30T20:24:26.807 回答