2013-08-21 82 views
9

Tôi có mã đơn giản này, mà tôi tìm thấy trên internet .. im học tập công cụ này của mã hóa/giải mã .. mã này dường như làm việc tốt, nhưng tôi không hiểu điều gì đó ... tại sao sau "c.doFinal()" (để mã hóa/giải mã với AES-256) anh chàng này mã hóa/giải mã giá trị được mã hóa, với BASE64? nó không đủ chỉ bằng cách sử dụng AES?Mã hóa với AES-256 Java

`private static final String ALGO = "AES"; 
private static final byte[] keyValue = 
new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' }; 


public static String encrypt(String Data) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance("AES"); 
    c.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encVal = c.doFinal(Data.getBytes()); 
    String encryptedValue = new BASE64Encoder().encode(encVal); 
    return encryptedValue; 
} 

public static String decrypt(String encryptedData) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGO); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 
    byte[] decValue = c.doFinal(decordedValue); 
    String decryptedValue = new String(decValue); 
    return decryptedValue; 
} 
private static Key generateKey() throws Exception { 
    Key key = new SecretKeySpec(keyValue, ALGO); 
    return key; 
} 

public static void main(String[] args) throws Exception { 

    String data = "SOME TEXT"; 
    String dataEnc = AES.encrypt(data); 
    String dataDec = AES.decrypt(dataEnc); 

    System.out.println("Plain Text : " + data); 
    System.out.println("Encrypted Text : " + dataEnc); 
    System.out.println("Decrypted Text : " + dataDec); 
}` 

Cảm ơn !!

+1

Điều này thực sự sử dụng AES 128 bit, không phải 256. Khóa là 16 byte; 16 byte * 8 bit trên mỗi byte = khóa 128 bit. – megaflop

Trả lời

9

Dữ liệu được mã hóa trả về bởi doFinal là nhị phân và do đó không thể in được (nó sẽ xuất hiện dưới dạng một chuỗi vô nghĩa.) Mã hóa Base64 chuyển đổi nhị phân thành tập hợp các ký tự ASCII, điều này giúp dễ đọc cũng có thể sử dụng dữ liệu được mã hóa trong các tình huống mà chỉ có thể sử dụng dữ liệu thô.

Mã hóa Base64 không thêm bất kỳ mã hóa hoặc bảo mật bổ sung nào, nó chỉ làm cho dữ liệu được mã hóa có thể sử dụng được trong các tình huống mà bạn không thể sử dụng nhị phân.

4

Giá trị được mã hóa AES-256 có thể chứa một số ký tự bất thường, khi được in hoặc gửi qua internet, có thể được sửa đổi hoặc hiểu lầm, cắt ngắn hoặc thay thế trong quá trình truyền hoặc hiển thị trực quan.

Base64 cung cấp cơ chế mã hóa/giải mã các giá trị, để chúng có thể "di chuyển" mà không bị sửa đổi nội dung. Người dùng đã viết mã này bạn tìm thấy, có thể sẽ cần phải lưu trữ hoặc vận chuyển giá trị này.

Bạn có thể tự mình thử nghiệm và kiểm tra chuỗi kết quả trước khi được mã hóa thành Base64.

+0

Có u là đúng. Tôi đã thử nó trước khi hỏi ở đây, và nó in một cái gì đó như "??". ????? - ". Tôi đang phát triển một chương trình và tôi cần phải gửi dữ liệu qua internet .. vì vậy tôi nghĩ rằng tôi nên làm mã hóa trong base64 trước khi gửi –

+0

trong thực tế .. tôi đã thử in nó bằng " System.out.println (chuỗi mới (encVal," ASCII "));" –

0

Do doFinal() trả về một mảng byte và byte thường khó hiểu. Rời sang một bên chương trình này có một AES-128 không AES-256.