You need to enable JavaScript to run this app. C#与Ruby跨语言AES加解密兼容问题求助,需兼容现有C#加密逻辑
优惠活动
大模型
产品
解决方案
定价
更多

C#与Ruby跨语言AES加解密兼容问题求助,需兼容现有C#加密逻辑

C# AES加密逻辑迁移Ruby(兼容旧密文)修正方案

核心问题梳理

  • 密钥使用错误:C#代码存在冗余逻辑,虽然生成了PBKDF2派生密钥,但实际调用CreateEncryptor/CreateDecryptor时传入的是类顶部硬编码的32位KEY常量,而非派生出来的密钥。原有Ruby代码错误使用了PBKDF2派生的密钥,和C#实际使用的密钥不匹配。
  • 密文结构不匹配:C#输出的密文结构为 [IV长度(4字节小端int)] + [IV内容] + [密文内容],但原有Ruby代码生成/解析的密文结构是直接[IV内容] + [密文内容],缺少前4位的长度标识,解析C#密文时取IV的偏移完全错误。
  • 加密参数对齐问题:需确认Ruby加密库的算法模式为AES-256-CBC,填充方式为PKCS7,和C# RijndaelManaged默认参数保持一致。

修正后的Ruby实现代码

require 'openssl'
require "base64"

# 对应C#里硬编码的KEY常量
CS_HARDCODED_KEY = [222, 11, 149, 155, 122, 97, 170, 8, 40, 250, 67, 227, 129, 147, 159, 81, 108, 136, 221, 41, 247, 146, 114, 133, 232, 31, 33, 196, 130, 88, 136, 238].pack('c*')
# 加密算法参数 对应AES-256-CBC,IV默认长度16字节
CIPHER_ALG = 'aes-256-cbc'

# 解密C#生成的密文方法
def decrypt_from_csharp(encrypted_str, key)
  # 1. Base64解码
  raw_bytes = Base64.decode64(encrypted_str)
  # 2. 读取前4字节获取IV长度(C# BitConverter默认是Windows小端序)
  iv_len = raw_bytes[0,4].unpack1('l<')
  # 3. 读取IV内容
  iv = raw_bytes[4, iv_len]
  # 4. 读取实际密文内容
  ciphertext = raw_bytes[4 + iv_len..-1]
  
  # 5. 执行AES解密
  decipher = OpenSSL::Cipher.new(CIPHER_ALG)
  decipher.decrypt
  decipher.key = key
  decipher.iv = iv
  # 自动处理PKCS7填充
  decipher.update(ciphertext) + decipher.final
end

# 生成兼容C#的密文方法(可选,用于双向兼容)
def encrypt_for_csharp(plain_text, key)
  cipher = OpenSSL::Cipher.new(CIPHER_ALG)
  cipher.encrypt
  cipher.key = key
  iv = cipher.random_iv
  # 构造C#兼容的密文结构:4字节小端IV长度 + IV + 密文
  iv_len_bytes = [iv.length].pack('l<')
  ciphertext = cipher.update(plain_text) + cipher.final
  raw_encrypted = iv_len_bytes + iv + ciphertext
  Base64.encode64(raw_encrypted)
end

# 测试示例
# csharp_encrypted_text = "替换为C#生成的测试密文"
# puts "解密结果:#{decrypt_from_csharp(csharp_encrypted_text, CS_HARDCODED_KEY)}"

# 加密兼容测试
plain_text = "fiskbullsmacka med extra sovs"
encrypted = encrypt_for_csharp(plain_text, CS_HARDCODED_KEY)
puts "生成的兼容C#密文:#{encrypted}"
puts "解密校验:#{decrypt_from_csharp(encrypted, CS_HARDCODED_KEY)}"

额外说明

原有Ruby代码中的PBKDF2派生逻辑在C#侧实际未生效,属于C#代码的冗余逻辑,如果没有特殊历史需求可以直接移除相关代码。如果需要保留双向兼容,加密时按照上述代码的密文结构生成即可,C#侧无需修改即可正常解密Ruby生成的密文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:45:09