Posts Tagged ‘as3crypto’

{ 2010.9.29 }

as3cryptoで暗号化

    はてなブックマーク - as3cryptoで暗号化
    このエントリーをはてなブックマークに追加

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