2009-03-19 4 views
1

"잘못된 데이터"오류를 생산하는 클래스 :System.Security.Cryptography 및 "Bad Data"- 문자 인코딩?

 

using System; 
using System.Collections.Generic; 
using System.Security.Cryptography; 
using System.Text; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 

    public class RSAcrypt 
    { 
    private string _encryptedData; 
    private string _decryptedData; 

    public string EncryptedData 
    { 
     get { return _encryptedData; } 
     set { _encryptedData = value; } 
    } 

    public string DecryptedData 
    { 
     get { return _decryptedData; } 
     set { _decryptedData = value; } 
    } 

    public RSAcrypt() 
    { 
    } 
    /// <param name="CryptAction"> The action to perform on the string {Encrypt|Decrypt} </param > 
    /// <param name="StringToCrypt"> A string to perform the Action on </param> 
    public RSAcrypt(string CryptAction, string StringToCrypt) 
    { 
     UnicodeEncoding thisUnicodeEncoding = new UnicodeEncoding(); 
     RSACryptoServiceProvider thisRSACryptoServiceProvider = new RSACryptoServiceProvider(); 
     byte[] _stringToCrypt = thisUnicodeEncoding.GetBytes(StringToCrypt); 

     switch (CryptAction) 
     { 
      case "Encrypt": 
       byte[] encryptedData = Encrypt(_stringToCrypt, thisRSACryptoServiceProvider.ExportParameters(false)); 
       _encryptedData = thisUnicodeEncoding.GetString(encryptedData); 
      break; 

      case "Decrypt": 
       byte[] decryptedData = Decrypt(_stringToCrypt, thisRSACryptoServiceProvider.ExportParameters(true)); 
       _decryptedData = thisUnicodeEncoding.GetString(decryptedData); 
      break; 

      default: 

      break; 
     } 

    } 

    static private byte[] Encrypt(byte[] DataToEncrypt, RSAParameters keyInfo) 
    { 
     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
     RSA.ImportParameters(keyInfo); 
     return RSA.Encrypt(DataToEncrypt, false); 
    } 

    static private byte[] Decrypt(byte[] DataToDecrypt, RSAParameters keyInfo) 
    { 
     #region Temporary Assignment - Remove before build 

     byte[] tmpVal = null; 

     #endregion 

     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 

     try 
     { 
      RSA.ImportParameters(keyInfo); 

      #region Temporary Assignment - Remove before build 

      tmpVal = RSA.Decrypt(DataToDecrypt, false); 

      #endregion 
     } 
     catch (Exception ex) 
     { 

      MessageBox.Show("Error: " + ex.Message, "Exception Thrown"); 

     } 

     #region Temporary Assignment - Remove before build 

     return tmpVal; 

     #endregion 
    } 
    } 
} 
 

내가 저를 암호화하는 바이트 배열을 전달하기 전에 인코딩을 확인할 수 있도록 할이 클래스에서 변경할 수 있나요/복호화?

BTW ... 내가 여기 어딘가에 참조를 가지고있는 것처럼 보인다,하지만 난 좌절되는 것을하고, 내가 읽고 컴파일이 아닌 다른 뭔가를 중지하면 나는 적어도 도움이 될 생각 ,이 클래스를 호출하여 Nini 초기화 프레임 워크를 사용하여 XML 파일에 대한 비밀번호를 작성합니다. http://nini.sourceforge.net/manual.php#ASimpleExample

또한, 나는 내가 XML 파일을 작성하기 전에 파일 인코딩 (UTF-8)를 변경하는 Notepad2을 사용했다.

처음 컴파일 한 후 프로그램이 중단 된 후였습니다. 디버거를 사용하여 메모리의 XML 데이터 (UTF-8)와 디스크의 데이터 (ANSI)간에 인코딩이 다르다는 것을 알 수있었습니다.

현재로서는 그렇지 않지만 RSAcrypt()의 Decrypt 부분에서 반환 된 잘못된 데이터를 참조하여 프로그램이 여전히 중단됩니다.

(내 좌절감을 설정하기 전에 Encrypt와 Decrypt가 동일한 메소드 였지만 기능은 동일하지만 잘못된 데이터 클레임과 관련된 추가 예외 정보를 캡처하려고했습니다. 물론, 내 좌절감을 내 코드에 허락하는 것을 허용했다 ;-))

어떤 제안, 아이디어 또는 참고 사항도 좋을 것이다. 당신은 암호화하고 해독 어디 생성자가

RSACryptoServiceProvider thisRSACryptoServiceProvider = new RSACryptoServiceProvider(); 

때문에, 당신은 암호화되어 있습니다 : 당신은 당신이 키 쌍마다 새로운 RSA를 생성

생성자 내부
+0

a 파일에 저장할 데이터를 암호화하려면 AES를 사용하십시오. 그것은 더 성능이 좋으며 대칭 암호입니다. – Alan

+0

민감한 데이터를 2 차 파티에 전달하는 경우 RSA가 더 적합합니다. – Alan

+0

감사합니다. Alan, 응용 프로그램이 작동하면 다른 암호로 이동할 계획이었습니다. 시스템은 물리적 인 액세스가 제한된 사설 서브넷에 있지만 DB에 개인 정보를 쓰게되므로 모든 정보를 암호화해야합니다. 다시 한 번 감사드립니다. E – EtherealMonkey

답변

3

TIA,

E RSA Key로 암호화하고 완전히 다른 암호로 해독합니다.

이 작업을 수행하려면 코드 사용 방법에 따라 몇 가지 옵션이 있습니다.

하나의 옵션은 RSA 키를 내보내고 모든 암호화/암호 해독 작업에 사용하는 것입니다. 실행 파일의 여러 실행간에 데이터를 암호 해독/암호화하려는 경우이 옵션 만 사용할 수 있습니다.

물론 응용 프로그램에서 사용할 공개/개인 키 (Windows 용 DPAPI 권장)를 저장하는 방법을 완전히 설명합니다.

+0

Alan을 제안한 다음 Encrypt 및 Decrypt 메소드도 ImportParameters()를 수행합니다.이 방법이 '다른 키'문제를 해결한다고 생각합니다. –

+0

그렇지만 전달 된 RSA 키는 기본이 아닌 RSAcrypt 생성자를 호출 할 때마다 재생성됩니다. 생성자를 통해 암호화/암호 해독을 호출하는 유일한 방법이기 때문에 암호화/암호 해독 작업을 수행 할 때마다 새로운 RSA 키 쌍이 생깁니다. – Alan