utf8 - java base64 to file




Java:Base64 문자열을 java.util.Base64로 디코딩 할 때 다른 결과가 발생합니다. android.util.Base64 (2)

나는 클라이언트 / 서버 시스템에서 일하고 있는데 기본적인 암호화를 시도하고있다. 서버에 연결하면 공개 키가 소켓을 통해 이스케이프 된 문자열로 전송됩니다. 문자열이 양쪽 끝, 줄 바꿈 및 모두에서 동일하다는 것을 확인했습니다.

클라이언트 (Android)에서 공용 / 개인 키를 사용하여 테스트 용으로 비밀 키를 성공적으로 암호화하고 해독 할 수 있습니다. 그러나 문자열에서 바이트 []에 공개 키를 디코딩하려 할 때 서버가 게이트에서 즉시 실패합니다.

 java.lang.IllegalArgumentException: Illegal base64 character a

내가 올바르게 이해하면 'a'는 절대적으로 기본 문자가되므로 터무니없는 것처럼 보입니다. 클라이언트와 서버는 공유 라이브러리를 사용하여 모든 암호화를 처리하므로 코드는 거의 동일합니다. 유일한 차이점은 java.util.Base64는 Android에서 사용할 수 없기 때문에 base64 문자열 인코딩 / 디코딩입니다.

공유 클래스

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);
    }

...

}

클라이언트 (Android) 메소드

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);
    }

}

서버 (Linux) 메소드

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);
    }

}


android에서 Base64.NO_WRAP 대신 Base64.DEFAULT

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

Base64.getDecoder() 대신 Base64.getDecoder() 사용 Base64.getMimeDecoder() .





base64