私はエンコーディングと暗号化の両方に慣れていないので、私が尋ねる質問は基本的すぎるかもしれません. 提供された値を暗号化し、暗号化された値と暗号化に使用される IV をドキュメントに保存する必要があります。暗号化は、別の場所に保存されているマスター キーを使用して行われます。私は AES 暗号化を使用しており、暗号化のコードは次のようになります。
private EncryptedData EncryptValue(string value, byte[] encryptedMasterKey)
{
byte[] encryptedValue = new byte[0];
AesCryptoServiceProvider aesCryptoServiceProvider = null;
//decrypt the master key
encryptedMasterKey = DecryptMasterKey(encryptedMasterKey);
// Create an AesCryptoServiceProvider object
// with the specified key and IV.
using (aesCryptoServiceProvider = new AesCryptoServiceProvider())
{
aesCryptoServiceProvider.Key = encryptedMasterKey;
// Create an encryptor to perform the stream transform.
ICryptoTransform encryptor = aesCryptoServiceProvider.CreateEncryptor(
aesCryptoServiceProvider.Key, aesCryptoServiceProvider.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(value);
}
encryptedValue = msEncrypt.ToArray();
}
}
}
EncryptedData encryptedData = new EncryptedData(encryptedValue, aesCryptoServiceProvider.IV);
return encryptedData;
}
データを XML に書き込むコードは次のようになります。
public void WriteData(string id, EncryptedData encryptedData)
{
XDocument document = GetValidDocument();
XElement[] encryptedDataElements = null;
XElement encryptedDataElement;
encryptedDataElements = (from element in document.Descendants(EncryptedDataElementName)
where element.Element(IdElementName).Value.ToUpper() == id.ToUpper()
select element).ToArray();
if (encryptedDataElements.Count() != 0)
{
encryptedDataElement = encryptedDataElements.First();
encryptedDataElement.Remove();
}
encryptedDataElement = new XElement(EncryptedDataElementName);
XElement idElement = new XElement(IdElementName, id);
encryptedDataElement.Add(idElement);
XElement encryptedValueElement = new XElement(EncryptedValueElementName);
encryptedValueElement.SetValue(Encoding.UTF8.GetString(encryptedData.EncryptedValue));
XElement saltElement = new XElement(SaltElementName, Encoding.UTF8.GetString(encryptedData.Salt));
encryptedDataElement.Add(encryptedValueElement);
encryptedDataElement.Add(saltElement);
document.Element(StoreElementName).Add(encryptedDataElement);
IXmlService xmlService = GlueRegistry.Instance.GetService<IXmlService>();
xmlService.SaveXmlDocument(document, filePath);
}
UTF8 でエンコードされた文字列として保存し、UTF8 でエンコードされたバイト配列として値を取得する方がおそらく良いと考えました。データは 1 つずつ書き込まれるため、シリアル化はオプションではありません。問題は、Encoding.UTF8.GetString を使用した SetValue メソッドにあります。また、おそらく XElement.Parse を使用する必要があることも理解しています。私はそれを使用しましたが、値が無効であるという例外が発生しました。UTF8 が良い選択なのか、それとも私がやろうとしていることを行うための別のより良い方法があるのか どうか疑問に思っています。
助けてくれてありがとう!