簡體   English   中英

Java簡單加密

[英]Java simple encryption

我想加密存儲在磁盤上的文本(配置)文件。 嘗試使用DES加密我在客戶端機器上遇到致命錯誤,我后來發現該算法無法處理重音字符(!)我懷疑這是因為我使用舊包( sun.misc.BASE64Decoder ) - 但是我我不確定是什么原因。

但是,我正在尋找一個更簡單的解決方案 - 我需要一個非常簡單的加密(我知道有些人會不同意) - 不是128位密鑰的RSA左右,只是模糊好奇眼睛的文本。

我無法在網上找到一個簡單的簡單解決方案,這真的很奇怪。

如何實現簡單的加密方案?

查看Java Simplified Encryption(Jasypt)

Jasypt是一個java庫,它允許開發人員以最少的工作量為他/她的項目添加基本的加密功能,而無需深入了解密碼學的工作原理。

  • 高安全性,基於標准的加密技術,適用於單向和雙向加密。 加密密碼,文本,數字,二進制文件......
  • 與Hibernate透明集成。
  • 適合集成到基於Spring的應用程序中,並且可以與ACEGI(Spring Security)透明地集成。
  • 用於加密應用程序配置(即數據源)的集成功能。
  • Open 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添加到classpath。

加密算法適用於原始字節,而不是字符。

你無法處理重音字符的原因是因為用於將字符轉換為原始字節和從原始字節轉換字符的代碼不能處理Unicode。

你應該使用AES ; 有關如何在Java中使用它的示例,請參見此處

編輯 :現在,你可能只是從好奇的目光隱藏它,但沒有告訴未來將舉行什么,它始終是更好的使用強大的加密現在找不到了,去晚了,你應該有,但沒“T。

ROT13怎么樣? 它可能是有史以來最簡單和最差的加密(它也被稱為Caeser的密碼)

以下是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用於表示加密的字節數組,而不是實際的輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM