2010-07-22 1 views
2

C#에서 암호 해독 및 해당 값 :Rijndael을의 내가 Rijndael을을 사용하여 문자열을 해독 할 필요가

키 크기 - 192

블록 크기 - 키 128

- 난 cmdAj45F37I5ud2134FDg2fF

아래 코드를 사용하면 오류가 발생합니다. string size illigle, 아무도 도와 줄 수 있습니까?

public static string DecryptRijndael(string value, string encryptionKey) 
    { 

      var key = Encoding.UTF8.GetBytes(encryptionKey); //must be 16 chars 
      var rijndael = new RijndaelManaged 
      { 
       BlockSize = 128, 
       IV = key, 
       KeySize = 192, 
       Key = key 
      }; 

      var buffer = Convert.FromBase64String(value); 
      var transform = rijndael.CreateDecryptor(); 
      string decrypted; 
      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write)) 
       { 
        cs.Write(buffer, 0, buffer.Length); 
        cs.FlushFinalBlock(); 
        decrypted = Encoding.UTF8.GetString(ms.ToArray()); 
        cs.Close(); 
       } 
       ms.Close(); 
      } 

      return decrypted; 

    } 
+3

스택 추적은 무엇을 말하는가 : 여기

전체 코드? 어떤 코드가 잘못 되었습니까? –

+0

테스트 할 수 있도록 "value"매개 변수에 대해 실제가 아닌 실제 샘플을 제공 할 수 있습니까? –

답변

2

당신은 키 "16 개 문자 수 있어야합니다"를 말합니다 코드에서 주석을 볼 수 있을까요? 당신의 열쇠는 24 자 이상으로 보입니다!

이 경우 키를 IV로 다시 사용합니다. 권장되는 모범 사례는 아니지만 IV의 크기는 128 비트/16 바이트로 설정된 블록 크기와 일치해야합니다.

난 그냥 설명하는 문제가 오류가 당신에게 "(IV)이 알고리즘의 블록 사이즈와 일치하지 않는 경우 지정된 초기화 벡터",하지 "문자열 크기 illigle", 그래서이 힘을 주어야한다, 그런 말로 미루어 보아, 빨간 청어가 되라.

3

하나의 큰 문제는 UTF8.GetBytes()을 사용하여 문자열에서 바이트 []를 가져 오는 것입니다. 바이트 수를 제어하기는 어렵지만 안전하지 않습니다.

대신 Rfc2898DeriveBytes.GetBytes()을 사용하십시오. 원하는 길이를 지정할 수 있습니다.

물론 암호화하는 동안해야합니다.
그리고 IV에 대한 루크의 발언과 함께

1

입력이 64 비트로 인코딩되어 있기 때문에 오류가 발생했습니다.

IV와 키가 동일하지 않습니다. IV는 소금에 절인거야. 어쨌든 당신이 얻는 에러는 입력이 64 비트 인코딩이기 때문입니다. 이렇게하면 오류가 발생합니다.

var decodedEncryptionKey = Base64Decode (encryptionKey);

var key = Encoding.UTF8.GetBytes (decodedEncryptionKey);

private string decyptInit(string toBeDecrypted, string key, string initVector) 
    { 
     var keyByte = Encoding.Default.GetBytes(key); 
     var decodedIV = Base64Decode(initVector); 
     var iv = Encoding.Default.GetBytes(decodedIV); 

     var rijndael = new RijndaelManaged 
     { 
      BlockSize = 128, 
      IV = iv, 
      KeySize = 192, 
      Key = keyByte 
     }; 

     var buffer = Convert.FromBase64String(toBeDecrypted); 
     var transform = rijndael.CreateDecryptor(); 
     string decrypted; 
     using (var ms = new MemoryStream()) 
     { 
      using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write)) 
      { 
       cs.Write(buffer, 0, buffer.Length); 
       cs.FlushFinalBlock(); 
       decrypted = Encoding.UTF8.GetString(ms.ToArray()); 
       cs.Close(); 
      } 
      ms.Close(); 
     } 

     return decrypted; 
    } public static string Base64Decode(string base64EncodedData) 
    { 
     var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); 
     return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); 
    }