Ruby中对应PHP的hex2bin和bin2hex方法
今天观摩了网上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方法相关推荐
- 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 ...
- _.uniq_在Ruby中使用Array.compact和Array.uniq方法从Array中移除元素
_.uniq Ruby Array.compact和Array.uniq方法 (Ruby Array.compact and Array.uniq Methods) In the last artic ...
- 在 Ruby 中执行 Shell 命令的 6 种方法
我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...
- Ruby中有用但不常用的String方法总结
String中有用但是不常用到的方法: 1).self[substr] 当自身当中包含substr的时候.则生成并返回一致的字符串 irb(main):075:0> substr = &qu ...
- Ruby中的设计模式
继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...
- Ruby中的设计模式——《松本行弘的程序世界》
< 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...
- Ruby中爬虫的实现
2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...
- Ruby中的require_relative和require有什么区别?
本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...
- 在Ruby中获取system()调用的输出
本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...
- 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?
本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...
最新文章
- openvidu部署
- [置顶] mkdir函数-linux
- 苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用
- CSS Sprites在IE中不起作用[8/7/6]
- 网际协议IP与其配套协议
- struts2实现文件上传
- Python学习笔记(六)——查询天气脚本
- 关于iOS实现前台,后台,锁屏或关闭app语音播报
- php有意思的小程序,这应该是迄今为止最全的小程序Top 100 榜单了,php中文网诚意奉上...
- springboot+旅游管理系统 毕业设计-附源码261117
- 网络概念- VXLAN技术详解
- 图像导入裁剪与灰度化
- 如何给视频加背景音乐?简单快速上手,制作抖音等小视频必备!
- a卡 n卡 html5性能,a卡n卡天梯图_a卡n卡显卡性能对照表2020年5月
- 引用百度地图,隐藏百度地图logo
- android学习笔记----手机号码查询归属地
- java 计算0.1 0.2,为什么0.1+0.2不等于0.3?原来编程语言是这么算的……
- raid5+1和raid5有什么区别?raid5最多可以上几块硬盘
- 微信公众号开发 (1) 微信接入认证成为开发者
- 85后湖南伢子专注五子棋推广 在传承中增强文化自信