web-dev-qa-db-ja.com

PowerShellバージョン2で文字列をバイト配列に変換する

私がやろうとしているのは、SHA1 UTF-8暗号化を使用し、次にbase64エンコーディングとパスワード文字列値を使用することです。ただし、最初に暗号化を行い、次にエンコードを行う必要がありましたが、逆の方法で行いました。

コードは次のとおりです。

# 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) 

そのため、ハッシュを実行したときに、文字列からbyte []が必要であることがわかりましたが、その方法がわかりません。 .Netライブラリから簡単な方法があると考えていますが、例を見つけることができませんでした。

したがって、次のような文字列がある場合:

$string = "password"

:: ComputeHash($ string)で使用できるバイト配列に変換するにはどうすればよいですか?

結局、暗号化されたSHA-1とbase 64でエンコードされたUTF-8パスワードが必要になります。これは上記のコードと同じですが、最初に暗号化したJavaで同じものをコーディングしたときとは異なります。次に、その結​​果をBase 64エンコードに変換しました。

文字列を直接暗号化することはAPIではサポートされていませんが、これを可能にする回避策があるかもしれないと仮定しています。それが私がやろうとしていることです。

したがって、コードの問題は、最初に暗号化してからエンコードしてから正しい値を取得する必要があるということです。正しいですか、ここで何か不足していますか?

適切なJava動作するコード:

//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));

「=」のパスワード文字列でJavaコードを実行すると、

[91、-86、97、-28、-55、-71、63、63、6、-126、37、11、108、-8、51、27、126、-26、-113、-40]これは暗号化です。

次に、Javaでエンコードすると、これを取得します:W6ph5Mm5Pz8GgiULbPgzG37mj9g =

しかし、PowerShellで実行すると、UTF8用に最初にエンコードされているため、これが得られます:

91170 97228201185 63 63 6130 37 11108 248 51 27126230143216

次に、このコード行を実行して変換すると、エラーが発生します。

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

「1」引数で「FromBase64String」を呼び出す例外:「Base-64文字配列の長さが無効です。」 1行目:char:45

ただし、新しいコード行を実行して下から16進数にすると、次のようになります。

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

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

しかし、私はこの値で終わる必要があります:

W6ph5Mm5Pz8GgiULbPgzG37mj9g =

繰り返しますが、これを行うことさえできないかもしれませんが、私は見るための回避策を見つけようとしています。

21
James Drinkard

ほとんどの場合、最後の行の後にハッシュをbase64に変換する必要があります。

$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)
[System.Convert]::ToBase64String($result1)

テキスト->バイト->暗号化/ハッシュ-> Base64

これは、暗号化されたデータをテキスト形式で送信するためのvery共通パターンです。

26
Eric Nicholson

順調に進んでいるようです。文字列とバイト配列を変換するには、文字エンコーディングを選択する必要があります。上記でUTF-8を選択しましたが、他のオプション(ASCII、UTF-16など)があります。

文字列を直接暗号化することはサポートされていません。

2

問題は、最初のバイト配列では符号付きバイト(-86 = 10101010)であり、2番目では符号なしバイト(170 = 10101010)であるようです。

0