商业插件 .rbe 的核心机制:将源码加密为二进制数据,并自动生成一个包含解密逻辑的“加载器”文件。
⚠️ 安全警告
此脚本仅用于保护您自己编写的 SketchUp 插件源码。 - 密钥一旦丢失,加密后的文件将无法恢复!
请务必在安全位置备份原始 .rb文件和密钥。 生成的 Stub 文件中包含硬编码密钥,仅能防止普通用户直接阅读源码,无法抵御专业逆向工程。商业级保护请配合 C Extension 或在线授权系统使用。
📦 完整脚本:sketchup_rbe_builder.rb
将以下代码保存为 sketchup_rbe_builder.rb,放在您的插件开发目录中:
# frozen_string_literal: true# SketchUp RBE Builder - AES-256-CBC 加密打包工具# 用法: ruby sketchup_rbe_builder.rb <source.rb> <output.rbe> [key]require 'openssl'require 'base64'require 'securerandom'class SketchUpRBEBuilderCIPHER_ALGORITHM = 'aes-256-cbc'def initialize(key = nil)# 若未提供密钥,则自动生成32字节随机密钥@key = key ? key.byteslice(0, 32).ljust(32, "\0") : SecureRandom.random_bytes(32)raise "Key must be 32 bytes for AES-256" unless @key.bytesize == 32end# 加密源码并生成 .rbe 文件def encrypt(source_path, output_path)raise "Source file not found: #{source_path}" unless File.exist?(source_path)code = File.read(source_path, encoding: 'utf-8')# AES-256-CBC 加密cipher = OpenSSL::Cipher.new(CIPHER_ALGORITHM)cipher.encryptcipher.key = @keyiv = cipher.random_ivencrypted = cipher.update(code) + cipher.final# 生成自包含的解密 Stubstub = generate_stub(iv, encrypted)File.write(output_path, stub, encoding: 'utf-8')puts "✅ Encrypted successfully!"puts " Source: #{source_path}"puts " Output: #{output_path}"puts " Key (hex): #{@key.unpack1('H*')}"puts "⚠️ SAVE THIS KEY SECURELY! Loss = permanent data loss."endprivatedef generate_stub(iv, encrypted_data)b64_enc = Base64.strict_encode64(encrypted_data)b64_iv = Base64.strict_encode64(iv)hex_key = @key.unpack1('H*')<<~RUBY_STUB# encoding: utf-8# ============================================================# PROTECTED SKETCHUP PLUGIN - DO NOT MODIFY# Generated by SketchUp RBE Builder# ============================================================beginrequire 'openssl'require 'base64'key = [#{hex_key.inspect}].pack('H*')iv = Base64.strict_decode64(#{b64_iv.inspect})enc = Base64.strict_decode64(#{b64_enc.inspect})decipher = OpenSSL::Cipher.new('#{CIPHER_ALGORITHM}')decipher.decryptdecipher.key = keydecipher.iv = ivplain = decipher.update(enc) + decipher.finaleval(plain, binding, __FILE__, __LINE__)rescue => eUI.messagebox("Plugin load failed: \#{e.message}") if defined?(UI)raiseendRUBY_STUBendend# ==================== CLI 入口 ====================if __FILE__ == PROGRAM_NAME} <source.rb> <output.rbe> [32-byte-key]"puts "Example: ruby #{$PROGRAM_NAME} cutter.rb cutter.rbe MySecretKey1234567890abcdef"exit 1endsource = ARGV[0]output = ARGV[1]key = ARGV[2] # 可选,不提供则自动生成builder = SketchUpRBEBuilder.new(key)builder.encrypt(source, output)end
🛠️ 第一步:准备两个文件 在您的电脑上新建一个文件夹(比如叫 加密工具),把下面两样东西放进去: 1.锁匠脚本:把我上一条回复中的那一大段代码,复制粘贴到记事本里,保存为 sketchup_rbe_builder.rb(注意后缀是 .rb 不是 .txt)。 2.待加密插件:您自己写的、还没加密的 SketchUp 插件源码,比如叫 my_plugin.rb。 现在您的文件夹里应该有两个文件:
📁 加密工具/├── sketchup_rbe_builder.rb ← 锁匠脚本└── my_plugin.rb ← 您的原始插件源码
🔒 第二步:执行加密(上锁)
⚠️ 前提条件 您的电脑上必须已经安装了 Ruby。SketchUp 自带 Ruby,但命令行需要用系统安装的 Ruby。
Windows 用户推荐安装 RubyInstaller Mac 用户系统自带 Ruby,或运行 brew install ruby
打开 命令提示符 (Windows) 或 终端 (Mac),依次输入以下 3 行命令(每输完一行按回车):
# 第1行:进入您的文件夹(请替换为您实际的路径)cd C:\Users\您的用户名\Desktop\加密工具# 第2行:确认两个文件都在dir # Windows 用 dir,Mac/Linux 用 ls# 第3行:执行加密!密钥请用您自己编的32位密码ruby sketchup_rbe_builder.rb my_plugin.rb my_plugin.rbe "MySecretKey1234567890abcdef"
💡 关于那个32位密钥
"MySecretKey1234567890abcdef"就是您自己编的密码,必须刚好32个字符(英文字母+数字组合即可)。 - 这个密码就是钥匙!
请立刻记在备忘录/密码管理器里。丢了就永远打不开加密后的文件了。
如果成功,您会看到这样的输出:
✅ Encrypted successfully!Source: my_plugin.rbOutput: my_plugin.rbeKey (hex): 4d79536563726574...⚠️ SAVE THIS KEY SECURELY! Loss = permanent data loss.
此时文件夹里多了一个新文件:
📁 加密工具/├── sketchup_rbe_builder.rb├── my_plugin.rb ← 原始源码(千万别删!备份好!)└── my_plugin.rbe ← 🆕 加密后的文件,这就是您要发布的
✅ 第三步:在 SketchUp 中使用加密后的文件
加密后的 .rbe 文件不需要任何额外解密操作,SketchUp 会自动识别并加载它。
假设您原来的插件入口文件是这样的:
# main.rb (未加密时的写法)require_relative 'my_plugin' # ← 加载明文源码
现在改成加载加密文件:
# main.rb (加密后的写法)load File.join(__dir__, 'my_plugin.rbe') # ← 改为加载 .rbe
就这样。对 SketchUp 用户来说完全无感知,他们安装后正常使用,但打开 .rbe 文件只能看到一堆乱码,看不到您的原始源码。
夜雨聆风