簡體   English   中英

C#解密:如果無效錯誤要解密的數據長度

[英]C# decryption: Length of the data to decrypt if invalid error

好的,對於一個學校項目,我正在制作一個具有加密功能的應用程序。

這是我的代碼

public static string EncryptString(string stringToEncrypt, string hash)
        {
            byte[] data = UTF8Encoding.UTF8.GetBytes(stringToEncrypt);
            using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
            {
                byte[] keys = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                using (TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider() { 
                    Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
                {
                    ICryptoTransform transform = tripleDES.CreateEncryptor();
                    byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                    return Convert.ToBase64String(results, 0, results.Length);
                }
            }
        }



        public static string DecryptString(string stringToDecrypt, string hash)
        {
            byte[] data = UTF8Encoding.UTF8.GetBytes(stringToDecrypt);
            using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
            {
                byte[] keys = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                using (TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider()
                {
                    Key = keys,
                    Mode = CipherMode.ECB,
                    Padding = PaddingMode.PKCS7
                })
                {
                    ICryptoTransform transform = tripleDES.CreateDecryptor();
                    byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                    return Convert.ToBase64String(results, 0, results.Length);
                }
            }
        }

目前加密方法有效,但解密方法使整個應用程序崩潰。 錯誤信息如下:

System.Security.Cryptography.CryptographicException: '要解密的數據長度無效。'

對於應用程序來說,用戶可以設置自己的加密/解密密鑰很重要。

究竟是什么導致應用程序無法運行? 如果需要,我可以提供更多信息。

謝謝。

這應該可以解決您的問題,您只需要在解密函數中解碼 base64 字符串,即 byte[] data = Convert.FromBase64String(stringToDecrypt);。

我們還想返回一個字符串,而不是 base64 數據,所以我們將在 DecryptString 結束時執行 UTF8Encoding.UTF8.GetString()。

我會注意到一個事實,正如上面的評論所表明的那樣,這不會被認為是安全的,但這是一個學習練習,所以這會讓你開始運行!

我還在此處創建了一個 DotNetFiddle: https ://dotnetfiddle.net/PPzXKo

using System;
using System.Security;
using System.Text;
using System.Security.Cryptography;

namespace triple_des_test
{
    public class Program
    {
        public void Main() 
        {
            string key = "my key";
            string encrypted = EncryptString("Hello world", key); 
            Console.WriteLine("Encrypted: " + encrypted);
            Console.WriteLine("Decrypted: " + DecryptString(encrypted, key));
        }

        public static string EncryptString(string stringToEncrypt, string key)
        {
            byte[] data = UTF8Encoding.UTF8.GetBytes(stringToEncrypt);
            using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
            {
                byte[] keys = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                using (TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider() { 
                    Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
                {
                    ICryptoTransform transform = tripleDES.CreateEncryptor();
                    byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                    return Convert.ToBase64String(results, 0, results.Length);
                }
            }
        }

        public static string DecryptString(string stringToDecrypt, string key)
        {
            byte[] data = Convert.FromBase64String(stringToDecrypt);
            using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
            {
                byte[] keys = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                using (TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider()
                {
                    Key = keys,
                    Mode = CipherMode.ECB,
                    Padding = PaddingMode.PKCS7
                })
                {
                    ICryptoTransform transform = tripleDES.CreateDecryptor();
                    byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                    return UTF8Encoding.UTF8.GetString(results, 0, results.Length);
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM