2009-08-30 4 views
12

디스크에 저장된 텍스트 파일을 암호화하고 싶습니다. 사용하려고 시도했습니다 DES 암호화 클라이언트 컴퓨터에서 치명적인 오류가 발생했는데 나중에 알고리즘이 악센트 부호가있는 문자 (!)를 처리하지 못한다는 것을 알았습니다 이전 패키지 (sun.misc.BASE64Decoder)를 사용하고 있었기 때문에 의심 스럽습니다. 그게 이유인지.Java 단순 암호화

그러나 나는 단순한 해결책을 찾고 있습니다 - 나는 128- 비트 키 정도의 RSA이 아니라 정말 간단한 암호화가 필요합니다. (어떤 사람들은 그것에 동의하지 않을 것입니다) 호기심 많은 눈에서 텍스트를 가리는 것입니다.

은 내가 웹에서 간단한 사소한 해결책을 찾을 수 없다는 것을 정말 이상한 것입니다.

간단한 암호화 체계는 어떻게 구현할 수 있습니까?

답변

4

방법에 대한 ROT13를? 그것은 아마도 가장 간단하고 사상 최악의 암호화 (그것은 또한 Caeser의 암호를 불렀다)

여기 제이 Kominek으로 자바에서 기본 구현의 :

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(); 
    } 
} 
+0

악센트 부호가있는 문자도 처리 할 수 ​​없습니다. – SLaks

+0

ROT13이 악센트 부호가있는 문자에 실제로 정의되어 있다고는 생각하지 않습니다. 또한 누군가 내 오래된 코드에서 어떤 종류의 사용법을 얻는 것을 보게되어 기쁩니다. :) –

0

당신은 암호화 할 텍스트의 한 조각이있는 경우, 일회용 패드는 어떨까요? 일회용 패드는 매우 쉽게 만들 수 있습니다. 당신은 왜 안 Base64로 함께 인코딩, 바이트의 임의의 순서가 당신이 정말로 텍스트를 암호화하는보고하지 않는 경우 당신은

2

를 암호화하는 데이터와 동일한 길이를 필요? 말도 안되는 것처럼 보이며 해독하기가 쉽습니다. 또한 이미 Base64 코드를 사용하고 있습니다.

+0

그게 좋은 생각이야, 난 그냥 모든 바이트에 1을 추가하고 그것을 읽고 싶을 때 1을 뺀다 고 말할 것입니다. 하지만 Base64 인코딩의 소리는 훨씬 좋을뿐입니다. org.apache.commons.codec.binary.Base64 –

6

암호화 알고리즘은 원시 바이트가 아닌 문자에서 작동합니다.

악센트 부호가있는 문자를 처리 할 수없는 이유는 문자를 원시 바이트로 변환하기 위해 사용하고 있던 코드가 유니 코드를 처리하지 않았기 때문입니다.

당신은 AES를 사용한다; Java에서 사용하는 방법의 예는 here을 참조하십시오.

편집은 : 지금, 당신은 단지 호기심의 눈에서 그것을 숨기고 있지만 미래가 개최 무슨 말 없다, 그것은 항상 수 있습니다 더 나은가 알아 보려면 지금없는 강력한 암호화를 사용하는 것이 훨씬 늦게, 당신은해야하지만하지 않았습니다.

22

Java Simplified Encryption (Jasypt)을 확인하십시오.

는 Jasypt는 최소의 노력으로 그/그녀의 프로젝트에 기본 암호화를 기능을 추가 할 개발자를 수있는 자바 라이브러리이며, 암호화가 어떻게 작동하는지에 대한 깊은 지식을 가질 필요 없이.

  • 높은 보안, 표준 기반 암호화 기술, 모두 단방향 및 양방향 암호화. 암호화 암호, 텍스트, 숫자, 바이너리 ...
  • Hibernate와의 투명한 통합.
  • 스프링 기반 애플리케이션과의 통합에 적합하며 또한 은 ACEGI (스프링 보안)과 투명한 통합이 가능합니다.
  • 응용 프로그램 (즉 데이터 소스)의 구성을 암호화하는 통합 기능입니다.
  • JCE 공급자와 함께 사용하기위한 공개 API입니다.
  • ... 그리고 나는이 간단한 One-Time-Pad 알고리즘을 사용하고
+0

Jasypt는 보안 공급자가 내장 된 JDK에 의존합니다. 독립 실행 형 라이브러리가 아니라 JDK에 대한 래퍼입니다. – yegor256

7

훨씬 더 :

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을 추가하는 것을 잊지 마십시오을.