İstemci/sunucu sistemi üzerinde çalışıyorum ve bazı temel şifrelemeyi yapmaya çalışıyorum. Sunucuya bağlandığımda, genel bir anahtarı soket boyunca kaçan bir dize olarak gönderirim. Dizenin her iki ucunda, satırbaşında ve tümünde özdeş olduğunu doğruladım.Java: base64 dizesini java.util.Base64 ile çözerken farklı sonuçlar android.util.Base64
İstemcide (Android), bir gizli anahtarı (sınama amacıyla) başarıyla şifrelemek ve şifresini çözmek için genel/özel anahtarlarını kullanabiliyorum. ile, bir byte [] bir dize gelen ortak anahtarının kodu çalışırken Ancak, sunucu sağ kapıdan başarısız: 'a' kesinlikle base64 karakter ise, olduğu gibi, mantıksız görünüyor
java.lang.IllegalArgumentException: Illegal base64 character a
Doğru şekilde anladım. İstemci ve sunucu, tüm şifrelemeyi işlemek için paylaşılan bir kütüphane kullanır, bu yüzden kod hemen hemen aynıdır. Java.util.Base64 Android'de bulunmadığından sadece arasındaki fark kodlama/kod çözme base64 Dizeleridir.
Paylaşılan sınıf
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);
}
...
}
İstemci (Android) yöntemleri
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);
}
}
Sunucu (Linux) yöntemleri
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 üzerinde
android 'DEFAULT' yerine 'Base64.NO_WRAP' kullanmayı deneyin –
Android doğru çalışan bir tanesidir. –
android üzerinde kodlama yapıyorsunuz? eğer evet ise o zaman androidde kodlama yönteminizdeki Base64.NO_WRAP'ı deneyin –