2

「文字列 - バイト配列」の変換について 100 万の質問があることは知っていますが、どれも私の問題に適合しません。

ソフトウェアをインストールするために、ユーザーからいくつかの情報 (サーバーアドレス、ユーザー ID、パスワードなど) を保存する必要があります。これらの情報の一部は保護する必要があります (DPAPI を使用して暗号化)。そのためには、stringSecureString)をに変換する必要がありますbyte[]

public static byte[] StringToByte(string s)
{
    return Convert.FromBase64String(s);
}

最初の問題が発生する場所。文字列の長さが 4 の倍数 ( s.lenght % 4 == 0) でない場合、「Base-64 文字配列の長さが無効です」というエラーが表示されます。「=」を末尾に追加できる (しなければならない) ことを読みましたstringが、これらの文字列の一部はパスワードである可能性があります (「=」が含まれる場合があります)。(暗号化された) データを XML ファイルに格納する必要があるのは、Unicode エンコーディングを使用できない理由です (理由はわかりませんが、XML ファイルが破損します... エンコーディングが原因だと思います)。

最後のステップとして、アプリの起動時に保存されたデータを取得する方法に戻る必要があります。

あなたの誰かがこの問題を解決するのを手伝ってくれますか? 「読み取り可能」である限り、XML の出力は気にしません。

よろしくアレックス

4

1 に答える 1

7

最初の問題が発生する場所。文字列の長さが 4 の倍数でない場合 (s.length % 4 == 0)、「Base-64 文字配列の長さが無効です」というエラーが発生します。

これは、そもそも base64 ではないことを示唆しています。ここでは間違った方向に進んでいるように思えます.base64はバイナリデータをテキストに変換するために使用されます. テキストをバイナリ形式に変換するには、通常は次のようにしますEncoding.GetBytes

return Encoding.UTF8.GetBytes(text);

暗号化の結果 (バイナリ データ) をテキストとしてエンコードする必要がある場合は、base64を使用します。(UTF-8 でエンコードされたテキストを暗号化した結果は、UTF-8 でエンコードされたテキストではないためです。)

次のようなものです:

public static string EncryptText(string input)
{
    byte[] unencryptedBytes = Encoding.UTF8.GetBytes(input);
    byte[] encryptedBytes = EncryptBytes(unencryptedBytes); // Not shown here
    return Convert.ToBase64String(encryptedBytes);
}

public static string DecryptText(string input)
{
    byte[] encryptedBytes = Convert.FromBase64String(input);
    byte[] unencryptedBytes = DecryptBytes(encryptedBytes); // Not shown here
    return Encoding.UTF8.GetString(unencryptedBytes);
}
于 2013-08-02T16:35:27.620 に答える