gpt4 book ai didi

c# - 使用 AES 解密时输入数据不是完整的 block

转载 作者:行者123 更新时间:2023-11-30 16:45:42 25 4
gpt4 key购买 nike

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

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

我试图在 C# 中解密数据,但出现错误:“输入数据不是一个完整的 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==

用于加密/解密的 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==但是解密抛出异常

提前致谢

最佳答案

谢谢 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!

关于c# - 使用 AES 解密时输入数据不是完整的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41607885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com