Ponieważ dane, które kodujesz, są zaszyfrowanymi danymi - dane losowe, w których każdy bajt może mieć wartość od 0 do 255, a w stanie zaszyfrowanym nie ma znaczenia ani znaczenia tekstu, musisz traktować te informacje jako zawory it - true binary
danych. Zarówno Java, jak i .NET mają pełną obsługę prawdziwych danych binarnych poprzez ich prymitywy z podstawowej tablicy bajtowej.
Jak wiadomo, kodowanie base64 to proces przekształcania prawdziwych danych binarnych (z zakresu od 0 do 255) w nieco większą tablicę danych binarnych (gdzie każdy bajt ma taką samą wartość, jak drukowany ASCII charakter gdzieś pomiędzy 32 a 126). Nazwijmy to encoded binary
. encoded binary
można następnie bezpiecznie przekonwertować na tekst, ponieważ praktycznie każdy znany zestaw znaków zgadza się z drukowalnym zestawem znaków ASCII (od 32 do 126).
więc głównym problemem z obu fragmentów Java i VB.NET jest to, że starają się wykorzystywać prymitywów tekstowych - char i ciąg w Javie; Łańcuch w VB.NET do przechowywania danych true binary
. Kiedy to zrobisz, jest już za późno. Nie ma sposobu na niezawodną konwersję z powrotem na tablice bajtowe, ponieważ prymitywy tekstowe nie są po prostu zaprojektowane do bezpiecznego przechowywania i pobierania danych binarnych. Więcej informacji na temat dlaczego tak jest, proszę przeczytać The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
szczęście poprawka jest prosta. W przypadku języka Java nie należy używać znaków char i String do przechowywania danych binarnych. Umieść dane bezpośrednio w tablicy bajtów. Spróbuj wykonać następujące czynności:
byte [] bt = new byte[1];
bt[0] = (byte) 153;
String result = Base64.encodeToString(bt, Base64.DEFAULT);
uzyskać MQ ==
Rozwiązaniem jest koncepcyjnie takie same w VB.NET. Nie używaj String. Użyj tablicy bajtów.
Dim bytes() As Byte = New Byte() {153}
Dim result As String = Convert.ToBase64String(bytes)
Znowu - odpowiedź jest MQ ==
Wreszcie, po kodowaniu, to perfekcyjnie używać strun. Twoje znaki są w podzbiorze ASCII, a jakakolwiek konwersja między ciągiem a tablicą bajtową nie spowoduje uszkodzenia danych, ponieważ wszystkie zestawy znaków są zgodne w podzbiorze ASCII.
Pamiętaj, że będziesz mieć ten sam problem w odwrotnej kolejności - dekodowanie. Będziesz dekodować do tablicy bajtowej, po czym powrócisz do true binary
. Od tego momentu dane nie mogą być przechowywane jako ciąg znaków - dopóki nie skończycie z nim - np. odszyfrowuje go z powrotem do oryginalnego czystego tekstu.
Mam nadzieję, że to pomoże.
Używasz UTF8 dla języka C#, a Java używa unikodu. Spróbuj użyć Unicode w obu. – Wug
BTW - jak sądzisz, co reprezentuje postać 153? Nie można drukować w Unicode. Jest to znak towarowy (TM) w ISO-8859-1. –
Próbowałem używać Unicode na obu, nadal istnieją różnice. .NET zwraca teraz "IiE =", podczas gdy Java nadal zwraca "wpk =". Tak 153 może być znakiem towarowym. Ale mój kod jest po prostu próbą wykonania szyfrowania przez szyfrowanie kodów znaków, więc różnią się one od 0-255. Następnie, aby bezpiecznie przesłać przez Internet, muszę przekonwertować go na Base64. –