Kodowanie base64 - różne wyniki dla aplikacji 32bit, 64bit

0

Witam
Mam problem z wynikiem szyfrowania base64 poprzez funkcję z załącznika.
W delphi 2007 i aplikacji 32bit wynik jest OK.
W delphi XE 10.2 i aplikacji 32bit wynik jest OK.
W delphi XE 10.2 i aplikacji 64bit wynik jest ZŁY.

Kombinowałem z IdDecoderMIME ale wynik z jej szyfrowania jest niepoprawny i w delphi 2007 i XE.
Próbowałem : Soap.EncdDecd i TNetEncoding.Base64.Decode i jest błędna wartość.
Wygenerowany wynik puściłem przez StrToHex i generalnie parę początkowych znaków jest identycznych ale potem już zaczynają się rozbieżności.
Ma może ktoś jakieś pomysły bo już od paru dni kombinuje z tymi funkcjami i różnym kodowaniem.

0

Na pierwszy rzut oka, nie wygląda źle(choć można to zrobić bardziej elegancko), natomiast tu wszelkie operacje odbywają się na stringach i tu widzę możliwe problemy

0

Z pakietu synapse http://synapse.ararat.cz/doc/help/synacode.html
funkcje:

function DecodeBase64(const Value: AnsiString): AnsiString;
function EncodeBase64(const Value: AnsiString): AnsiString;

Sprawdzone działają.

0

No niestety też nic z tego
Tutaj mam początek (HEX) poprawnego zdekodowania na wersji 32bit:

30 52 04 10 F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Tutaj mam wynik z synacode i innych na 64bit:

30 52 04 10 C5 99 00 00 00 00 00 00 00 00 00 00 00 00 00 00

generalnie tam gdzie powinno być F8 to jest albo C5 99 albo EF BF BD albo 6F albo C3 B8 w zależności od kodowania czy ASCII, UTF8, 8bit albo RawByteString

gdzieś robię jakiś dziecinny błąd :-)
Dane po odkodowaniu z base64 odkodowuje potem 3DES.

0

przy kodowaniu enkodowaniu właśnie kodowanie stringu nie powinno miec znaczenia - dajesz jakis fragment pamieci, masz wynik i jesli wynik odkodujesz, winienes dostac taką sama pamiec....

0

Ok, na spokojnie jeszcze raz to sprawdziłem i jednak problem jest po stronie delphi XE, bo jednak czy 32 czy 64 to zamiast tego 0xF8 jest albo 0xC3 0xB8 (dla tej mojej funkcji base64) albo 0xC5 0x99 (dla synacode albo TNetEncoding.Base64.Decode)

Najlepiej to chciałbym to robić w delphi 2007 ale zmuszony jestem do XE bo muszę ładować funkcję z dllki 64bit - chyba że jest jakiś "patent" na załadowanie dllki 64bit do apki 32bit bo LoadLibrary się sypie przy czymś takim

0

Jeśli to wina Delphi to może ten link pomoże w rozwiązaniu

0

Mam problem z wynikiem szyfrowania base64 poprzez funkcję z załącznika.

Kombinowałem z IdDecoderMIME ale wynik z jej szyfrowania jest niepoprawny i w delphi 2007 i XE.

Próbowałem : Soap.EncdDecd i TNetEncoding.Base64.Decode i jest błędna wartość.

No niestety też nic z tego

Zaraz, zaraz. Sugerujesz że zupełnie różne implementacje algorytmu szyfrowania dają różne wyniki w 32 i w 64 bitach?

Nie uważasz że bardziej prawdopodobne jest że błąd masz gdzieś w swoim kodzie?

0

Na 100% base64 w Delphi działa dobrze i tak samo w 32 jak i 64 bit a problem leży gdzie indziej. Kiedyś ktoś pisał o różnych wynikach dekodowania base64, kombinowałem i sprawdzałem (zarówno dostępne w Delphi gotowe metody jak i te z neta) a okazało się ze koleś pobierał tekst z memo i miał znaki nowych linii co oczywiście fałszowało wynik. Tu też będzie coś w kodzie (np. brak konwersji na AnsiString jeżeli funkcja takiego typu wymaga).

0

Po analizie tego wątku i testach będę się trzymał od Base64 z daleka o ile tylko będę mógł.
Problemowy jest np. znak $F8, wystarczyło tylko ten jeden sprawdzać.
Wyniki, u mnie w DXE6 32 i 64 bity takie same:

  1. W Soap (EncodeBase64, DecodeBase64) złe wyniki.
  2. W Indy (TIdEncoderMIME.EncodeBytes, TIdDecoderMIME.DecodeBytes) złe wyniki.
  3. Z załączonego pliku Base64.pas (StrTobase64, Base64ToStr) dobre wyniki.
  4. Z Indy
    TIdEncoderMIME.EncodeString(S);
    TIdDecoderMIME.DecodeString(S);
    lub
    TIdEncoderMIME.EncodeString(S, IndyTextEncoding_UTF8);
    TIdDecoderMIME.DecodeString(S, IndyTextEncoding_UTF8);
    dobre wyniki.
0

Więc tak jak przypuszczałem należało wcześniej zapewnić odpowiednie kodowanie i byłoby OK.
Sprawdź co wyjdzie jeżeli zrobisz wzorując się na tym (jeżeli nie ma nietypowych znaków to zwykły AnsiString):

function Encoded(const S: string): string;
type
  PIdBytes = ^TIdBytes;
var
  B: TBytes;
begin
  B := BytesOf(AnsiString(S));
  Result := TIdEncoderMIME.EncodeBytes(PIdBytes(@B)^);
end;
0
procedure TForm1.Button1Click(Sender: TObject);
var
  B: TBytes;
  S: String;
begin
  S := Char(248);
  B := BytesOf(AnsiString(S));
  ShowMessage(IntToStr(Byte(S[1])) + ' <> ' + IntToStr(B[0]));
end;

Wynik u mnie (pomiędzy liczbami jest znak mniejszy większy): 248 <> 111

1 użytkowników online, w tym zalogowanych: 0, gości: 1