2012-09-09 32 views
4

首先,我仍然在学习面向对象的编程。好的,我有一个包含不同类型对称算法的组合框。对称加密算法功能

private void Form3_Load(object sender, EventArgs e) 
{ 
    openencrypt(); 
    comboBox1.Items.Add("AES"); 
    comboBox1.Items.Add("DES"); 
    comboBox1.Items.Add("Rijndael"); 
    comboBox1.Items.Add("RC2"); 
    comboBox1.Items.Add("Triple DES"); 
    comboBox1.SelectedIndex = 0; 
} 

然后我有我的加密函数检查它们是什么类型。

byte[] hpass; 
string nFilepath = Set.nfilepath; 
FileStream Open = new FileStream(oFilepath, FileMode.Open, FileAccess.Read); 
FileStream Save = new FileStream(nFilepath, FileMode.OpenOrCreate, FileAccess.Write); 
SHA512 sh512 = new SHA512Managed(); 
hpass = sh512.ComputeHash(Encoding.ASCII.GetBytes(textBox1.Text)); 
PasswordDeriveBytes pdb = new PasswordDeriveBytes(hpass, hash); 

if (comboBox1.SelectedIndex.Equals(0)) 
{ 
    Aes alg = Aes.Create(); 
    alg.Key = pdb.GetBytes(32); 
    alg.IV = pdb.GetBytes(16); 
} 
if (comboBox1.SelectedIndex.Equals(1)) 
{ 
    DES alg = DES.Create(); 
    alg.Key = pdb.GetBytes(32); 
    alg.IV = pdb.GetBytes(16); 
} 
if (comboBox1.SelectedIndex.Equals(2)) 
{ 
    Rijndael alg = Rijndael.Create(); 
    alg.Key = pdb.GetBytes(32); 
    alg.IV = pdb.GetBytes(16); 
} 

但是,当我不想在每个if语句中加密码流。那么有没有办法将检查卸载到一个函数并返回一个对称算法类型?随着密钥和IV?我要对这个完全错误的标题## ##

回答

2

一个更面向对象的方法是:

创建的算法界面显示在您的组合框:

public interface IAlgorithmItem 
{ 
    SymmetricAlgorithm CreateAlgorithm(); 

    string DisplayName { get; } 
} 

然后,创建一个新类为每个需要的算法:

public class AesAlgorithm : IAlgorithmItem 
{ 
    public AesAlgorithm() 
    { 
    } 

    public SymmetricAlgorithm CreateAlgorithm() 
    { 
     return Aes.Create(); 
    } 

    public string DisplayName 
    { 
     get { return "AES"; } 
    } 
} 

public class RijndaelAlgorithm : IAlgorithmItem 
{ 
    public SymmetricAlgorithm CreateAlgorithm() 
    { 
     return Rijndael.Create(); 
    } 

    public string DisplayName 
    { 
     get { return "Rijndael"; } 
    } 
} 

// ... 

然后,您可以创建项目的一个新的列表:

var listItems = new List<IAlgorithmItem>() { new AesAlgorithm(), new RijndaelAlgorithm() }; 

然后你就可以在你的组合框绑定到这个列表:

comboBox1.DataSource = listItems; 
comboBox1.DisplayMember = "DisplayName"; 

后来,你可以参考所选择的项目:

var algorithmItem = (IAlgorithmItem)comboBox1.SelectedItem; 
var algorithm = algorithmItem.CreateAlgorithm(); 

编辑:使用的接口,而威尔的建议更新比抽象基类。 编辑2:更新为使用创建方法而不是属性,因为操作的结果将在每次访问时创建新算法。

+0

您应该为此使用一个接口而不是抽象基类。 –

+0

@WillVousden - 它会剪掉一大堆语法。 – ChaosPandion

+0

@WillVousden好点。我同意。 –

2

那么,我的第一个倾向是给你维基百科链接到factory methodabstract factory模式(在那里,我仍然这样做),但既然你说你是初学者,那么就不要提前拿出大把的枪。

基本上,你需要的是找到所有加密算法的共同特点,并创建一个方法,它将返回一个具有这种共同特征的对象实例。这种特性的表现形式可以是抽象类或C#中的接口,并且幸运的是,所有选定的加密都来自SymmetricAlgorithm(“运气”可能是对System.Security.Cryptography设计人员的侮辱,但我确信他们会为了插图而原谅我)。

所以,只要refactor你的代码通过引入新的方法,可能沿着这些线路:

private SymmetricAlgorithm GetAlgorithm(int index) 
{ 
    switch (index) 
    { 
    case 0: 
     return Aes.Create(); 
    case 1: 
     return DES.Create(); 
    case 2: 
     return Rijndael.Create(); 
    default: 
     throw new NotSupportedException("unknown algorithm"); 
    } 
} 

你可以很容易弄清楚如何使用这种新方法从你的代码的其余部分。

+0

我可以欣赏这种设计的简单性。 – ChaosPandion

+0

@ChaosPandion:谢谢。我认为其他答案虽然可能从面向对象的角度来看更好,但对初学者来说可能会令人望而生畏。一步一个脚印,激起他们的胃口:) – Alan

+0

非常感谢!我认为这会起作用,并且切换案件是我知道的! C#与我所了解的编程语言完全不同,所以它已经习惯了一些。谢谢你的支持。 – user1657838