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

#encoding:utf-8require 'openssl'def aes_encrypt(key, iv, plain_string)aes = OpenSSL::Cipher::AES.new(128, :CBC)aes.encryptaes.key = keyaes.iv = ivtxt = aes.update(plain_string) << aes.finaltxt.unpack('H*')[0].upcase
enddef aes_decrypt(key, iv, dicrypted_string)aes = OpenSSL::Cipher::AES.new(128, :CBC)aes.decryptaes.key = keyaes.iv = ivaes.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"]

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

Ruby中对应PHP的hex2bin和bin2hex方法相关推荐

  1. ruby array_在Ruby中使用Array.pop和Array.shift方法从Array中删除元素

    ruby array Ruby Array.pop和Array.shift方法 (Ruby Array.pop and Array.shift methods) If you are reading ...

  2. _.uniq_在Ruby中使用Array.compact和Array.uniq方法从Array中移除元素

    _.uniq Ruby Array.compact和Array.uniq方法 (Ruby Array.compact and Array.uniq Methods) In the last artic ...

  3. 在 Ruby 中执行 Shell 命令的 6 种方法

    我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...

  4. Ruby中有用但不常用的String方法总结

    String中有用但是不常用到的方法: 1).self[substr] 当自身当中包含substr的时候.则生成并返回一致的字符串   irb(main):075:0> substr = &qu ...

  5. Ruby中的设计模式

    继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...

  6. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  7. Ruby中爬虫的实现

    2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...

  8. Ruby中的require_relative和require有什么区别?

    本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...

  9. 在Ruby中获取system()调用的输出

    本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...

  10. 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?

    本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...

最新文章

  1. openvidu部署
  2. [置顶] mkdir函数-linux
  3. 苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用
  4. CSS Sprites在IE中不起作用[8/7/6]
  5. 网际协议IP与其配套协议
  6. struts2实现文件上传
  7. Python学习笔记(六)——查询天气脚本
  8. 关于iOS实现前台,后台,锁屏或关闭app语音播报
  9. php有意思的小程序,这应该是迄今为止最全的小程序Top 100 榜单了,php中文网诚意奉上...
  10. springboot+旅游管理系统 毕业设计-附源码261117
  11. 网络概念- VXLAN技术详解
  12. 图像导入裁剪与灰度化
  13. 如何给视频加背景音乐?简单快速上手,制作抖音等小视频必备!
  14. a卡 n卡 html5性能,a卡n卡天梯图_a卡n卡显卡性能对照表2020年5月
  15. 引用百度地图,隐藏百度地图logo
  16. android学习笔记----手机号码查询归属地
  17. java 计算0.1 0.2,为什么0.1+0.2不等于0.3?原来编程语言是这么算的……
  18. raid5+1和raid5有什么区别?raid5最多可以上几块硬盘
  19. 微信公众号开发 (1) 微信接入认证成为开发者
  20. 85后湖南伢子专注五子棋推广 在传承中增强文化自信

热门文章

  1. Python图像处理(1)
  2. chrome extensions快捷键shortcuts配置
  3. mvn spring-boot 打包成可运行的
  4. JAVA导出EXCEL表格
  5. 浅谈Netty相关概念
  6. 老掉牙的ArrayList解析它它它又来了
  7. sudo apt-get 与 yum
  8. 输出IMG格式SAR图像——Img格式图像文件概述
  9. 【病毒分析】——熊猫烧香 专杀工具C源码
  10. 出海业务网络加速方案技术能力详解