Ruby GPGME - How to encrypt large files

拟墨画扇 提交于 2019-12-11 11:52:38

问题


I'm having difficulty to Encrypt large files (bigger than available memory) using GPGME in Ruby.

#!/usr/bin/ruby
require 'gpgme'

def gpgfile(localfile)
  crypto = GPGME::Crypto.new
  filebasename = File.basename(localfile)
  filecripted = crypto.encrypt File.read(localfile), :recipients => "info@address.com", :always_trust => true
  File.open("#{localfile}.gpg", 'w') { |file| file.write(filecripted) }
end

gpgpfile("/home/largefile.data")

In this case I got an error of memory allocation: "read: failed to allocate memory (NoMemoryError)"

Someone can explain me how to read the source file chunk by chunk (of 100Mb for example) and write them passing by the crypting?


回答1:


The most obvious problem is that you're reading the entire file into memory with File.read(localfile). The Crypto#encrypt method will take an IO object as its input, so instead of File.read(localfile) (which returns the contents of the file as a string) you can pass it a File object. Likewise, you can give an IO object as the :output option, letting you write the output directly to a file instead of in memory:

def gpgfile(localfile)
  infile = File.open(localfile, 'r')
  outfile = File.open("#{localfile}.gpg", 'w')

  crypto = GPGME::Crypto.new    
  crypto.encrypt(infile, recipients: "info@address.com",
                         output: outfile,
                         always_trust: true)
ensure
  infile.close
  outfile.close
end

I've never used ruby-gpgme, so I'm not 100% sure this will solve your problem since it depends a bit on what ruby-gpgme does behind the scenes, but from the docs and the source I've peeked at it seems like a sanely-built gem so I'm guessing this will do the trick.



来源:https://stackoverflow.com/questions/34926578/ruby-gpgme-how-to-encrypt-large-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!