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

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.

kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:dzień
  • Lokalizacja:Łódź
  • Postów:1402
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


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
0

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

Kopiuj
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:

Kopiuj
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:

Kopiuj
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.

edytowany 1x, ostatnio: flowCRANE
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:dzień
  • Lokalizacja:Łódź
  • Postów:1402
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....


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
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

edytowany 1x, ostatnio: flowCRANE
CL
  • Rejestracja:ponad 15 lat
  • Ostatnio:6 miesięcy
0

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

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 11 godzin
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?

edytowany 1x, ostatnio: Azarien
KA
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Gorlice
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).


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
JA
  • Rejestracja:ponad 17 lat
  • Ostatnio:około miesiąc
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.
KA
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Gorlice
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):

Kopiuj
function Encoded(const S: string): string;
type
  PIdBytes = ^TIdBytes;
var
  B: TBytes;
begin
  B := BytesOf(AnsiString(S));
  Result := TIdEncoderMIME.EncodeBytes(PIdBytes(@B)^);
end;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
JA
Ale tu właśnie chodzi o nietypowe znaki, mimo że z zakresu $FF.<br /> S := Char(248); B := BytesOf(AnsiString(S)); I tu już jest B[0] = 111 :) Czyli problem może nie leżeć po stronie algorytmów Base64.
KA
@janeks Nie algorytmu base64 a dobrze kodowania znaków (tam gdzie rzutuję na AnsiString) zobacz tutaj identyczny kod (zresztą na 99% mój pochodzi stamtąd) ale z ustawionym kodowaniem https://forums.embarcadero.com/message.jspa?messageID=661508 W przykładzie ktoś sobie definiuje typ ISO_8859_1_String = type AnsiString( ISO_8859_1_Code_Page ); i później rzutuje na ISO_8859_1_String i to załatwia sprawę. Jak sam napisałeś jakoś funkcje, które przyjmują UnicodeString dobrze działają...
JA
  • Rejestracja:ponad 17 lat
  • Ostatnio:około miesiąc
0
Kopiuj
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

edytowany 4x, ostatnio: janeks
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)