对称加密算法功能

时间:2012-09-09 08:16:44

标签: c# encryption encryption-symmetric

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

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语句中放入加密流时。那么有没有办法将检查卸载到函数并返回对称算法类型?有了Key和IV吗?我是否完全错了?## Heading ##

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分: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");
  }
}

您可以轻松地从代码的其余部分中找出如何使用这种新方法。