こんにちは。
ユニコーン好きのruby使い、ヤマモトです。
今回は、ActionScriptで暗号化した文字列を、rubyで複合化して受け取る、というのをやります。
ActionScriptには as3crypto という便利なライブラリが提供されていて、aesやdesなどのアルゴリズムを使用しての暗号化・複合化が可能です。
code.google.com/p/as3crypto/
デモページも用意されていて、コードを書く前にあれこれ試すことができます。
crypto.hurlant.com/demo/
SecretKeyからデモが行えますが、簡単な説明としては以下のとおりです。
Encryption : 暗号アルゴリズム選択(AES,3DESなど)
Mode : 暗号利用モード選択(CBC,CFBなど)
Padding : 公開鍵暗号技術規格(PKCS#5)
KeyFormat に秘密鍵を、
PlainText に変換したい文字列を入力して Encrypto を押すと暗号化された文字列がCipherTextに表示されます。
このとき、表示モードをText以外にしないと、バイナリデータとして表示されますので、Hex等でシリアライズするのがいいでしょう。
で、これの実装方法ですが、
以下の通り書きました。
前提として、
秘密鍵 : “hogehoge”
暗号化する文字列 : “fugafuga”
暗号アルゴリズム : AES
暗号利用モード : ECB
を使用します。
as側
public function encrypt(str:String):ByteArray { var e:ByteArray = new ByteArray(); var key:ByteArray = Hex.toArray(Hex.fromString("hogehoge")); var src:ByteArray = Hex.toArray(Hex.fromString(str)); var pad:IPad = new PKCS5(); var cipher:ICipher = Crypto.getCipher("aes-ecb", key, pad); pad.setBlockSize(cipher.getBlockSize()); cipher.encrypt(src); e.writeObject(src); return src; } |
これで、
encrypt_data = encrypt("fugafuga") |
で暗号化の文字列がバイナリで返されます。
これを、Base64コードに変換してXMLにてrubyに渡し、復号化を行ないます。
rubyではOpenSSL::Cipherクラスを使用して復号化を行ないますが、
その前に、受け取るデータのデシリアライズをしなくてはいけません。
as側で、暗号化文字列をBase64コードに変換していましたので、これを元に戻します。
require 'base64' # encrypt_data = 暗号化された文字列 encrypt_data_byte = decode64(URI.decode(encrypt_data)) |
あとは以下の要領で復号化です。
def decrypt(data, key) c = OpenSSL::Cipher::Cipher.new("aes-128-ecb") begin c.decrypt c.key = "hogehoge" c.update(data) + c.final rescue Error => e logger.error("#{e.message}") end end # 復号化された文字列 decrypt_data = decrypt(encrypt_data_byte) puts decrypt_data ⇒ "fugafuga" |
ロジック中にアルゴリズムや秘密鍵を直接指定していますが、
そこは定数化などで汎用的にしてください。
今回は、as・ruby間で行ないましたが、JavaやObjective-Cでも可能です。