C# 3DES:从注册表接收编码字符串的不同字节数组

C# 3DES:从注册表接收编码字符串的不同字节数组,c#,arrays,registry,tripledes,C#,Arrays,Registry,Tripledes,工具:Visual Studio 2012。Windows 7 64位。 关键词:C#,注册表,三重DES加密解密 我已经创建了一个演示程序来读取和写入(加密字符串)注册表 这个程序背后的概念是:我想用三重DES(我已经用过)加密和解密数据。加密后,加密的字节数组作为字符串存储在注册表中。到目前为止,它工作得很好但当我从注册表获取此字符串并将其转换为字节数组进行解密时,数组的大小不同,在加密过程中显示错误: 要解密的数据长度无效 下面是我的代码: using System; using Syst

工具:Visual Studio 2012。Windows 7 64位。 关键词:C#,注册表,三重DES加密解密

我已经创建了一个演示程序来读取和写入(加密字符串)注册表

这个程序背后的概念是:我想用三重DES(我已经用过)加密和解密数据。加密后,加密的字节数组作为字符串存储在注册表中。到目前为止,它工作得很好但当我从注册表获取此字符串并将其转换为字节数组进行解密时,数组的大小不同,在加密过程中显示错误:

要解密的数据长度无效

下面是我的代码:

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;
            }
        }

    }
}
注册表中的加密字符串:

请提出你的意见

我怎样才能解决这个问题?

我已经解决了

在将加密字符串转换为TOBase64String后,我将其存储在注册表中

   string base64 = Convert.ToBase64String(encrypted string);
对于解密,使用以下方法获取字符串:

   string encrypteddatafromregistry = (string)key.GetValue("TrialPeriod",typeof(String));
然后转换为64个基本字符串:

byte[] encoded = Convert.FromBase64String(encrypteddatafromregistry );
并将此数组应用于解密