2016-11-03 5 views
0

먼저이 질문에 대한 답변을 가진 수십 개의 다른 게시물이 있다는 것을 알고 있습니다. 나는 여전히이 문제를 극복 할 수없는 것 같아서 내가하는 것보다 암호에 대해 더 많이 알고있는 누군가로부터 약간의 도움을 찾고 있습니다.해독 중에 "채우기가 잘못되어 제거 할 수 없습니다"

둘째, 공유 할 코드는 유산이며, 나는 암호 전문가가 아니기 때문에 모든 것이 의미하는 바에 대해서는 여전히 100 % 명확하지 않습니다. 이 코드의 일부 또는 전부가 전체 쓰레기이며 폐기되어야 할 수도 있습니다. 그러나 이미 다른 시스템에서 사용 중이며이 코드를 통해 암호화 된 값을 저장합니다. 암호 알고리즘과 같은 것들을 변경하는 것은 현재로서는 정확히 선택 사항이 아닙니다. 즉, 개인적인 방법은 테스트 코드 (예 : 암호화 키)뿐만 아니라 레거시 코드도 변경할 수없는 모든 것입니다. 두 가지 정적 인 정적 메서드는 새로운 것이고 문제를 일으킬 가능성이 있지만이를 이해할 수는 없습니다. 코드와에

...... 그래서 거기가

class Program 
{ 
    public static string Encrypt(string key, string toEncrypt) 
    { 
     var keyArray = Convert.FromBase64String(key); 
     var info = Encoding.ASCII.GetBytes(toEncrypt); 

     var encrypted = Encrypt(keyArray, info); 

     return Encoding.ASCII.GetString(encrypted); 
    } 

    public static string Decrypt(string key, string cipherString) 
    { 
     var keyArray = Convert.FromBase64String(key); 
     var cipherText = Encoding.ASCII.GetBytes(cipherString); 

     var decrypted = Decrypt(keyArray, cipherText); 

     return Encoding.ASCII.GetString(decrypted); 
    } 

    private static byte[] Encrypt(byte[] key, byte[] info) 
    { 
     using (var cipher = Aes.Create()) 
     { 
      cipher.Key = key; 
      cipher.Mode = CipherMode.CBC; 
      cipher.Padding = PaddingMode.ISO10126; 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, cipher.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(info, 0, info.Length); 
       } 

       var ciphertext = ms.ToArray(); 

       var message = new byte[cipher.IV.Length + ciphertext.Length]; 
       cipher.IV.CopyTo(message, 0); 
       ciphertext.CopyTo(message, cipher.IV.Length); 
       return message; 
      } 
     } 
    } 

    private static byte[] Decrypt(byte[] key, byte[] ciphertext) 
    { 
     using (var cipher = Aes.Create()) 
     { 
      cipher.Key = key; 
      cipher.Mode = CipherMode.CBC; 
      cipher.Padding = PaddingMode.ISO10126; 

      var ivSize = cipher.IV.Length; 
      var iv = new byte[ivSize]; 
      Array.Copy(ciphertext, iv, ivSize); 
      cipher.IV = iv; 

      var data = new byte[ciphertext.Length - ivSize]; 
      Array.Copy(ciphertext, ivSize, data, 0, data.Length); 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, cipher.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(data, 0, data.Length); 
       } 

       return ms.ToArray(); 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     var newEncryptionKey = Guid.NewGuid().ToString().Replace("-", string.Empty); 

     var encryptedValue = Encrypt(newEncryptionKey, "test"); 

     Console.WriteLine($"New encrypted value: {encryptedValue}"); 

     var decryptedValue = Decrypt(newEncryptionKey, encryptedValue); 

     Console.WriteLine($"New decrypted value: {decryptedValue}"); 
    } 
} 

. 기본적으로 "test"테스트 문자열을 사용하고 GUID를 키로 사용하여 암호화하려고합니다. 다시 말하지만,이 키를 선택하지 않았고 이미 GUID를 키로 사용하는 암호화 된 값이 있으므로 가능한 경우 변경하지 못합니다. 암호화는 제대로 작동하지만 해독을 수행 할 때이 질문의 제목에 예외가 표시됩니다.

어떤 도움을 주시면 감사하겠습니다.

답변

1

암호문 byte[]을 ASCII로 변환 할 수 없습니다. 그것은 그렇게 작동하지 않습니다. 문자 인코딩은 무서운 짐승이며 이해하지 못하는 경우 혼동해서는 안됩니다. 나는 실제 사람이 살아 있다고 생각하지 않습니다;)

은 ASCII 문자의 모음 인 base64로 결과를 반환하지만 그 대신에 옮길 수 있습니다. 문자열을 사용하고 문자가 손실되지는 않습니다.

public static string Encrypt(string key, string toEncrypt) 
{ 
    var keyArray = Convert.FromBase64String(key); 
    var info = Encoding.ASCII.GetBytes(toEncrypt); 

    var encrypted = Encrypt(keyArray, info); 

    return Convert.ToBase64String(encrypted); 
} 

public static string Decrypt(string key, string cipherString) 
{ 
    var keyArray = Convert.FromBase64String(key); 
    var cipherText = Convert.FromBase64String(cipherString); 

    var decrypted = Decrypt(keyArray, cipherText); 

    return Encoding.ASCII.GetString(decrypted); 
} 
+0

그래 :

아래의 수정 된 코드를 참조하십시오. 나는 이것이 완전한 초심자임을 완전히 인정한다. 나는이 코드를 상속 받았고 원래 작성한 사람은 더 이상 주위에 없다. 귀하의 설명과 도움을 많이 주셔서 감사합니다. 이제 완벽하게 작동합니다. – meyousikmann

+0

@meyousikmann 어딘가에서 배워야 해. 도와 줄 수있어서 기뻐. –

관련 문제