Я пишу процедуру шифрования пароля. Я написал приложение ниже, чтобы проиллюстрировать мою проблему. Примерно в 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;
}
}
}
}