2012-08-31 43 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提出的伪线程模型运行。一旦得到移动平台的支持,我将转移到工作人员。

参考