2009-08-30 110 views
12

Tôi muốn mã hóa tệp văn bản (cấu hình) được lưu trữ trên đĩa. Cố gắng sử dụng mã hóa DES Tôi đã gặp lỗi nghiêm trọng trên máy khách, sau này tôi phát hiện ra thuật toán không thể xử lý các ký tự có dấu (!) Tôi nghi ngờ đó là vì tôi đã sử dụng gói cũ (sun.misc.BASE64Decoder) - nhưng tôi không chắc chắn đó là lý do.Mã hóa đơn giản Java

Tuy nhiên, tôi đang tìm một giải pháp đơn giản hơn - tôi cần một mã hóa thực sự đơn giản (tôi biết một số người sẽ không đồng ý về điều đó) - không phải RSA của khóa 128 bit hoặc hơn, chỉ che khuất văn bản khỏi mắt tò mò.

Thật kỳ lạ khi tôi không thể tìm thấy một giải pháp đơn giản trên web.

Làm cách nào để triển khai một chương trình mã hóa đơn giản?

Trả lời

4

Làm thế nào về ROT13? Đó có lẽ là đơn giản nhất và mã hóa tồi tệ nhất (nó cũng được gọi là Cipher của Caeser)

Dưới đây là một việc thực hiện cơ bản trong Java bởi Jay 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

Điều đó cũng không thể xử lý các ký tự có dấu. – SLaks

+0

Tôi không nghĩ rằng ROT13 thực sự được xác định cho các ký tự có dấu. Ngoài ra, vui lòng thấy ai đó đang sử dụng bất kỳ loại sử dụng nào từ mã cũ của tôi. :) –

0

Nếu bạn có một mảnh duy nhất của văn bản để mã hóa, những gì về một một lần-pad? Một lần-pad là rất dễ dàng để tạo ra; tất cả những gì bạn cần là một chuỗi byte ngẫu nhiên có cùng độ dài với dữ liệu bạn đang mã hóa

2

Nếu bạn không thực sự mã hóa văn bản, tại sao không mã hóa với Base64? Nó sẽ trông giống như vô nghĩa, và nó rất dễ giải mã. Ngoài ra, bạn đã sử dụng mã Base64 ...

+0

Thats một ý tưởng tốt, tôi sẽ nói để chỉ cần thêm 1 cho tất cả các byte và sau đó trừ 1 khi bạn muốn đọc nó. Nhưng mã hóa Base64 thậm chí còn tốt hơn, chỉ có thể sử dụng: org.apache.commons.codec.binary.Base64 –

6

Thuật toán mã hóa hoạt động trên các byte thô chứ không phải ký tự.

Lý do bạn không thể xử lý các ký tự có dấu là vì mã bạn đang sử dụng để chuyển đổi các ký tự thành và từ byte thô không xử lý Unicode.

Bạn nên sử dụng AES; ví dụ về cách sử dụng nó trong Java, xem here.

EDIT: Ngay bây giờ, bạn có thể chỉ được che giấu nó khỏi những cặp mắt tò mò, nhưng không có nói những gì tương lai sẽ tổ chức, và nó luôn luôn là nhiều tốt hơn để sử dụng mã hóa mạnh mẽ hiện nay và không tìm hiểu, để trễ, mà bạn nên có nhưng không.

22

Khám phá Java Simplified Encryption (Jasypt).

Jasypt là một thư viện java cho phép các nhà phát triển để thêm mã hóa cơ bản khả năng để/dự án của mình với nỗ lực tối thiểu, và không cần của việc có kiến ​​thức sâu về cách mật mã hoạt động.

  • cao an ninh, kỹ thuật mã hóa dựa trên tiêu chuẩn, cho cả một chiều và hai chiều mã hóa. Mã hóa mật khẩu, văn bản, số, mã nhị phân ...
  • Tích hợp trong suốt với Hibernate.
  • Thích hợp để tích hợp vào các ứng dụng dựa trên Spring và cũng có thể tích hợp trong suốt với ACEGI (Bảo mật mùa xuân).
  • Khả năng tích hợp để mã hóa cấu hình của ứng dụng (ví dụ: nguồn dữ liệu).
  • API mở để sử dụng với bất kỳ nhà cung cấp JCE nào.
  • ... và nhiều hơn nữa
+0

Jasypt phụ thuộc vào các nhà cung cấp bảo mật được xây dựng trong JDK. Nó không phải là một thư viện độc lập, mà chỉ là một trình bao bọc xung quanh JDK. – yegor256

7

Tôi đang sử dụng thuật toán này đơn giản 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; 
    } 

Đừng quên để thêm commons-codec vào classpath.