2016-11-03 4 views
0

最初に、この質問に回答した数十もの他の投稿があり、すべて読んで試しました。私はまだこの問題を乗り越えているようには見えないので、私よりも暗号についてもっと知っている人の助けを借りて探しています。復号化中に「埋め込みが無効であり、削除できません」

第2に、私が共有しようとしているコードは遺産であり、私は暗号の専門家ではないので、それはまだ何が意味するものでも100%明確ではありません。このコードの一部または全部がゴミであり、廃棄されるべきであるかもしれません。しかし、既にそれを使用している他の多くのシステムがあり、このコードを通過した暗号化された値を格納しています。暗号アルゴリズムのようなものを変更することは、この時点ではまさにオプションではありません。これでプライベートメソッドはレガシーコードであり、テスト値(つまり暗号化キー)は変更できないすべてのものです。 2つの静的静的メソッドは新しく、問題を引き起こす可能性が高いですが、わかりません。コード付きで

......だからそれは

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どこかから学ばなければならない。お力になれて、嬉しいです。 –

関連する問題