Я пишу процедуру шифрования паролей. Я написал приложение ниже, чтобы проиллюстрировать мою проблему. Примерно в 20% случаев этот код работает так, как ожидалось. В остальное время дешифрование генерирует криптографическое исключение - «Данные недействительны».ProtectedData.Protect прерывистый сбой
Я считаю, что проблема заключается в части шифрования, поскольку часть дешифрования работает одинаково каждый раз. То есть, если подпрограмма шифрования дает значение, которое может расшифровать подпрограмма расшифровки, оно всегда может расшифровать его. Но если подпрограмма шифрования дает значение, которое зажимает процедуру дешифрования, оно всегда задыхается. Таким образом, процедура дешифрования является последовательной; подпрограмма шифрования - нет.
Я подозреваю, что использование кодировки 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;
}
}
}
}
Этот код по-прежнему содержит ошибку ... см. Мой ответ ниже. – 2011-12-30 19:10:27