2012-09-09 6 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(); 

편집 : 오히려 인터페이스를 사용하는 윌의 제안에 업데이트를 추상 기본 클래스보다 EDIT 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 : 감사합니다. 나는 OOP 관점에서 볼 때 더 나은 것은 사실이지만 초보자에게는 어려운 답변 일 것이라고 생각한다. 한 번에 한 걸음 씩 더 식욕을 돋우는 것. – Alan

+0

대단히 감사합니다! 이 방법이 효과가있을 것이라고 생각합니다. 전환 사례는 제가 아는 바입니다! C#은 내가 아는 프로그래밍 언어와 매우 다르므로 익숙해 져오고 있습니다. 너무지지가되어 줘서 고마워. – user1657838