Convertir une chaîne en un tableau d'octets dans PowerShell version 2

Ce que j'essaie de faire est d'utiliser SHA1 UTF-8 de chiffrement, puis de l'encodage base64 et un mot de passe de la chaîne de valeur. Cependant, j'avais besoin de faire le cryptage d'abord, puis l'encodage, mais je l'ai fait dans l'autre sens.

Voici le code:

# Create Input Data 
$enc = [system.Text.Encoding]::UTF8
$string1 = "This is a string to hash" 
$data1 = $enc.GetBytes($string1) 

# Create a New SHA1 Crypto Provider 
$sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider 

$# Now hash and display results 
$result1 = $sha.ComputeHash($data1) 

Donc, quand je suis allé faire le hachage, j'ai réalisé que je devais avoir un byte[] à partir de la chaîne et je ne suis pas sûr de la façon de le faire. Je pense il y a un moyen simple de le .Bibliothèques Net, mais impossible de trouver un exemple.

Donc, si j'ai une chaîne de caractères, comme:

$string = "password"

Comment puis-je convertir dans un tableau d'octets que je peux utiliser sur :: ComputeHash($string)?

Donc ce que j'ai à la fin, c'est une chiffré SHA-1 et en base 64 encodé en UTF-8 le mot de passe, le code ci-dessus, mais c'est en revenant de différent que lorsque j'ai codé cette même chose en java, où j'ai chiffré d'abord, puis convertis qui en résultent à un codage en base 64.

Je suis en train de faire l'hypothèse que tout crypter une chaîne directement n'est pas pris en charge dans l'api, il peut y avoir un travail qui vous permettra de le faire. C'est ce que j'essaie de faire.

Donc je suis en supposant que mon problème avec le code, c'est que j'ai eu pour chiffrer un premier temps, puis l'encoder pour obtenir la valeur correcte. Corriger ou ai-je raté quelque chose ici?

Ici est le code java qui fonctionne:

//First method call uses a swing component to get the user entered password.
String password = getPassword(); 

//This line is where the work starts with the second and third methods below.
String hashed = byteToBase64(getHash(password));

//The second method call here gets the encryption.
public static byte[] getHash(String password) {
      MessageDigest digest = null;
      byte[] input = null;
      try {
             digest = MessageDigest.getInstance("SHA-1");
      } catch (NoSuchAlgorithmException e1) {
             e1.printStackTrace();
      }
      digest.reset();
      try {
             input = digest.digest(password.getBytes("UTF-8"));
      } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
      }
      return input;
}

//Then the third method call here gets the encoding, FROM THE ENCRYPTED STRING.
public static String byteToBase64(byte[] data){
    return new String(Base64.encodeBase64(data));

Lorsque j'exécute le code java avec la chaîne de mot de passe de "mot de passe" - je obtenir

[91, -86, 97, -28, -55, -71, 63, 63, 6, -126, 37, 11, 108, -8, 51, 27, 126, -26, -113, -40]
qui est le cryptage.

Puis-je lorsque le codage en java, j'obtiens ceci:
W6ph5Mm5Pz8GgiULbPgzG37mj9g=

mais quand je le lance il en PowerShell-je obtenir ce parce que c'est codé en premier pour UTF8:

91 170 97 228 201 185 63 63 6 130 37 11 108 248 51 27 126 230 143 216

Puis quand je lance cette ligne de code pour convertir, je reçois une erreur:

$base64 = [System.Convert]::FromBase64String($result)

Exception d'appeler "FromBase64String" avec "1" argument(s): "Invalide la longueur de Base-64 char array".
Au niveau de ligne:1 caractère:45

Cependant, si je lance la nouvelle ligne de code afin de le rendre hex à partir de ci-dessous-je obtenir:

$hexResult = [String]::Join("", ($result | % { "{0:X2}" -f $_}))
PS C:\Program Files (x86)\PowerGUI> Write-Host $hexResult

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

mais j'ai besoin de finir avec cette valeur:

W6ph5Mm5Pz8GgiULbPgzG37mj9g=

Là encore, il peut même ne pas être possible de le faire, mais je vais essayer de trouver un travail autour de voir.

  • $data1 est déjà un tableau d'octets - c'est ce que Encoding.GetBytes($string1) retourne.
  • J'espère que vous n'êtes pas réellement en utilisant UTF-9:en.wikipedia.org/wiki/UTF-9_and_UTF-18
  • Non, c'est de l'UTF-8, j'ai eu une faute de frappe.
  • Vous ne voulez pas FromBase64String, vous voulez ToBase64String. Octets != Base64. Le code dans mon exemple, produit exactement le résultat que vous souhaitez.
  • Vous avez raison, cela a fonctionné!