2016-05-03 23 views
5

Bildiğiniz gibi, Java Kartları kullanarak şifreleme işlemleri yapmak istediğimizde, Cipher nesnelerini kullanmalıyız. Sahip olduğum soru aslında verimlilik ile ilgilidir. Bir AES anahtarı kullanarak Şifreleme ve Şifre Çözme işlemlerini yapmak istediğimi varsayalım.Tek bir Cipher nesnesi veya işlemleri şifrelemek ve şifrelemek için iki farklı nesne mi kullanıyorsunuz?

Aşağıdaki stratejilerden hangisi daha iyidir?

  1. iki farklı Cipher nesne tanımlama ve tek bir tuş ile başlangıç ​​ama farklı mod (MODE_ENCRYPT ve MODE_DECRYPT). Daha sonra her işlem için uygun nesne üzerinde sadece doFinal() yöntemini çağırmam gerekir.
  2. Tek bir Cipher nesnesinin tanımlanması ve doFinal() yöntemini çağırmadan önce her seferinde, nesne uygun modda bir init() yöntem çağrısı yapın.

cevap

4

olduğunu hatırlarsanız ilk olarak, Cipher.doFinal(...) belgelerine uygun olarak:

AES, DES, CBC modunda triple DES ve Kore TOHUM algoritmaları 0 başlangıç ​​vektörü (IV) ' başlangıç ​​vektörüne yeniden (IV)' ün yeniden başlatıldı edilebilir init(Key, byte, byte[], short, short) yöntemini kullanarak .

Size sıfırdan IV AES-CBC kullanırsanız, her doFinal sonra init aramak zorunda olduğu anlamına gelir, bu yüzden hiçbir seçim gerçekten yoktur.


Şimdi NXP tarafından J2E145 kartlarında yaptığım bazı gerçek dünya ölçümlerine bir bakalım.

Hem ALG_AES_BLOCK_128_CBC_NOPAD ve ALG_AES_BLOCK_128_ECB_NOPAD RAM arasında 34 bayt ve nesne örneği başına kalıcı bellek arasında 32 bayt gerektirir.

Durum 1: Zaman tüketimini Dair

, 4 muhtemel durumlar vardır aynı geçici anahtar:

key1 = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_DESELECT, 
KeyBuilder.LENGTH_AES_128, false); 
... 
cipher.init(key1, Cipher.MODE_DECRYPT); 
cipher.init(key1, Cipher.MODE_ENCRYPT); 

Sonuç: Her init(...)

Durum başına 11 ms 2: farklı geçici anahtar:

key1 = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_DESELECT, 
    KeyBuilder.LENGTH_AES_128, false); 
key2 = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES_TRANSIENT_DESELECT, 
    KeyBuilder.LENGTH_AES_128, false); 
... 
cipher.init(key1, Cipher.MODE_DECRYPT); 
cipher.init(key2, Cipher.MODE_ENCRYPT); 

Sonuç: Her init(...)

Durumda başına 18 ms 3: aynı kalıcı anahtar:

key1 = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES, 
KeyBuilder.LENGTH_AES_128, false); 
... 
cipher.init(key1, Cipher.MODE_DECRYPT); 
cipher.init(key1, Cipher.MODE_ENCRYPT); 

Sonuç: 12 ms Her init(...)

başına Durum 4: farklı kalıcı tuşları:

key1 = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES, 
    KeyBuilder.LENGTH_AES_128, false); 
key2 = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES, 
    KeyBuilder.LENGTH_AES_128, false); 
... 
cipher.init(key1, Cipher.MODE_DECRYPT); 
cipher.init(key2, Cipher.MODE_ENCRYPT); 

Sonuç: 19 ms her init(...)

Sonuç başına: EEPROM (okuma ve iç kopyalanan sadece çünküinit, gerçekten hızlı, bağımsız bellek tipidir geçici) Cipher örneğinin belleği. Yüksek tüketim gereksinimi olan bazı vakaları hayal edebiliyor olmamıza rağmen, 34 RAM bayt 20 ms için çok fazla ödeme yapıyor gibi görünüyor. Elbette kesin sonuçlar platformunuzda farklı olabilir, ancak alım satım verimliliği az ya da çok aynı kalacaktır.

+0

Doğru zamanlamalarda iyi hatalar vojta! Hala IV = 0 kullanıyorsanız, kalıcı anahtar verilerden yararlanabilirsiniz. Bence bu geçerli bir durum ... –

+0

Bu sadece bir yazım hatası kod satırlarında her zaman sadece bir "şifre" olduğunu ve "cipher1" olmadığını; 'Cipher2'? –

+0

@PaulBastian Evet, ancak yalnızca 20ms kazanabilirsiniz ... Bu 34 baytlık RAM için yeterli mi? Ben öyle düşünmüyorum ... – vojta

3

Kalıcı veya geçici anahtar malzeme ile çalışıp çalışmadığınıza bağlıdır.
Kalıcı anahtar malzemesi varsa:

  • Seçenek 1 ihtiyaçları daha EEPROM ancak anahtar malzeme üretilir veya ithal edildiğinde sadece bir kez init() diyoruz çünkü önemli bir zaman artışı var. 1 daha EEPROM ihtiyacı ve yine init() çağırmanız gerekir, çünkü zaman boost neredeyse varolmayan

    • Seçeneği: Eğer geçici anahtar malzemesini varsa
    • nedenle Seçenek 2

    arzu değildir. Ben bazı büyük test 2 yıl önce yaptım ve doğru hiçbiri veya

  • Seçenek 2 daha az EEPROM ihtiyacı ve kod karmaşıklığını azaltan iki seçenek arasında çok küçük bir performans delta ya nedenle onun arzu
İlgili konular