Comment décoder du Base64 en UTF-16
- Collez le Base64 dans Entrée · Base64. Jeu de caractères est préréglé sur UTF-16LE.
- Lisez le texte dans Sortie · texte. Le champ Ressemble à indique en général Binaire, car le détecteur considère les octets nuls comme un signe de données binaires ; la sortie texte reste correcte.
- Si le résultat est une suite de caractères qui ressemblent à du CJK, passez Jeu de caractères sur UTF-16BE.
- Si les données commencent par une marque d’ordre des octets, Détection automatique choisit le bon ordre et supprime la marque.
- Copier la sortie copie le texte ; Télécharger enregistre les octets bruts.
Pour le sens inverse, voir UTF-16 en Base64.
Reconnaître de l’UTF-16 dans du Base64
Le Base64 d’un texte UTF-16 a un rythme visible. Un texte ASCII en UTF-16 alterne octets de lettres et octets nuls, et les bits à zéro correspondent à A dans l’alphabet Base64 : un A apparaît donc tous les quelques caractères.
| Base64 | Ordre des octets | Décodé |
|---|---|---|
SABlAGwAbABvAA== | LE, sans BOM | Hello |
AEgAZQBsAGwAbw== | BE, sans BOM | Hello |
//5IAGkA | LE avec BOM FF FE | Hi |
/v8ASABp | BE avec BOM FE FF | Hi |
RwBlAHQALQBEAGEAdABlAA== | LE, sans BOM | Get-Date |
Un texte ASCII en big-endian commence toujours par A, puisque son premier octet est nul. Une chaîne qui commence par //4 ou /v8 débute par une marque d’ordre des octets.
Ordre des octets, BOM et détection automatique
Lu avec le mauvais ordre des octets, chaque paire d’octets est permutée et un texte anglais se change en idéogrammes CJK : AEgAZQBsAGwAbw== décodé en UTF-16LE donne 䠀攀氀氀漀. Rien n’est perdu ; changer Jeu de caractères suffit.
Détection automatique gère l’UTF-16 de façon fiable quand les données commencent par un BOM. Sans BOM, un texte ASCII simple en UTF-16 est aussi de l’UTF-8 valide (les octets nuls y sont autorisés) : la détection automatique peut donc le prendre pour de l’UTF-8 avec des caractères invisibles. Sur cette page, gardez UTF-16LE ou UTF-16BE sélectionné à la main, sauf si vous voyez //4 ou /v8 au début.
Un nombre impair d’octets indique un problème. SABpAAA= contient 5 octets ; décodé en UTF-16LE, il donne Hi suivi d’un �. Soit la valeur a été tronquée, soit ce n’est pas de l’UTF-16 du tout.
D’où vient le Base64 en UTF-16
La source la plus fréquente est PowerShell. Les commandes encodées comme powershell -enc SQBFAFgA... apparaissent dans les tâches planifiées, les scripts d’installation et les journaux de sécurité, et leur Base64 est toujours en UTF-16LE. Le décodeur PowerShell EncodedCommand extrait la valeur d’une ligne de commande complète et cherche d’autres blocs Base64 dans le script.
On en trouve aussi dans les programmes .NET qui appellent Convert.ToBase64String(Encoding.Unicode.GetBytes(...)), dans les données du registre et des journaux d’événements Windows, et dans les valeurs SQL Server NVARCHAR exportées en binaire.
Décoder du Base64 UTF-16 dans le code
import base64
raw = base64.b64decode("SABlAGwAbABvAA==")
raw.decode("utf-16-le") # 'Hello'
base64.b64decode("/v8ASABp").decode("utf-16") # 'Hi', byte order taken from the BOM
Python lève UnicodeDecodeError: truncated data sur un nombre impair d’octets.
// Node.js: little-endian only
Buffer.from("SABlAGwAbABvAA==", "base64").toString("utf16le"); // "Hello"
// Browsers and Node.js: either order
new TextDecoder("utf-16be").decode(Uint8Array.from(atob("AEgAZQBsAGwAbw=="), c => c.charCodeAt(0))); // "Hello"
En C#, Encoding.Unicode.GetString(Convert.FromBase64String(s)) lit de l’UTF-16LE et Encoding.BigEndianUnicode lit du big-endian. Voir aussi Python et Node.js.
FAQ
Comment savoir si du Base64 contient de l'UTF-16 ?
Cherchez de nombreux caractères A qui reviennent à intervalles réguliers, comme dans SABlAGwAbABvAA== : en UTF-16, chaque lettre ASCII est accolée à un octet nul. Un //4 ou /v8 en tête correspond à une marque d’ordre des octets (BOM) UTF-16.
Pourquoi est-ce que je vois des caractères chinois après le décodage ?
L’ordre des octets est inversé. Hello en big-endian lu en little-endian devient 䠀攀氀氀漀. Basculez Jeu de caractères entre UTF-16LE et UTF-16BE.
Pourquoi y a-t-il un � à la fin du texte ?
L’UTF-16 exige un nombre pair d’octets. Un nombre impair signifie que le Base64 a été tronqué ou qu’il ne s’agit pas d’UTF-16 ; l’octet restant devient le caractère de remplacement.
Comment décoder un -EncodedCommand PowerShell ?
La valeur qui suit -EncodedCommand (ou -enc) est du Base64 en UTF-16LE : cette page la décode donc. Le décodeur PowerShell accepte aussi la ligne de commande entière et retrouve les payloads imbriqués.