使用AES解密时,输入数据不是完整的块 [英] The input data is not a complete block when decrypting using AES
问题描述
我正在尝试从oracle加密数据,然后使用C#对其解密
I am trying to encrypt data from oracle, then decrypt it using C#
到目前为止,我设法编写了对C#和Oracle中的数据进行加密的代码,并且得到了匹配的结果
so far, I managed to write a code that encrypts the data in both C# and Oracle, and I got matched results
我正在尝试解密C#中的数据,但出现错误:输入数据不是完整的块"
I am trying to Decrypt the data in C# but I get the error : "The Input data is not a complete block"
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 ==
The result after executing the 2nd query in Oracle is : 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));
}
}
}
运行加密程序后的结果是:tuiPaBhVhEVvv4 + nmbEMoQ ==但解密会引发异常
The result after running the program for encryption is : tuiPaBhVhEVvv4+nmbEMoQ== but the decryption throws the exception
预先感谢
推荐答案
感谢达米恩,我已经按照您的提示进行操作,并设法解决了该问题,最后使代码可以正常工作,并且使用了我加密的相同字符串
Thanks Damien, I have followed your tips and managed to solve the issue and finally got the code to work + got the same string i encrypted
在进行了必要的修改后,这是新代码
here is the new code after doing the edits required
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!
Result after decryption is : Hello World!
这篇关于使用AES解密时,输入数据不是完整的块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!