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"]

這兩個方法很彪悍,只是文檔描述太過簡單,示例又缺乏代表性,只能自己嘗試着看執行效果。

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