2016-03-28 13 views
3

Java CardでSHA-3アルゴリズムを最適化したい。私は速いアルゴリズムがより少ないメモリを消費してbyte[]short[](または短い[]からbyte[])に簡単に変換できるようにする必要があります。私は現在、2.2VのJavaカードを使用Java Cardのbyte []をshort []に変換する速い方法

short[] temp_conv = JCSystem.makeTransientShortArray((short)255,JCSystem.CLEAR_ON_DESELECT); // used during conversion 
byte[] aux = new byte[2]; 

lenbアレイとauxtemp_convの実際のサイズは、プライベートととして割り当てのように定義されている

private short[] byteToShort(byte[] b,int len) 
{ 
    short len_conv = (short)(len/2); 
    for (short x = 0; x < len_conv;x++) 
    { 
     for (short j = 0 ; j < 2 ; j++) 
      aux[j] = b[2*x+j]; 
     temp_conv[x] = (short)((((short)aux[1]) & 0xFF) | ((((short)(aux[0]) & 0xFF) << 8))); 
    } 
    return temp_conv; 
} 

:私の現在の実装では、このようになります。 2

+2

あなたがループを少しアンロール試みる場合がありますがありません:https://en.wikipedia.org/wiki/Loop_unrolling – Bill

答えて

6

ホイールを再開発しないでください。Java Card APIには、パフォーマンス上の理由からしばしばネイティブ関数として実装される便利なビルトインの静的メソッドがあります。あなたのコードはそれらより優れていることはできません。

arrayCopyRepackあり
ArrayLogic.arrayCopyRepackNonAtomic(b, (short) 0, len, temp_conv, (short) 0); 

、(全体の操作は、単一のトランザクションで実行される永続的な配列のために有用である:すべての

1)まず、javacardx.framework.util.ArrayLogic.arrayCopyRepackNonAtomicはRAMアレイで作業する際に必要なものです、それは少し遅いです)。


2)あなたはArrayLogicを使用できない場合は、ビット単位の魔法の代わりに使用できる、常にjavacard.framework.Util.getShortがあります:

private static final void byteToShort(final byte[] bytes, final short blen, final short[] shorts) 
{ 
    short x = 0; 
    short y = 0; 
    for (; y < blen; x++, y += 2) 
    { 
     shorts[x] = Util.getShort(bytes, y); 
    } 
} 

注意もshort[]のために役に立つかもしれないsetShortがあり、 byte[]変換。


3)あなたが本当にあなた自身でそれを実装したい場合には、あなたのコードのいくつかの他の注意事項:

  • あなたaux持続性メモリに格納されます。これは非常に遅く、auxが頻繁に書き換えられるので、おそらくあなたのカードにダメージを与えます。Symptoms of EEPROM damageを参照してください。
  • b[2*x+j]は、遅い乗算のために有効ではありません。代わりに、2つのループ変数を使用してください。
  • auxと内部ループを取り除くと、それらはまったく必要ありません。
  • int lenについてはどうですか?何のJavaカードでint 2.2.2 ...
+0

'int型len'について:'がありますJava Card 2.2.2ではintです。オプションです。もちろん、 'int'を使用するこのコードでは意味がありません。実装がオプションの' int'型をサポートしているかどうかについては、理由なしに依存しないように 'short'に置き換える必要があります。 –

+0

NVMウェアに対処するには、いくつかのJava Card Operating Systemsでは、トランザクション内でこれらの操作を行う方がよいでしょう。その後、割り当てはアトミックである必要はなくなりますが、トランザクションが完了するまでRAMにキャッシュできます。 –

関連する問題