尝试使用Blowfish

时间:2016-08-31 15:49:11

标签: ruby encryption blowfish

我试图解密一些我从API获取的数据,并得到一些奇怪的错误。

一些背景

我使用Blowfish对提取的数据进行加密,然后将其编码为base64字符串,并以JSON字符串形式提供。这是JSON字符串的样本

{"payload":"BR0UzF38W4oVB7fjP6WgClqdaMKIYTl661mpneqoXQYIYkBQvjlMQZ+yn...."} 

在我的Ruby脚本中,我正在执行以下操作:

require 'crypt/blowfish'
require 'base64'

# get json data
response = Net::HTTP.get(URI('http://www.url-to-json.com'))
results  = JSON.parse(response)

# decode the base64 results
decoded = Base64.decode64(results['payload'])

# setup blowfish object with key
blowfish = Crypt::Blowfish.new('my_secret_key')

# decrypt the data
puts blowfish.decrypt_string(decoded)

这是返回的错误:

/Users/Ken/.rvm/gems/ruby-1.9.3-p327@vs/gems/crypt-2.2.1/lib/crypt/stringxor.rb:4:in `^': undefined method `b' for "java.uti":String (NoMethodError)
    from /Users/Ken/.rvm/gems/ruby-1.9.3-p327@vs/gems/crypt-2.2.1/lib/crypt/cbc.rb:62:in `decrypt_stream'
    from /Users/Ken/.rvm/gems/ruby-1.9.3-p327@vs/gems/crypt-2.2.1/lib/crypt/cbc.rb:115:in `decrypt_string'
    from /Users/Ken/Code/vs/scripts/test.rb:55:in `run'
    from init.rb:43:in `<main>'

您对可能导致该错误的原因有任何见解吗?我已经调试了好几个小时,似乎无法取得任何进展。我最好的猜测是它是一个编码问题,但当我使用force_encoding()强制进行编码时,我会遇到相同的错误。

如果你想知道我已经锁定了这个应用程序的Ruby版本1.9.3-p327。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

罪魁祸首是这种b方法。它是在Ruby 2.0中介绍的。正如您在文档中看到的那样,它将返回带有ASCII-8BIT编码的字符串副本。您可以更新ruby版本或monkey-patch String类来添加此方法。它通常用C实现,但我认为这个Ruby实现也可以工作:

class String
  def b
    self.dup.force_encoding("ASCII-8BIT")
  end
end