こんにちは。
ユニコーン好きの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でも可能です。

