代码之家  ›  专栏  ›  技术社区  ›  kumarmo2

AES解密的消息与原始消息不匹配

  •  1
  • kumarmo2  · 技术社区  · 7 年前

    我正在努力 Encrypt Decrypt 字符串使用 AES256 . 但解密后的字符串与原始字符串不匹配。我不确定,但也许我得到了 Encoding 部分错误。

    我正在使用 CSPRNG 生成 IV PBDKF2 用于生成用于AES加密的密钥

    程序.cs :

    using System;
    using System.Text;
    
    namespace AESEncryptionUtility
    {
        class Program
        {
            private static string _pass = "MasterPass";
            private static string _msg = "Mohit";
            private static byte[] key = EncryptionUtility.GenerateKey(_pass, 32);
            private static byte[] IV = EncryptionUtility.GenerateSalt(16);
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                byte[] encrypted = Encrypt(_msg);
                byte[] decrypted = Decrypt(Encoding.ASCII.GetString(encrypted));
            }
    
            public static byte[] Encrypt(string msg)
            {
                byte[] asciiBytesOriginal = Encoding.ASCII.GetBytes(_msg);
                byte[] encrypted = EncryptionUtility.Encrypt(asciiBytesOriginal, key, IV);
                Console.WriteLine("encrypted started");
                foreach(var b in encrypted)
                {
                    Console.Write(b + " ");
                }
                Console.WriteLine("\nencrypted ended");
                return encrypted;
            }
    
            public static byte[] Decrypt(string cipher)
            {
                byte[] asciiBytes = Encoding.ASCII.GetBytes(cipher);
                byte[] originalBytes = EncryptionUtility.Decrypt(asciiBytes, key, IV);
                Console.WriteLine("decrypted started");
                foreach(var b in originalBytes)
                {
                    Console.Write(b + " ");
                }
                Console.WriteLine("\ndecrypted ended");
                string original = Encoding.ASCII.GetString(originalBytes);
                Console.WriteLine("original string: " + original);
                return originalBytes;
            }
        }
    }
    

    加密实用程序.cs :

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace AESEncryptionUtility
    {
        public static class EncryptionUtility
        {
            public static byte[] Encrypt(byte[] plainBytes, byte[] key, byte[] IV)
            {
                byte[] encrypted = null;
                using (AesCryptoServiceProvider aesAlgo = new AesCryptoServiceProvider())
                {
                    aesAlgo.Key = key;
                    aesAlgo.BlockSize = 128;
                    aesAlgo.Mode = CipherMode.CBC;
                    //aesAlgo.Padding = PaddingMode.PKCS7;
                    aesAlgo.Padding = PaddingMode.Zeros;
                    aesAlgo.IV = IV;
                    ICryptoTransform encryptor = aesAlgo.CreateEncryptor();
                    encrypted = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
    
                }
                return encrypted;
            }
    
            public static byte[] Decrypt(byte[] cipherBytes, byte[] key, byte[] IV)
            {
                byte[] decrypted = null;
                using (AesCryptoServiceProvider aesAlgo = new AesCryptoServiceProvider())
                {
                    aesAlgo.Key = key;
                    aesAlgo.BlockSize = 128;
                    aesAlgo.Mode = CipherMode.CBC;
                    //aesAlgo.Padding = PaddingMode.PKCS7;
                    aesAlgo.Padding = PaddingMode.Zeros;
                    aesAlgo.IV = IV;
                    ICryptoTransform decryptor = aesAlgo.CreateDecryptor();
                    decrypted = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
                }
                return decrypted;
    
            }
            public static byte[] GenerateKey(string masterPassword, int size) //size in bytes
            {
                byte[] salt = GenerateSalt(size);
                Rfc2898DeriveBytes pbfdk = new Rfc2898DeriveBytes(masterPassword, salt, 20000);
                return pbfdk.GetBytes(size);
    
            }
    
            public static byte[] GenerateSalt(int size) //size in bytes
            {
                RNGCryptoServiceProvider generator = new RNGCryptoServiceProvider();
                byte[] salt = new byte[size];
                generator.GetNonZeroBytes(salt);
                return salt;
            }
    
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Luke Joshua Park    7 年前

    不能将任意二进制数据转换为字符串:

    byte[] decrypted = Decrypt(Encoding.ASCII.GetString(encrypted));
    

    并希望它,只是偶然,有意义的特殊字符编码,你已经选择。它不是那样工作的。加密算法操作字节,而不是字符串。如果更改以下内容,代码将正常工作:

    ...
    public static byte[] Decrypt(byte[] cipher)
    {
        byte[] asciiBytes = cipher;
        ...
    
        2
  •  0
  •   Terry Lennox    7 年前

    是否尝试将最后一行更改为:

    byte [] decrypted = Decrypt ( encrypted);