2012-08-31 84 views
3

我有一個Flex 4應用程序,它使用2048位專用RSA密鑰對大約30個字符長的字符串值進行加密/簽名。AS3中的快速RSA加密

我目前使用的com.hurlant.crypto.RSAKey實現這樣做,但我現在面臨以下限制:

  • 它需要的時間太長(約4秒簽訂30個字符 字符串)
  • 的UI,而類處理凍結(實施顯然不會 我一直在尋找其他庫使用的事件或數據塊處理)

,但我至今沒有發現任何其他具有相同級別的功能(從PEM字符串讀取RSA密鑰,允許RSA.sign(),RSA.encrypt和decrypt),這是免費在商業應用程序中使用,並且比我目前使用的更快。

所以我的問題是:

  • 有誰知道一個偉大/快速AS3庫,做到這一點?
  • 如果沒有,我決定從頭開始寫一個我會 面臨同樣的問題,因爲低性能在某種程度上是由 閃存平臺引起的?

EDIT2:下面的代碼使用存儲在文件中的PEM編碼的私鑰。如果你沒有一個你可以使用下面的代碼創建一個:

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

不要忘了坐下來,因爲它需要將近一分鐘,以產生採取了一杯咖啡。

編輯:這是顯示限制的代碼片段。 只需點擊開始按鈕,看看進度條和應用程序如何完全凍結。

<?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> 
+0

我編輯你的問題,除去有關Flash的表現有些 「火焰誘餌」 式的評論。 Flash在它的功能上非常出色,在過去的三年裏它已經變得更好。在很多情況下,它比替代品更好。爲了解決你的問題,我的第一個衝動是建議嘗試優化Hurlant Crypto庫;但不是加密專家,我無法告訴你如何。演示您遇到的性能限制的代碼示例可能對此有所幫助。 – JeffryHouser

+0

@ www.Flextras.com這篇評論其實並不富有建設性,並且有點偏離主題。讓我們把這個事實說明,我花了一週的時間來支持客戶,因爲Adobe的最後一個重大錯誤(最新的空中運行時版本完全清空了加密的本地存儲導致丟失存儲在內部的私鑰和許可信息)...無論如何,回到主題我已經添加了一小段代碼來顯示問題。 – Davz

+0

爲什麼你需要RSA加密?也許你可以使用另一種算法,這取決於你真正需要什麼...... – Florent

回答

1

如上所述:

你可能想看看這個計時器基於 「線程」 的實施。這不會加速任何事情,但它會擺脫UI鎖定。我有使用這個在移動設備上工作的代碼。

基於在評論中已經提到的所有內容以及缺少答案,我認爲現在我最好的選擇是編輯RSA實現,使其能夠使用f-a提出的僞線程模型運行。一旦得到移動平臺的支持,我將轉移到工作人員。

參考