You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function App RabbitMQTrigger AES加密消息解密失败求助

Azure Function RabbitMQ触发器AES加密消息解密失败解决

问题背景

  • 使用Azure Function的RabbitMQ触发器监听外部队列,触发正常,但接收到的是乱码二进制内容,并非Base64格式
  • 原代码用string类型接收消息,执行Convert.FromBase64String时触发非法字符错误
  • 尝试将乱码字符串转UTF8再转Base64后,解密时出现"The input data is not a complete block"错误

核心问题

RabbitMQ中传递的是原始二进制加密数据,用string类型接收会导致二进制字节被错误编码为UTF-8字符串,破坏了原始加密字节流,后续的转码操作无法恢复正确的加密数据。

解决方案步骤

1. 修改触发器参数类型,直接接收二进制数据

将RabbitMQ触发器的参数从string改为byte[],避免编码损失:

[FunctionName("RabbitMQTriggerTest")]       
public async Task Run([RabbitMQTrigger("event-vendor-create", ConnectionStringSetting = "RabbitMQConnection")] byte[] item
  , [DurableClient] IDurableOrchestrationClient starter, ILogger log)
{           
    string decryptedText = AesDecryptHelper.DecryptAes(item, _options.RabbitMQAesKey);
    log.LogInformation($"Decrypted Text: {decryptedText}");
}

2. 调整解密方法,适配二进制输入

修改解密方法,直接接收byte[]类型的加密数据,不再做Base64转换:

public static string DecryptAes(byte[] encryptedBytes, string aesKey)
{
    // 转换Base64格式的AES密钥为字节数组
    byte[] keyBytes = Convert.FromBase64String(aesKey);

    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = keyBytes;
        aesAlg.Mode = CipherMode.CBC;
        aesAlg.Padding = PaddingMode.PKCS7;

        // 验证加密数据长度是否足够容纳IV
        int ivSize = aesAlg.BlockSize / 8;
        if (encryptedBytes.Length < ivSize)
        {
            throw new ArgumentException("加密数据过短,无法提取IV");
        }

        // 提取前置在加密数据中的IV
        byte[] iv = new byte[ivSize];
        Array.Copy(encryptedBytes, 0, iv, 0, ivSize);
        aesAlg.IV = iv;

        using (ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV))
        {
            // 从IV之后的位置开始解密
            using (MemoryStream msDecrypt = new MemoryStream(encryptedBytes, ivSize, encryptedBytes.Length - ivSize))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }
}

3. 关键验证点

  • 密钥一致性:确认AES密钥和发送方完全一致,且是Base64编码格式,长度符合AES要求(128位对应24个Base64字符,256位对应44个)
  • IV传递方式:确认发送方是否确实将IV前置在加密数据前,若IV通过其他方式传递(如RabbitMQ消息Header),需调整IV提取逻辑
  • 加密参数匹配:确认发送方使用的CipherMode、PaddingMode与你的代码完全一致,比如是否是CBC/PKCS7,若发送方用了ECB或ZeroPadding,需同步修改
  • 数据完整性:检查接收的加密字节长度,确保没有在传递过程中丢失字节(密文长度需是AES块大小的整数倍,即16字节的倍数)

内容的提问来源于stack exchange,提问作者OutlawsGalaxy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:18:11