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



encode to (3)

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

클라이언트 (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);
    }

}


Answers

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


android에서 Base64.NO_WRAP 대신 Base64.DEFAULT

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

sun.misc.BASE64Decoder 또는 비 핵심 라이브러리의 대안으로 javax.mail.internet.MimeUtility.decode() .

public static byte[] encode(byte[] b) throws Exception {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    OutputStream b64os = MimeUtility.encode(baos, "base64");
    b64os.write(b);
    b64os.close();
    return baos.toByteArray();
}
public static byte[] decode(byte[] b) throws Exception {
    ByteArrayInputStream bais = new ByteArrayInputStream(b);
    InputStream b64is = MimeUtility.decode(bais, "base64");
    byte[] tmp = new byte[b.length];
    int n = b64is.read(tmp);
    byte[] res = new byte[n];
    System.arraycopy(tmp, 0, res, 0, n);
    return res;
}

전체 코드 링크 : Base64로 인코딩 / 디코딩





java android base64