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

使用rc2-40-cbc加密在Github CI报错unsupported,算法已在支持列表中

问题原因及解决方案

可能的原因

  • CBC模式缺少显式IV设置:RC2-40-CBC属于CBC模式加密,部分OpenSSL版本强制要求显式指定初始化向量(IV),否则会抛出"unsupported"错误。本地环境的OpenSSL可能允许自动生成IV,但Github CI的版本对该规则的执行更严格。
  • RC2密钥长度的隐式处理差异:虽然你的密钥"346x4"是5字节(刚好匹配RC2-40的40位密钥要求),但不同OpenSSL版本对RC2密钥长度的校验逻辑存在差异,部分版本需要显式声明密钥长度才能正常工作。
  • 弱算法禁用配置:Github CI的OpenSSL可能通过配置文件(如openssl.cnf)禁用了RC2这类弱加密算法,即便OpenSSL::Cipher.ciphers显示该算法存在,实际调用时仍会被拦截。

修复方案

方案1:显式添加IV设置

CBC模式必须使用IV,你可以生成随机IV并与加密结果拼接(解密时拆分),安全性不重要的场景下也可固定一个IV:

def encrypt(msg)
  KEY = "346x4".freeze
  ALGORITHM = "rc2-40-cbc".freeze
  cipher = OpenSSL::Cipher.new(ALGORITHM)
  cipher.encrypt 
  cipher.key = KEY
  # RC2块大小为8字节,IV需对应长度
  iv = cipher.random_iv 
  cipher.iv = iv
  crypt = cipher.update(msg.to_s) + cipher.final
  # 将IV与加密结果一起编码,解密时拆分还原
  crypt_string = Base64.encode64(iv + crypt)
  crypt_string.rstrip
end

方案2:显式指定密钥长度

在设置密钥前添加cipher.key_len = 40,明确告知OpenSSL使用40位密钥:

def encrypt(msg)
  KEY = "346x4".freeze
  ALGORITHM = "rc2-40-cbc".freeze
  cipher = OpenSSL::Cipher.new(ALGORITHM)
  cipher.encrypt 
  cipher.key_len = 40
  cipher.key = KEY
  cipher.iv = cipher.random_iv
  crypt = cipher.update(msg.to_s) + cipher.final
  crypt_string = Base64.encode64(cipher.iv + crypt)
  crypt_string.rstrip
end

方案3:替换为兼容性更好的弱算法

若无需拘泥于RC2,可换成更通用的弱算法(如RC4),这类算法无需IV,且在不同环境下兼容性更高:

def encrypt(msg)
  KEY = "346x4".freeze
  ALGORITHM = "rc4".freeze
  cipher = OpenSSL::Cipher.new(ALGORITHM)
  cipher.encrypt 
  cipher.key = KEY
  crypt = cipher.update(msg.to_s) + cipher.final
  crypt_string = Base64.encode64(crypt)
  crypt_string.rstrip
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:39:51