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.
Doğru zamanlamalarda iyi hatalar vojta! Hala IV = 0 kullanıyorsanız, kalıcı anahtar verilerden yararlanabilirsiniz. Bence bu geçerli bir durum ... –
Bu sadece bir yazım hatası kod satırlarında her zaman sadece bir "şifre" olduğunu ve "cipher1" olmadığını; 'Cipher2'? –
@PaulBastian Evet, ancak yalnızca 20ms kazanabilirsiniz ... Bu 34 baytlık RAM için yeterli mi? Ben öyle düşünmüyorum ... – vojta