乐于分享
好东西不私藏

Sketchup 插件.rb加密成二进制数据.rbe

Sketchup 插件.rb加密成二进制数据.rbe

商业插件 .rbe 的核心机制:将源码加密为二进制数据,并自动生成一个包含解密逻辑的“加载器”文件。

⚠️ 安全警告

  1. 此脚本仅用于保护您自己编写的 SketchUp 插件源码。
  2. 密钥一旦丢失,加密后的文件将无法恢复!
     请务必在安全位置备份原始 .rb 文件和密钥。
  3. 生成的 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 SketchUpRBEBuilder  CIPHER_ALGORITHM = 'aes-256-cbc'  def initialize(key = nil)    # 若未提供密钥,则自动生成32字节随机密钥    @key = key ? key.byteslice(032).ljust(32"\0") : SecureRandom.random_bytes(32)    raise "Key must be 32 bytes for AES-256" unless @key.bytesize == 32  end  # 加密源码并生成 .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.encrypt    cipher.key = @key    iv = cipher.random_iv    encrypted = cipher.update(code) + cipher.final    # 生成自包含的解密 Stub    stub = 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."  end  private  def 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      # ============================================================      begin        require '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.decrypt        decipher.key = key        decipher.iv  = iv        plain = decipher.update(enc) + decipher.final        eval(plain, binding, __FILE__, __LINE__)      rescue => e        UI.messagebox("Plugin load failed: \#{e.message}") if defined?(UI)        raise      end    RUBY_STUB  endend# ==================== CLI 入口 ====================if __FILE__ == PROGRAM_NAME} <source.rb> <output.rbe> [32-byte-key]"    puts "Example: ruby #{$PROGRAM_NAME} cutter.rb cutter.rbe MySecretKey1234567890abcdef"    exit 1  end  source = 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.rb   Output: my_plugin.rbe   Key (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 文件只能看到一堆乱码,看不到您的原始源码。