Witam, ostatnio natknąłem się na przedziwny problem, otóż napisałem klasę która ma za zadanie szyfrować o odszyfrowywać informację, oraz umożliwiać serialkizację do XML zakodowanych informacji, oczywiście po wczytaniu pliku XML i deserializacji jest mozliwość odszyfrowania informacji po podaniu klucza użytego podczas szyfrowania, wszytsko niby działa ok ale jedna rzecz mnie strasznie irytuje, otóż atrybuty poddawane serializacji musza być publiczne (to rozumiem) a dokładniej gettery i settery, z getterem to oczywiście jestem w stanie to zrozumieć no bo podczas serializacji obiekt serializujący XMLSerializer musi pobrac odpowiednie informacje aby je "zapisać" natomiast to co mnie po czesci dziwi i zaskkakuje to to że setter także musi być publiczny przez co obiekt jest narazony na wprowadzanie "błędów" poniewaz po pomyslnym podaniu potrzebnych informacji jest mozliwość zmiany poszczególnych elementów, które nie powiunny być zmieniane ... nie wiem czy do końca dobrze wytłumaczyłem?!
POnizej kod:
[Serializable]
public sealed class Data
{
#region Class Attribute (private)
private string myData { get; set; }
private string myKey { get; set; }
#endregion
#region Class Attribute (read only, get only)
[XmlAttribute("DATA")]
public string DataName { get; set; }
[XmlElement("BYTE_DATA")]
public byte[] DataEncrypt { get; set; }
[XmlElement("DATE")]
public string DataDate { get; set; }
[XmlElement("USER_ID")]
public int UserID { get; set; }
#endregion
#region Class Constructor
public Data()
{
DataDate = DateTime.Now.ToUniversalTime().ToString();
myData = null;
myKey = null;
UserID = -1;
DataName = null;
DataEncrypt = null;
}
public Data(string dataToEncrypt, string keyEncrypt, int userID, string dataName)
{
DataDate = DateTime.Now.ToUniversalTime().ToString();
myData = dataToEncrypt;
myKey = keyEncrypt;
UserID = UserID;
DataName = dataName;
DataEncrypt = EncryptData();
}
#endregion
#region Class Public Interfaces
public void SetData(string dataToEncrypt, string keyEncrypt, int userID, string dataName)
{
myData = dataToEncrypt;
myKey = keyEncrypt;
UserID = UserID;
DataName = dataName;
DataEncrypt = EncryptData();
}
public string GetData(string KeyEncrypt)
{
string dataResult = null;
string result = null;
if (DataEncrypt == null)
{
result = EnumHelper.GetDescription(ErrorList.DataErrors.DATA_NULL);
}
else
{
if (KeyEncrypt == myKey)
{
dataResult = DecryptData(KeyEncrypt);
if (dataResult.GetHashCode() == myData.GetHashCode())
{
result = dataResult;
}
else
{
result = EnumHelper.GetDescription(ErrorList.DataErrors.HASH_INCORRECT);
}
}
else
{
result = EnumHelper.GetDescription(ErrorList.DataErrors.WRONG_KEY);
}
}
return result;
}
#endregion
#region Class Implementation
private byte[] EncryptData()
{
byte[] result;
if (myData == null && myKey == null && UserID < 0 && DataName == null)
{
result = null;
}
else
{
const int rsa = 1;
var cspParameters = new CspParameters(rsa);
cspParameters.Flags = CspProviderFlags.UseMachineKeyStore;
cspParameters.KeyContainerName = myKey;
var rsaCryptoServiceProvider = new RSACryptoServiceProvider(cspParameters);
result = rsaCryptoServiceProvider.Encrypt(new UnicodeEncoding().GetBytes(myData), true);
}
return result;
}
private string DecryptData(string _KeyEncrypt)
{
string result = null;
const int rsa = 1;
var cspParameters = new CspParameters(rsa);
cspParameters.Flags = CspProviderFlags.UseMachineKeyStore;
cspParameters.KeyContainerName = _KeyEncrypt;
var rsaCryptoServiceProvider = new RSACryptoServiceProvider(cspParameters);
var decrypted = rsaCryptoServiceProvider.Decrypt(DataEncrypt, true);
result = new UnicodeEncoding().GetString(decrypted);
return result;
}
#endregion
}
Teraz pytanie, czy jest mozliwość zablokowania w jakiś sposób mozliwości zmiany atrybutów klasy (publicznych) lub wymuszenie użycia metody ustawiającej?
Pozdro
Oskar