[C#.NET] 物件 oject/class 的加解密

[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);
}
新增的兩個方法都如期的通過測試。
SNAGHTML190d62da

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo