[C#.NET] 物件 oject/class 的加解密
前面幾篇我們已經實作過了 字串/檔案 的加解密
[C#.NET] 字串及檔案,利用 RSA 演算法加解密
[C#.NET] 字串及檔案 利用 DES / AES 演算法加解密
把握住加密演算法的類別,都是處理byte[]的,只要你有辦法取得物件的byte[],便能調用.NET加密類別,我還是利用上篇的範例,來做一個簡單的演練[C#.NET] 字串及檔案,利用 RSA 演算法加解密。
我為增加 RasCryptorService 類別增加 EncryptObject 方法,利用序列化將物件轉為byte[],再將bytes[]加密。
加密:
{
using (MemoryStream memory = new MemoryStream())
{
//物件轉為Byte[]
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(memory, OriginalObject);
memory.Seek(0, SeekOrigin.Begin);
var encrypt = encryptor(memory.ToArray());//加密
return encrypt;
}
}
再利用反序列的方法,把byte[]反序列化成正確的型態。
解密:
{
using (MemoryStream memory = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
var decrypt = decryptor(EncryptData);
memory.Write(decrypt, 0, decrypt.Length);
memory.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(memory);
}
}
單元測試的類別準備:
public class Person
{
public int Age { get; set; }
public string Address { get; set; }
public Name Name { get; set; }
}
[Serializable]
public class Name
{
public string FristName { get; set; }
public string LastName { get; set; }
public Name(string frisName, string lastName)
{
this.FristName = frisName;
this.LastName = lastName;
}
}
加密的單元測試,為了測試方便,我將byte[]轉成檔案,當然也可以轉成字串,主要是要攜帶方便,要拿給別人也比較方便。
public void EncryptObjectTest()
{
RasCryptorService target = new RasCryptorService();
Person person = new Person { Address = "點部落", Age = 19, Name = new Name("余", "小章") };
object OriginalObject = person;
var expected = true;
var actual = target.EncryptObject(OriginalObject);
var base64 = Convert.ToBase64String(actual);
File.WriteAllBytes("EncryObject.bin", actual);
Assert.AreEqual(expected, File.Exists("EncryObject.bin"));
}
拿著加密後的檔案,來驗証解密後的結果是否如預期。
[DeploymentItem("EncryObject.bin")]
public void DecryptObjectTest()
{
RasCryptorService target = new RasCryptorService();
var EncryptData = File.ReadAllBytes("EncryObject.bin");
Person person = new Person { Address = "點部落", Age = 19, Name = new Name("余", "小章") };
var expected = person;
var actual = target.DecryptObject<Person>(EncryptData);
Assert.AreEqual(expected.Address, actual.Address);
Assert.AreEqual(expected.Age, actual.Age);
}
新增的兩個方法都如期的通過測試。
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET