C# 使用AES解密时,输入数据不是完整的块

C# 使用AES解密时,输入数据不是完整的块,c#,encryption,C#,Encryption,我试图加密来自oracle的数据,然后使用C对其进行解密# 到目前为止,我成功地编写了一个对C#和Oracle中的数据进行加密的代码,并得到了匹配的结果 我试图用C#解密数据,但我得到了错误: “输入数据不是完整的块” Oracle加密: SELECT DBMS_CRYPTO.encrypt (RAWTOHEX ('Hello World!'), 6 + 256 + 12288,

我试图加密来自oracle的数据,然后使用C对其进行解密#

到目前为止,我成功地编写了一个对C#和Oracle中的数据进行加密的代码,并得到了匹配的结果

我试图用C#解密数据,但我得到了错误: “输入数据不是完整的块”

Oracle加密:

SELECT DBMS_CRYPTO.encrypt (RAWTOHEX ('Hello World!'),
                                       6 + 256 + 12288,
                                       RAWTOHEX ('4566456678997899'),
                                       RAWTOHEX ('1234123456785678')) /*AES128 = 6, CHAINCBC = 256, PAD ZERO = 12288*/
  FROM   DUAL;
/

SELECT   UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode('B6E88F68185584456FBF8FA799B10CA1'))
  FROM   DUAL;
在Oracle中执行第二个查询后的结果是:tuiPaBhVhEVvv4+nmbEMoQ==

C#用于加密/解密的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Security.Cryptography;
using System.Diagnostics;

namespace ConsoleApplication3
{
    class AesTest {
        private const string AesIV = @"1234123456785678"; //@"d8zOcR9K9xqpl8Cd";//@"!QAZ2WSX#EDC4RFV";
        private const string AesKey = @"4566456678997899"; //@"NDsVwQwRbwbuYDcX2PRGwNewMediaCod"; //@"5TGB&YHN7UJM(IK<";

        static void Main(string[] args)
        {
            string src = "Hello World!";
            string x = AesTest.EncryptUsingCBC(src);
            System.Console.WriteLine("Text to Encrypt: " + src);
            System.Console.WriteLine("CSharp: " + x);
            string w = AesTest.DecryptUsingCBC(x);
            System.Console.WriteLine("Decrypt CSharp: " + w);
            System.Console.ReadLine();
        }

        public static byte[] EncryptToBytesUsingCBC(string toEncrypt) {
            byte[] src = Encoding.UTF8.GetBytes(toEncrypt);
            byte[] dest = new byte[src.Length];
            using (var aes = new AesCryptoServiceProvider()) {
                aes.BlockSize = 128;
                aes.KeySize = 128;
                aes.IV = Encoding.UTF8.GetBytes(AesIV);
                aes.Key = Encoding.UTF8.GetBytes(AesKey);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros;
                // encryption
                using (ICryptoTransform encrypt = aes.CreateEncryptor(aes.Key, aes.IV)) {
                    return encrypt.TransformFinalBlock(src, 0, src.Length);
                }
            }
        }

        public static string EncryptUsingCBC(string toEncrypt) {
            return Convert.ToBase64String(EncryptToBytesUsingCBC(toEncrypt));
        }

        public static byte[] DecryptToBytesUsingCBC(string toDecrypt)
        {
            byte[] src = Encoding.UTF8.GetBytes(toDecrypt);
            byte[] dest = new byte[src.Length];
            using (var aes = new AesCryptoServiceProvider())
            {
                aes.BlockSize = 128;
                aes.KeySize = 128;
                aes.IV = Encoding.UTF8.GetBytes(AesIV);
                aes.Key = Encoding.UTF8.GetBytes(AesKey);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros;
                // decryption
                using (ICryptoTransform decrypt = aes.CreateDecryptor(aes.Key, aes.IV))
                {
                    byte[] decryptedText = decrypt.TransformFinalBlock(src, 0, src.Length);
                    return decryptedText;
                }
            }
        }
        public static string DecryptUsingCBC(string toDecrypt)
        {
            return Convert.ToBase64String(DecryptToBytesUsingCBC(toDecrypt));
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Data.OleDb;
使用System.Security.Cryptography;
使用系统诊断;
命名空间控制台应用程序3
{
等级考试{
专用常量字符串AesIV=@“1234123456785678”/“d8zOcR9K9xqpl8Cd”/“!QAZ2WSX#EDC4RFV”;

private const string AesKey=@“45664678997899”/@“NDsVwQwRbwbuYDcX2PRGwNewMediaCod”/@“5TGB&YHN7UJM(IK谢谢Damien,我已经按照您的提示解决了问题,终于让代码正常工作了+得到了我加密的相同字符串

以下是完成所需编辑后的新代码

public static string DecryptToBytesUsingCBC(byte[] toDecrypt)
        {
            byte[] src = toDecrypt;
            byte[] dest = new byte[src.Length];
            using (var aes = new AesCryptoServiceProvider())
            {
                aes.BlockSize = 128;
                aes.KeySize = 128;
                aes.IV = Encoding.UTF8.GetBytes(AesIV);
                aes.Key = Encoding.UTF8.GetBytes(AesKey);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros;
                // decryption
                using (ICryptoTransform decrypt = aes.CreateDecryptor(aes.Key, aes.IV))
                {
                    byte[] decryptedText = decrypt.TransformFinalBlock(src, 0, src.Length);

                    return Encoding.UTF8.GetString(decryptedText);
                }
            }
        }
        public static string DecryptUsingCBC(string toDecrypt)
        {

            return DecryptToBytesUsingCBC(Convert.FromBase64String(toDecrypt));
        }

解密后的结果是:Hello World!

您获取一个包含任意字符的字符串,通过UTF8编码将其转换为字节,对字节进行加密,然后使用Base 64编码将这些任意字节转换为字符串。如果您想逆转此过程,您应该是string->Base 64->bytes->decrypt->bytes->UTF8->s但是这不是你要做的-你的Base 64和UTF 8步骤的顺序是错误的。如果你试图将你的“核心”解密例程编写成与加密例程更明显的相反,这(可能)会更加明显-即名称和签名应该是
public static string decryptfrombytessusing cbc(字节[]到加密)