3

2048 ビットの秘密 RSA キーを使用して、長さが約 30 文字の文字列値を暗号化/署名する Flex 4 アプリケーションがあります。

現在、com.hurlant.crypto.RSAKey 実装を使用していますが、次の制限に直面しています。

  • 時間がかかりすぎます (30 文字の文字列に署名するのに約 4 秒かかります)。
  • クラスの処理中に UI がフリーズします (実装では明らかにイベントやチャンク処理は使用されません)。

私は他のライブラリを探していましたが、これまでのところ、同じレベルの機能 (PEM 文字列から RSA キーを読み取り、RSA.sign()、RSA.encrypt および復号化を許可する) を備えた、無料で使用できるものを見つけていません。商用アプリケーションでは、私が現在使用しているものよりも高速です。

だから私の質問は:

  • それを行う優れた/高速なAS3ライブラリを知っている人はいますか?
  • 何もなく、自分でゼロから作成することにした場合、パフォーマンスの低下はフラッシュプラットフォームによって何らかの形で引き起こされるため、同じ問題に直面することになりますか?

EDIT2 : 以下のコードは、ファイルに保存されている PEM エンコードされた秘密鍵を使用します。持っていない場合は、次のコードを使用して作成できます。

var exp:String = "10001";
var bits:int = 2048;
rsa = RSAKey.generate(bits, exp);

生成には 1 分近くかかるので、座ってコーヒーを飲むことを忘れないでください。

編集:これは制限を示すコードです。スタート ボタンをクリックするだけで、プログレス バーとアプリケーションが完全にフリーズする様子を確認できます。

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>
        <![CDATA[
            import com.hurlant.crypto.rsa.RSAKey;
            import com.hurlant.util.der.PEM;

            import mx.utils.Base64Encoder;

            var pkfilePath:String = "/Users/david/Desktop/private_key.pem"; 
            var stringToSign:String = "Hello this is a string to be signed by an efficient AS3 library";

            private function readPKContent():String {
                var f:File = new File(pkfilePath);
                var fs:FileStream = new FileStream();
                fs.open(f,FileMode.READ);
                var rawKey:String = fs.readUTFBytes(fs.bytesAvailable);
                fs.close();
                return rawKey;
            }

            private function logTime(msg:String, start:Date, end:Date):void {
                resultTA.text = msg + " " + (end.time-start.time) + " ms\n" + resultTA.text; 
            }

            protected function button1_clickHandler(event:MouseEvent):void
            {
                cryptWithHurlant();
            }

            private function cryptWithHurlant():void {
                var start:Date = new Date();

                //Load key and use it to sign something
                var rawPK:String = readPKContent();
                var time:Date = new Date();
                var rsa:RSAKey = PEM.readRSAPrivateKey(rawPK);
                logTime("Hurlant:ReadRSA", time, new Date());

                //Compute a signature of the string
                var srcBA:ByteArray = new ByteArray();
                srcBA.writeUTFBytes(stringToSign);

                //Now sign inside the second BA
                var desBA:ByteArray = new ByteArray();
                time = new Date();
                rsa.sign(srcBA, desBA, srcBA.length);
                logTime("Hurlant:Encrypt", time, new Date());

                //desBA.position = 0;
                //Recover as a Base64 response
                //var b64encoder:Base64Encoder = new Base64Encoder();
                //time = new Date();
                //b64encoder.encodeBytes(desBA);
                //logTime("Base64:Encoded "+b64encoder.toString(),time, new Date());

                logTime("Hurlant:Total",start,new Date());
            }


        ]]>
    </fx:Script>

    <s:VGroup width="100%" height="100%" horizontalAlign="center">
        <s:Button click="button1_clickHandler(event)" label="Start"/>
        <mx:ProgressBar indeterminate="true"/>
        <s:TextArea width="100%" height="100%" editable="false" id="resultTA"/>
    </s:VGroup>


</s:WindowedApplication>
4

1 に答える 1