パスワード暗号化ルーチンを書いています。私の問題を説明するために、以下のアプリを作成しました。約 20% の確率で、このコードは期待どおりに機能します。それ以外の場合、復号化は暗号化例外をスローします - 「データが無効です」。
復号化部分は毎回同じように機能するため、問題は暗号化部分にあると思います。つまり、暗号化ルーチンが、復号化ルーチンが復号化できる値を生成する場合、常にそれを復号化できます。しかし、暗号化ルーチンが復号化ルーチンをチョークする値を生成する場合、常にチョークします。したがって、復号化ルーチンは一貫しています。暗号化ルーチンはそうではありません。
Unicode エンコーディングの使用が間違っていると思われますが、他のものを試しても同じ結果が得られました。
私は何を間違っていますか?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace DataProtectionTest
{
public partial class Form1 : Form
{
private static readonly byte[] entropy = { 1, 2, 3, 4, 1, 2, 3, 4 };
private string password;
public Form1()
{
InitializeComponent();
}
private void btnEncryptIt_Click(object sender, EventArgs e)
{
Byte[] pw = Encoding.Unicode.GetBytes(textBox1.Text);
Byte[] encryptedPw = ProtectedData.Protect(pw, entropy, DataProtectionScope.LocalMachine);
password = Encoding.Unicode.GetString(encryptedPw);
}
private void btnDecryptIt_Click(object sender, EventArgs e)
{
Byte[] pwBytes = Encoding.Unicode.GetBytes(password);
try
{
Byte[] decryptedPw = ProtectedData.Unprotect(pwBytes, entropy, DataProtectionScope.LocalMachine);
string pw = Encoding.Unicode.GetString(decryptedPw);
textBox2.Text = pw;
}
catch (CryptographicException ce)
{
textBox2.Text = ce.Message;
}
}
}
}