2013-03-14 20 views
30

Mam normalny ciąg w Powershell, który pochodzi z pliku tekstowego zawierającego tekst Base64; jest przechowywany w $x. Próbuję rozszyfrować go jako takie:Jak odkodować ciąg Base64?

$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x)); 

który działa jeśli $x był ciąg Base64 stworzony w PowerShell (ale to nie jest). A to nie działa na łańcuchu Base64 bazy $x, który pochodzi z pliku, $z po prostu kończy się jako coś takiego jak 䐲券.

Czego mi brakuje? Na przykład $x może być YmxhaGJsYWg=, który jest Base64 dla blahblah.

W nuthshell, YmxhaGJsYWg= jest w pliku tekstowym, a następnie wprowadzone do łańcucha znaków w tym kodzie PowerShell i staram się ją rozszyfrować, ale skończyć z 䐲券 itp

+0

Base64 zakodowane ciągi zawsze będzie dłuższy niż oryginalnych danych.Wydaje się, że masz tu coś wstecz. –

+0

@RogerLipscombe Ups, zaktualizowano. – JBurace

Odpowiedz

35

nie jest kodowania biorąc tekst do base64 i dekodowanie biorąc base64 BACK do tekstu? Wydajesz się mieszać je tutaj. Po dekodowaniu przy użyciu this online decoder otrzymuję:

BASE64: blahblah 
UTF8: nVnV 

nie na odwrót. Nie mogę jednak odtworzyć go w całości na PS. Zobacz próbkę poniżej:

PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("blahblah")) 
nV�nV� 

PS > [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("nVnV")) 
blZuVg== 

EDIT Teraz, gdy już wymyślić odpowiedniego pytania, mogę spróbować odpowiedzieć na to pytanie. Uważam, że używasz niewłaściwego kodera dla swojego tekstu. Zakodowany ciąg base64 jest kodowany z ciągu znaków UTF8 (lub ASCII).

PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg=")) 
blahblah 

PS > [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg=")) 
汢桡汢桡 

PS > [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg=")) 
blahblah 
+0

Mam już zakodowany ciąg 'nVnV' i próbuję go rozszyfrować. Wydaje mi się, że "blahblah" jest odczytywalnym przeze mnie łańcuchem, którego potrzebuję, a "nVnV" jest zakodowanym łańcuchem, którego potrzebuję do odkodowania. – JBurace

+0

zobacz zaktualizowaną odpowiedź. Nie mogę tego odtworzyć, ale nie mogę zrozumieć, skąd wziął się "nVnV" (base64) z "blahblah". –

+0

Zaktualizowałem mój OP, przepraszam. Tak, mogę to zrobić w 100% z Powershell, ale to nie jest to, co robię. Base64 pochodzi z pliku tekstowego. – JBurace

3

kodowania base64 przekształca trzy 8-bitowe bajty (0-255) w czterech bajtów 6-bitowych (0-63 vel base64). Każdy z czterech bajtów indeksuje ciąg ASCII, który reprezentuje końcowe wyjście jako cztery 8-bitowe znaki ASCII. Indeksowany łańcuch to zazwyczaj "A-Za-z0-9 + /" z "=" używanym jako dopełnienie. Dlatego zakodowane dane są dłuższe o 4/3.

Dekodowanie Base64 jest procesem odwrotnym. I jak można oczekiwać, zdekodowane dane są równe 3/4.

Podczas kodowania base64 można kodować zwykły tekst, jego prawdziwą zaletą jest kodowanie niedrukowalnych znaków, które mogą być interpretowane przez transmitowanie systemów jako znaków kontrolnych.

Proponuję oryginalny plakat renderujący $ z jako bajty, z których każdy ma znaczenie dla aplikacji. Renderowanie znaków niedrukowalnych jako tekstu zwykle wywołuje Unicode, który generuje glify w oparciu o lokalizację twojego systemu.

Base64decode („odpowiedź do życia wszechświat i wszystko”) = 00101010

0

miałem problemy ze wskazaniem miejsca w między moim wyjściu i nie było odpowiedzi w Internecie w ogóle, aby rozwiązać ten problem. Dosłownie spędzam wiele godzin próbując znaleźć rozwiązanie i odszukałem go od zabawy z kodem do tego stopnia, że ​​prawie nie wiedziałem, co wpisałem w momencie, w którym udało mi się go uruchomić. Oto moja poprawka do wydania: [System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))

0

Strona ta pojawia się, gdy google jak przekonwertować base64, tak pod względem kompletności:

$b = [System.Text.Encoding]::UTF8.GetBytes("blahblah") 
[System.Convert]::ToBase64String($b) 
Powiązane problemy