2016-06-09 8 views
2

Werkzeug: Visual Studio 2012. Windows 7 64bit. Schlüsselwörter: C#, Registrierung, Triple DES Encryption Decryption.3DES: Unterschiedliches Byte empfangen Array der Codierung der Zeichenfolge aus der Registrierung

Ich habe ein Demo-Programm zum Lesen und Schreiben (verschlüsselter String) zur Registrierung erstellt.

Konzept hinter diesem Programm ist: Ich möchte Daten mit Triple DES verschlüsseln und entschlüsseln (ich habe TripleDESCryptoServiceProvider Class verwendet.) Nach der Verschlüsselung wird verschlüsselte Byte-Array in der Registrierung als Zeichenfolge gespeichert. Bis dahin funktioniert es perfekt. Aber wenn ich diese Zeichenfolge aus der Registrierung erhalten und es in Byte-Array konvertieren für die Entschlüsselung ist die Größe des Arrays unterschiedliche und während der Verschlüsselung es Fehler angezeigt werden:

Länge der Daten zu entschlüsseln, ist ungültig.

Unten ist mein Code:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.Win32; 

namespace TripleDES_in_Memory 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       using (RegistryKey key = Registry.CurrentUser.OpenSubKey("MyCompanyName\\")) 
       { 
        if (key != null) 
        { 
         object o = key.GetValue("TrialPeriod"); 
         if (o != null) 
         { 
          string result = Convert.ToString(o); 
          byte[] Data = Encoding.UTF8.GetBytes(result); 


          BinaryFormatter bf = new BinaryFormatter(); 
          using (var ms = new MemoryStream()) 
          { 
           bf.Serialize(ms, o); 
           byte[] narray = ms.ToArray(); 
          } 

          TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); 
          string keybyjaimesh = "MyEncryptKey"; 
          tDESalg.Key = Encoding.UTF8.GetBytes(keybyjaimesh.PadRight(24, ' ')); 

          string ipmanual = "ivmanual"; 
          tDESalg.IV = Encoding.UTF8.GetBytes(ipmanual.PadRight(8, ' ')); 
          byte[] iv = tDESalg.IV; 

          tDESalg.IV = iv; 
          string Final = DecryptTextFromMemory(Data, tDESalg.Key, tDESalg.IV); //decrypt 
          Console.WriteLine(Final); 
         } 
        } 
        else 
        { 
         TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); 

         string sData = "aaaaaaaaaaaaaaaaaaaaaaaa"; 
         DateTime today = DateTime.Today; 
         DateTime answer = today.AddDays(1); 

         string keybyjaimesh = "MyEncryptKey"; 

         tDESalg.Key = Encoding.UTF8.GetBytes(keybyjaimesh.PadRight(24, ' ')); 

         string ipmanual = "ivmanual"; 
         tDESalg.IV = Encoding.UTF8.GetBytes(ipmanual.PadRight(8, ' ')); 
         byte[] iv = tDESalg.IV; 

         byte[] Data = EncryptTextToMemory(sData, tDESalg.Key, tDESalg.IV); 
         Console.WriteLine("Encrypted data main function : " + System.Text.Encoding.UTF8.GetString(Data)); 


         Microsoft.Win32.RegistryKey key1; 
         key1 = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("MyCompanyName"); 
         key1.SetValue("TrialPeriod", System.Text.Encoding.UTF8.GetString(Data)); 
         key1.SetValue("IV", System.Text.Encoding.UTF8.GetString(iv)); 
         key1.Close(); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 

     public static byte[] EncryptTextToMemory(string Data, byte[] Key, byte[] IV) 
     { 
      try 
      { 
       MemoryStream mStream = new MemoryStream(); 

       CryptoStream cStream = new CryptoStream(mStream, 
        new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), 
        CryptoStreamMode.Write); 

       byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data); 
       string result = System.Text.Encoding.UTF8.GetString(toEncrypt); 
       Console.WriteLine("byte to array : " + result); 

       cStream.Write(toEncrypt, 0, toEncrypt.Length); 
       cStream.FlushFinalBlock(); 

       byte[] ret = mStream.ToArray(); 
       Console.WriteLine("Encrypted data : " + System.Text.Encoding.UTF8.GetString(ret)); 

       cStream.Close(); 
       mStream.Close(); 

       return ret; 
      } 
      catch (CryptographicException e) 
      { 
       Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 
       return null; 
      } 
     } 

     public static string DecryptTextFromMemory(byte[] Data, byte[] Key, byte[] IV) 
     { 
      try 
      { 
       MemoryStream msDecrypt = new MemoryStream(Data); 

       CryptoStream csDecrypt = new CryptoStream(msDecrypt, 
        new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), 
        CryptoStreamMode.Read); 

       byte[] fromEncrypt = new byte[Data.Length]; 

       csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); 

       return new ASCIIEncoding().GetString(fromEncrypt); 
      } 
      catch (CryptographicException e) 
      { 
       Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 
       return null; 
      } 
     } 

    } 
} 

verschlüsselten String in der Registry: enter image description here

Bitte schlagen Sie uns Ihre Meinung zu diesem Thema.

Wie kann ich das lösen?

Antwort

1

Ich habe es gelöst.

Ich habe speichern verschlüsselte Zeichenfolge in der Registrierung nach dem Konvertieren in TOBase64String.

string base64 = Convert.ToBase64String(encrypted string); 

Für Entschlüsseln, der String mit:

Und dann auf 64 Basis Zeichenfolge konvertieren:

byte[] encoded = Convert.FromBase64String(encrypteddatafromregistry); 

und wenden dieses Array Decryption.

Verwandte Themen