尝试使用 Blowfish 解密数据时出现 NoMethodError
NoMethodError when trying to decrypt data using 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。
在此先感谢您的帮助!
罪魁祸首是这个b
方法。它是在 Ruby 2.0 中引入的。正如您在文档中看到的那样,它正在返回具有 ASCII-8BIT 编码的字符串副本。您可以更新 ruby 版本或 monkey-patch String class 来添加此方法。它通常在 C 中实现,但我认为这个 Ruby 实现也可以工作:
class String
def b
self.dup.force_encoding("ASCII-8BIT")
end
end
我正在尝试解密我从 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。
在此先感谢您的帮助!
罪魁祸首是这个b
方法。它是在 Ruby 2.0 中引入的。正如您在文档中看到的那样,它正在返回具有 ASCII-8BIT 编码的字符串副本。您可以更新 ruby 版本或 monkey-patch String class 来添加此方法。它通常在 C 中实现,但我认为这个 Ruby 实现也可以工作:
class String
def b
self.dup.force_encoding("ASCII-8BIT")
end
end