トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     ActionScript3.0で複合化
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sophia
Åê¹ÆNo.40665
投稿日時: 2008-11-7 10:28
新米
居住地:
投稿: 6
使用環境:
ActionScript3.0で複合化
他のサイトでも質問をさせていただいたのですが、残念ながら回答が頂けず困っております。

AS3.0で所定の場所にあるDES方式で暗号化された画像を復号化しつつ表示させる、というFlashを作成しています。
しかし、復号化の方法が全くわかりません。
下記のサイトを参考に"as3crypto"を使用したやり方で試みては見たものの、
使い方が良く分かっておらず、頓挫しております。
ttp://labs.unoh.net/2007/08/phpflash.html

上記のライブラリを使用することにとくにこだわりはありません。
他の方法でも何でも良いのでサンプル等を記載して頂けると大変助かります。
よろしくお願いします。
kool_it
Åê¹ÆNo.40671
投稿日時: 2008-11-7 15:05
常連
居住地: 東京
投稿: 92
使用環境:
win7::Win2K:Flash CS5.5:
10.7:Flash CS5.5:
Re: ActionScript3.0で複合化
最低でもどの部分でわからないのか書きましょう。
抽象的すぎて何を答えていいのかわかりませんよ。

こちらではサンプルを参考にして実装できました。

手順としては
1)URLLoaderでバイトコードを読む
2)読み込んだdataの復号
3)Loader. loadBytesで読み取り
4)addChild
というかんじですか。


----------------
---------------------------------------
ActionScript Junky!
---------------------------------------

sophia
Åê¹ÆNo.40674
投稿日時: 2008-11-7 16:02
新米
居住地:
投稿: 6
使用環境:
Re: ActionScript3.0で複合化
質問が抽象的で申し訳ありません。。。
お恥ずかしながらまだActionScriptを始めて2週間程度の初心者で、
分からないことが分からない状態でして…。
本来であればもう少し順序立ててステップアップしていきたいのですが、
今回は時間に限りがありまして背伸びをしている次第です。
手順としましてはkool_it様のおっしゃる通りで実装しようとしておりました。(実装する術は持っておりませんが><)
恐縮ですがサンプルコードをご提供頂けないでしょうか?
kool_it
Åê¹ÆNo.40677
投稿日時: 2008-11-7 17:16
常連
居住地: 東京
投稿: 92
使用環境:
win7::Win2K:Flash CS5.5:
10.7:Flash CS5.5:
Re: ActionScript3.0で複合化
ドキュメントクラス Main.as

package {
    import com.hurlant.crypto.*;
    import com.hurlant.util.*;
    import com.hurlant.crypto.symmetric.*;
    import flash.events.*;
    import flash.display.*;
    import flash.net.*;
    import flash.utils.ByteArray;
    
    public class Main extends MovieClip{
        private var loader:Loader;
        private var keyword:String = "test"//パスフレーズ
        
        public function Main(){
        var req:URLRequest = new URLRequest("読み込む画像URI");
            
            var byteLoader:URLLoader = new URLLoader();
            byteLoader.dataFormat = URLLoaderDataFormat.BINARY;
            byteLoader.addEventListener(Event.COMPLETE,compFunction);
            byteLoader.load(req);
        }
        
        private function compFunction(e:Event):void{
            var decryptData:ByteArray = decrypt(URLLoader(e.target).data);
            loader = new Loader();
            loader.loadBytes(decryptData);
            
            addChild(loader);
        }
        
        private function decrypt(data:ByteArray):ByteArray{
            
            var pad:IPad = new NullPad();
            var cipher:ICipher = Crypto.getCipher("des-ecb",Hex.toArray(Hex.fromString(keyword)),pad);
            pad.setBlockSize(cipher.getBlockSize());
            if (cipher is IVMode) {
                    var ivmode:IVMode = cipher as IVMode;
                    ivmode.IV = Hex.toArray("");
            }
            cipher.decrypt(data)
            return data;
        }
    }
}


こんな感じでしょうか


----------------
---------------------------------------
ActionScript Junky!
---------------------------------------

sophia
Åê¹ÆNo.40678
投稿日時: 2008-11-7 18:43
新米
居住地:
投稿: 6
使用環境:
Re: ActionScript3.0で複合化
サンプルコードのご提供ありがとうございます!!
早速試してみたのですが下記のエラーが発生しております。
Error: ECB mode cipher length must be a multiple of blocksize 8
at com.hurlant.crypto.symmetric::ECBMode/decrypt()
at _fla::MainTimeline/decrypt()
at _fla::MainTimeline/compFunction()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

これは私の用意した暗号化ファイルに誤りがあるためなのでしょうか?

たびたびの質問で申し訳ございません。
※ちなみに用意した暗号化画像ファイルはJavaでCliper.getInstance("DES")で暗号化しており、
キーは"abc12345"に設定しているため、頂いたサンプルのキーも"abc12345"に変えて実行しております。

-------------------------------------------------------
追記
いろいろ試してみました。
検討違いかもしれないのですが、
「var cipher:ICipher = Crypto.getCipher("des-ecb",Hex.toArray(Hex.fromString(keyword)),pad);」

「var cipher:ICipher = Crypto.getCipher("des",Hex.toArray(Hex.fromString(keyword)),pad);」
に変えてみたら「cipher.decrypt(data)」の箇所で『#2006: 指定したインデックスが境界外 です。』というエラーになりました。
961832p
Åê¹ÆNo.40688
投稿日時: 2008-11-8 16:04
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
 
:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES(ASDT, MTASC, Eclipse, swfmill)
- Natural Entry Point Method
- LB.Log, Zeroi

Pro, Firefox, Chromium(Iron), IE

----------------
Pro,
Re: ActionScript3.0で複合化
 
このスレッドで AS3Crypto の存在を知り、自分も挑戦してみることに。
デモのソースとにらめっこした結果、公開鍵暗号方式(RSA、強度512bit)で、データも画像ではないので参考にならないかもしれませんが、テキストを入れてボタンを押すと暗号化/復号化するものを作ってみました。

 ・暗号化テストページ
 ・復号化テストページ

それから、共通鍵や秘密鍵をSWF内に含めると、セキュリティ的に危険なので対策が必要みたいです。

 ・Adobe - デベロッパーセンター : より安全なSWF Webアプリケーションの作成(「SWFファイル内の鍵に対する脅威」の部分)

ソースを見ると、証明書から取ってこれそうだし何かと使えそうなライブラリですね。自分はAS3にまだ慣れていないので今回勉強になりました(ByteArrayとか便利ですね)。

(暗号化)

private function button_click(a_event : Event) : void{
    OreLog.trace("i button_click");
    //公開係数
    var pubmod : String =
        "69d21e08e8062a071a72fae2d4fc1e8ea84e7000b97de8f57afb4f3bdc744c00" +
        "9371b0f7be95a413e8926f19d8d9a40c3bb6762753ce7bb4c42b1b1d7cd537cb";
    //公開指数
    var pubexp : String = "10001";
    //暗号化して表示
    var rsa : RSAKey = RSAKey.parsePublicKey(pubmod, pubexp);
    var src : ByteArray =
        Hex.toArray(Hex.fromString(m_srcTA.text)); //TextArea(UTF8文字)→16進数文字→ByteArray
    var dst : ByteArray = new ByteArray;
    rsa.encrypt(src, dst, src.length);
    m_dstTA.text = Hex.fromArray(dst); //ByteArray→16進数文字→TextArea
}

(復号化)

private function button_click(a_event : Event) : void{
    OreLog.trace("i button_click");
    //公開係数
    var pubmod : String =
        "69d21e08e8062a071a72fae2d4fc1e8ea84e7000b97de8f57afb4f3bdc744c00" +
        "9371b0f7be95a413e8926f19d8d9a40c3bb6762753ce7bb4c42b1b1d7cd537cb";
    //公開指数
    var pubexp : String = "10001";
    //秘密指数(SWF内に含めるのは危険)
    var priexp : String =
        "4684e9d3119c9a0165d4ddf0aff2dc02419313fcc7a06ad0bc86214549228f4a" +
        "aafd98423169bf67a8f65702e8d0ea668a39b3214d452cf789183eb69e2b2651";
    //復号化して表示
    var rsa : RSAKey = RSAKey.parsePrivateKey(pubmod, pubexp, priexp);
    var src : ByteArray = Hex.toArray(m_srcTA.text); //TextArea(16進数文字)→ByteArray
    var dst : ByteArray = new ByteArray;
    rsa.decrypt(src, dst, src.length);
    m_dstTA.text =
        Hex.toString(Hex.fromArray(dst)); //ByteArray→16進数文字→UTF8文字→TextArea
}


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

kool_it
Åê¹ÆNo.40698
投稿日時: 2008-11-10 13:03
常連
居住地: 東京
投稿: 92
使用環境:
win7::Win2K:Flash CS5.5:
10.7:Flash CS5.5:
Re: ActionScript3.0で複合化
paddingの設定がおかしいのではないでしょうか?

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/security/jce/JCERefGuide.html#trans
モードやパディングを指定しない場合、モードおよびパディング方式のプロバイダ固有のデフォルト値が使用されます。
たとえば、SunJCE プロバイダは、DES、DES-EDE、および Blowfish 暗号のデフォルトモードとして ECB を、デフォルトパディング方式として PKCS5Padding を使用します。
このため、SunJCE プロバイダでは、

    Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");
および

    Cipher c1 = Cipher.getInstance("DES");
の 2 つの文は、等価になります。

NullPadで指定されているところをPKCS5にしてみてください。

var pad:IPad = new NullPad();
↓
var pad:IPad = new PKCS5();


----------------
---------------------------------------
ActionScript Junky!
---------------------------------------

sophia
Åê¹ÆNo.40700
投稿日時: 2008-11-10 14:19
新米
居住地:
投稿: 6
使用環境:
Re: ActionScript3.0で複合化
kool_it様ご回答ありがとうございます。
ご教授頂いたとおり、「new NullPad();」の所を「new PKCS5();」に変更してみましたが、
未だ下記のエラーが発生します。
---------------------------------------------------------
Error: ECB mode cipher length must be a multiple of blocksize 8
at com.hurlant.crypto.symmetric::ECBMode/decrypt()
at Main/decrypt()
at Main/compFunction()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
---------------------------------------------------------
上記以外で変更しているのはkeywordの値を"12345678"にしているだけです。

ちなみにJava側のテスト用コードはこのようになっております。
---------------------------------------------------------
package jp.test;

import java.io.*;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;


public class FileEncode {
public static void main(String[] args) throws IOException {

FileInputStream inFile = new FileInputStream("C:/inImg/sample.jpg");

File outFile = new File("C:/outImg/sample1.jpg");
outFile.createNewFile();
FileOutputStream fos = new FileOutputStream(outFile);

int count = 0;

try {
// キーを生成
String key = "12345678";
DESKeySpec dk = new DESKeySpec(key.getBytes());
SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
SecretKey sk = kf.generateSecret(dk);

// 暗号化
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, sk);


byte[] buf = new byte[50000];
while((count = inFile.read(buf)) != -1) {
byte encrypted[] = cipher.doFinal(buf);
fos.write(encrypted, 0, count);
}

inFile.close();

fos.close();

} catch(Exception e) {

e.printStackTrace();
}
}
}
---------------------------------------------------------

何か問題がありますでしょうか。。。

>961832p様
「それから、共通鍵や秘密鍵をSWF内に含めると、セキュリティ的に危険なので対策が必要みたいです。」
↑これについては確かにその通りだと思いますので、後で考えようと思います。
ありがとうございます。
kool_it
Åê¹ÆNo.40704
投稿日時: 2008-11-10 19:27
常連
居住地: 東京
投稿: 92
使用環境:
win7::Win2K:Flash CS5.5:
10.7:Flash CS5.5:
Re: ActionScript3.0で複合化
このままでは暗号化される前の(8ビットに成形されていない)データ長が書き出されてしまいます。

fos.write(encrypted, 0, count);
    ↓
fos.write(encrypted, 0, encrypted.length);
System.out.println(count);
System.out.println(encrypted.length)
//データ長が8で割り切れるようにが違うことを確認してください。


本当は読み込んだデータ長をきちんと変換する必要があるのでしょうけど、
これで動くようなので、とりあえず。


----------------
---------------------------------------
ActionScript Junky!
---------------------------------------

sophia
Åê¹ÆNo.40705
投稿日時: 2008-11-10 20:00
新米
居住地:
投稿: 6
使用環境:
Re: ActionScript3.0で複合化
ありがとうございます!!!
ついに復号化に成功しました。

ご指摘頂いた
「本当は読み込んだデータ長をきちんと変換する必要があるのでしょうけど…」
の箇所については下記のように変更しました。
---------------------------------------------------
byte[] buf = new byte[inFile.available()];

inFile.read(buf);
byte encrypted[] = cipher.doFinal(buf);
fos.write(encrypted, 0, encrypted.length);
---------------------------------------------------
今回の原因としては下記のような認識でよろしいのでしょうか?
「DES形式で暗号化されたデータ長は必ず8の倍数となるはずだが、
 それを暗号化される前のサイズ長を用いて書き出していた。
 その為復号時に8の倍数ではないからエラーとなっていた。」

本当にありがとうございました。
ActionScriptに慣れていないことに加え、暗号化についても
理解できていなかった為にご迷惑をおかけしました。

あつかましいお願いですが、もしまだ何かご指摘やアドバイスを頂けるようでしたら、
是非お願い致します。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops