2015-10-04 14 views
13

Tôi đang làm việc trên một hệ thống máy khách/máy chủ và tôi đang cố gắng thực hiện một số mã hóa cơ bản. Khi tôi kết nối với máy chủ, tôi gửi một khóa công khai như một chuỗi thoát trên socket. Tôi đã xác minh rằng chuỗi là giống hệt nhau trên cả hai đầu, dòng mới và tất cả.Java: Các kết quả khác nhau khi giải mã chuỗi base64 với java.util.Base64 vs android.util.Base64

Trên máy khách (Android), tôi có thể sử dụng khóa công khai/riêng tư để mã hóa thành công và giải mã khóa bí mật (cho mục đích thử nghiệm). Tuy nhiên, các máy chủ không phải ra khỏi cửa khi cố gắng để giải mã khóa công khai từ một String để một byte [], với:

java.lang.IllegalArgumentException: Illegal base64 character a 

mà có vẻ lố bịch, như 'a' là hoàn toàn một nhân vật base64, nếu Tôi hiểu chính xác. Máy khách và máy chủ sử dụng một thư viện được chia sẻ để xử lý tất cả các mã hóa, vì vậy mã này gần như giống hệt nhau. Sự khác biệt chỉ có sự khác biệt là mã hóa/giải mã base64 Strings, vì java.util.Base64 không khả dụng trên Android.

lớp Shared

public abstract class EasyCrypt { 

... 

    public PublicKey loadPublicKey(String key64) throws GeneralSecurityException { 

     byte[] data = decode(key64); //Calls abstract methods, shown below 

     X509EncodedKeySpec spec = new X509EncodedKeySpec(data); 
     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     return fact.generatePublic(spec); 
    } 

... 

} 

Khách hàng (Android) phương pháp

import android.util.Base64; 

public class ClientCrypt extends EasyCrypt { 
    @Override 
    protected byte[] decode(String s) { 
     return Base64.decode(s.getBytes(), Base64.DEFAULT); //Works perfectly 
    } 

    @Override 
    protected String encode(byte[] bytes) { 
     return Base64.encodeToString(bytes, Base64.DEFAULT); 
    } 

}

Server (Linux) phương pháp

import java.util.Base64; 

public class ServerCrypt extends EasyCrypt{ 
    @Override 
    public byte[] decode(String str){ 
     return Base64.getDecoder().decode(str); //Throws IllegalArgumentException 
    } 

    @Override 
    public String encode(byte[] bytes){ 
     return Base64.getEncoder().encodeToString(bytes); 
    } 

}

+2

thử sử dụng 'Base64.NO_WRAP' thay vì' DEFAULT' trong android –

+0

Android là thiết bị hoạt động chính xác. –

+1

bạn đang mã hóa nó trên android phải không? nếu có thì hãy thử 'Base64.NO_WRAP' trong phương thức mã hóa của bạn trên android –

Trả lời

26

trên Android, Sử dụng Base64.NO_WRAP thay vì Base64.DEFAULT

@Override 
protected String encode(byte[] bytes) { 
    return Base64.encodeToString(bytes, Base64.NO_WRAP); 
} 
+1

Cảm ơn 'NO_WRAP'. –

+0

@Mohammad Adil tôi nhận được một chuỗi từ máy chủ được mã hóa bởi lớp java.util.Base64 và tôi đang giải mã chuỗi đó bằng android.util.base64 không cho kết quả mong muốn. pls giúp tôi –

+0

Cảm ơn 'Base64.NO_WRAP', nó hoạt động trong phần phụ trợ Java của tôi (sử dụng java.util.Base64). – shimatai

3

Thay vì sử dụng Base64.getDecoder()Base64.getMimeDecoder().

Các vấn đề liên quan