Ruby中对应PHP的hex2bin和bin2hex方法

今天观摩了网上PHP大师破译注册表Navicat连接中保存的数据库密码,现实中也遇到了这样的尴尬,由于本地没有PHP运行环境,在线执行的方法毕竟把密码POST出去了,感觉欠妥,打算使用其它语言移植一段代码备日后使用。在移植过程中遇到Ruby没有现成的标题中提到的两个方法,而需要使用pack和unpack来完成工作,恰巧这两个方法的官方文档描述是非常晦涩的,不动手尝试完全不能理解它在说什么,下面放上一段加密和解密的方法,然后在记录下pack和unpack在处理十六进制字符串时的用法。

#encoding:utf-8

require 'openssl'

def aes_encrypt(key, iv, plain_string)
  aes = OpenSSL::Cipher::AES.new(128, :CBC)
  aes.encrypt
  aes.key = key
  aes.iv = iv
  txt = aes.update(plain_string) << aes.final
  txt.unpack('H*')[0].upcase
end

def aes_decrypt(key, iv, dicrypted_string)
  aes = OpenSSL::Cipher::AES.new(128, :CBC)
  aes.decrypt
  aes.key = key
  aes.iv = iv
  aes.update([dicrypted_string].pack('H*')) << aes.final
end

这两段代码是抄来的,只增加了aes的iv参数和修改一些参数的命名。

比如字母'a'的ascii码是0x61,要把串'616161'翻译成'aaa'需要做以下的操作:先把这个串塞入Array对象,然后用Array的pack方法把元素连接起来,H*表示单字节hex高4bit在前,低4bit在后。对应的有h*,和字序Little-Endian和Big-Endian类似,只是以半个字节为单位。

#hex2bin
irb(main):001:0> a = Array.new
=> []
irb(main):002:0> a << '616161'
=> ["616161"]
irb(main):003:0> a.pack('H*')
=> "aaa"

反过来要把'aaa'串翻译成'616161',需要借助String对象的unpack方法。

#bin2hex
irb(main):004:0> b='aaa'
=> "aaa"
irb(main):005:0> b.unpack('H*')
=> ["616161"]

这两个方法很彪悍,只是文档描述太过简单,示例又缺乏代表性,只能自己尝试着看执行效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章