2013-12-22 2 views
0

내 자신의 RSA 암호화를 만들려고합니다. C#에서 메서드를 빌드하는 방법을 알고 있지만 어떻게 완료했는지 알고 싶기 때문에 자체적으로 프로그램을 만들고 싶었습니다. 바이트 배열을 변환 할 때 엉망이라고 생각합니다. 누군가가 나를 올바른 방향으로 밀어 넣을 수 있다면 그것은 좋을 것입니다 :). 당신이 인코딩자체 RSA 암호화를 사용하여 바이트 배열을 암호화하는 방법은 무엇입니까?

private void btnEncrypt_Click(object sender, EventArgs e) 
{ 
    EncryptieModulo = 55; 
    PublicKey = 27; 
    var PlainText = Encoding.UTF8.GetBytes(txtPlaintext.Text); 
    for (int i = 0; i < PlainText.Length; i++) 
    { 
     PlainText[i] = (byte)(BigInteger.Pow(PlainText[i], PublicKey) % EncryptieModulo); 
    } 

    textBox1.Text = Convert.ToBase64String(PlainText); 
} 

private void btnDecrypt_Click(object sender, EventArgs e) 
{ 
    EncryptieModulo = 55; 
    PrivateKey = 3; 
    var CrypText = Convert.FromBase64String(txtCCryptedText.Text); 
    for (int i = 0; i < CrypText.Length; i++) 
    { 
     CrypText[i] = (byte)(BigInteger.Pow(CrypText[i], PrivateKey) % EncryptieModulo); 
    } 

    textBox1.Text = Encoding.UTF8.GetString(CrypText); 
} 
+0

이 코드의 입력 및 출력 예제로 설명하고 수행 할 작업과 이러한 차이점을 조사하기 위해 시도한 사항을 설명하십시오. – CodeCaster

+0

"Pablo"문자열을 암호화하면 "FDAgJQE ="가 반환됩니다. 이제 해독하려고하면 "* + 5"문자열이 반환됩니다. – user2348955

+0

@CodeCaster : 코드에서 알 수 있듯이 매우 기본적인 RSA를 구현하여 코드 작동 방식을 이해하려고합니다. 여기에 설명 된 내용은 다소 다릅니다 http://en.wikipedia.org/wiki/RSA_%28cryptosystem%29#A_working_example http://www.emc.com/emc-plus/rsa-labs/에 대한 전체 구현 자료 pkcs/files/h11300-wp-pkcs-1v2-2-rsa-cryptography-standard.pdf는 단순하지는 않지만 가장 기본적인 형태의 RSA 내부 작업을 시도하는 것입니다. –

답변

1

값은 예를 들어 당신이에 라틴 알파벳 문자를 번역하는 사용자 정의 기능을 Encoding.UTF8.GetBytes/Encoding.UTF8.GetString을 대체해야 작동하기 위해서는 귀하의 케이스 (55)에 모듈로, 이하해야 0-54 바이트 사이의 바이트.

예를 들어 당신이 이런 식으로 작업을 수행 할 수 있습니다

private static byte[] GetBytes(string s) 
{ 
    byte[] result = new byte[s.Length]; 
    for (int i = 0; i < s.Length; i++) 
    { 
     if (s[i] >= 'a' && s[i] <= 'z') 
     { 
      result[i] = (byte)(s[i] - 'a'); 
      continue; 
     } 
     if (s[i] >= 'A' && s[i] <= 'Z') 
     { 
      result[i] = (byte)(s[i] - 'A' + 26); 
      continue; 
     } 
     throw new ArgumentOutOfRangeException(); 
    } 
    return result; 
} 

private static string GetString(byte[] b) 
{ 
    StringBuilder sb = new StringBuilder(b.Length); 
    for (int i = 0; i < b.Length; i++) 
    { 
     if (b[i] >= 0 && b[i] < 26) 
     { 
      sb.Append((char)('a' + b[i])); 
      continue; 
     } 
     if (b[i] >= 26 && b[i] < 52) 
     { 
      sb.Append((char)('A' + b[i] - 26)); 
      continue; 
     } 
     throw new ArgumentOutOfRangeException(); 
    } 
    return sb.ToString(); 
} 

지금 대체 당신의 Encoding.UTF8.GetBytes/우리의 새 것으로 Encoding.UTF8.GetString 당신이 갈 수 있어야한다.

참고 당신이 방금 한 것은 RSA 암호화가 아닙니다. 매우 짧은 키를 사용하여 각 바이트를 개별적으로 암호화했습니다. 이 구현의 보안은 zilch입니다. "실제"구현의 모든 복잡성에 대해서는 the spec을 참조하십시오. (사람을위한 덧셈은 마음에 온다). 또한 알고리즘을 더 잘 이해하고 싶다면 실제 오픈 소스 구현을 여러 번 살펴 보는 것이 좋습니다.

+0

감사합니다. 정말 도움이되었습니다. 매우 짧은 키를 제외하고는 이것이 안전하지 않은 다른 이유가 있습니까? – user2348955

+0

예. http://crypto.stackexchange.com/에서이 질문을하는 것이 좋지만 일반적으로 주어진 키를 사용하여 바이트 단위로 암호화하는 경우 각 바이트 당 256 개의 다른 출력을 얻을 수 있으며 출력 사이에 일대일 매핑이 생깁니다 및 바이트. 모든 0x01은 항상 0x5fa3dd로 암호화됩니다. 이게 얼마나 나쁜지 알 수 있기를 바랍니다. –

관련 문제