# Більше про мою подорож у чудовий світ ASP.NET 1.x ViewState

<datetime class="hidden">2004-02-29T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported, ASP.NET, Security -->
Я писав: [попередній допис](/posts/694.aspx) с которым я планировал засунуть с собой механизм. [ViewState](http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwebuicontrolclassviewstatetopic.asp), розширюючи дані, які я зробив з стисненням для шифрування і підписування тощо... Що ж, є хороші і погані новини для цього плану. Здається (згодом) речі MAC і шифрування насправді виконуються у класі LosWriter; внутрішній клас, який використовується [LosFormat](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuilosformatterclasstopic.asp) щоб насправді зробити об' єкт Серіалізація... він використовує наступний код щоб зробити це (дякує ще раз для нерозбірливого [Віддзеркалювач](http://www.aisto.com/roeder/dotnet/)) :

```
internal void CompleteTransforms(TextWriter output, bool enableMac, byte[] macKey)
{ int num1;
byte[] array1;
string text1;
char[] array2;
string text2;
num1 = 0;
if (this._recyclable)
{
 this._byteBuffer = ((byte[]) LosWriter._byteBufferAllocator.GetBuffer());
if (this._freePos > 0)
{
 num1 = Encoding.UTF8.GetBytes(this._charBuffer, 0, this._freePos, this._byteBuffer, 0);
 
}
if (enableMac)
{
 array1 = MachineKey.GetEncodedData(this._byteBuffer, macKey, 0, &(num1));
text1 = Convert.ToBase64String(array1, 0, num1);
output.Write(text1);
return; 
}
array2 = ((char[]) LosWriter._charBufferAllocatorBase64.GetBuffer());
num1 = Convert.ToBase64CharArray(this._byteBuffer, 0, num1, array2, 0);
output.Write(array2, 0, num1);
LosWriter._charBufferAllocatorBase64.ReuseBuffer(array2);
return; 
}
this._byteBuffer = Encoding.UTF8.GetBytes(this._charBuffer, 0, this._freePos);
num1 = this._byteBuffer.Length;
if (enableMac)
{
 this._byteBuffer = MachineKey.GetEncodedData(this._byteBuffer, macKey, 0, &(num1));
 
}
text2 = Convert.ToBase64String(this._byteBuffer);
output.Write(text2);
 
}
```

Як ви, мабуть, бачите, цей код керує програмою ключа MAC і шифруванням для послідовних даних. Це код, який використовується у " MachineKey " для виконання шифрування:

```
internal static byte[] EncryptOrDecryptData(bool fEncrypt, byte[] buf, byte[] modifier, int start, int length)
{ MemoryStream stream1;
ICryptoTransform transform1;
CryptoStream stream2;
byte[] array1;
byte[] array2;
MachineKey.EnsureConfig();
stream1 = new MemoryStream();
transform1 = MachineKey.GetCryptoTransform(fEncrypt);
stream2 = new CryptoStream(stream1, transform1, 1);
stream2.Write(buf, start, length);
if (fEncrypt && (modifier != null))
{
 stream2.Write(modifier, 0, modifier.Length);
 
}
stream2.FlushFinalBlock();
array1 = stream1.ToArray();
stream2.Close();
MachineKey.ReturnCryptoTransform(fEncrypt, transform1);
if (!fEncrypt && (modifier != null))
{
 array2 = new byte[((uint) (array1.Length - modifier.Length))];
Buffer.BlockCopy(array1, 0, array2, 0, array2.Length);
array1 = array2;
 
}
return array1; 
} 
```

На жаль, це означає, що мені або доведеться гратися з Віддзеркаленням, або викинути джерело від Refreector / повністю переосмислити, як це працює, щоб піти набагато далі з моїм ViewState trunkering, боже, було б добре, якби це було зроблено з фабрикою спочатку... мови, які вони не вважали б, що хтось був би достатнім, щоб гратися з нею...: -)

Я, врешті-решт, буду змушений відмитися і написати статтю в один із цих днів... оптимізація для мене - це правила, щоб це можна було читати людям, які не є одержимими людьми...