AES Modunu Tanımlayın

Oct 22 2020

Diyelim ki Düz Metin ve IV'ü girdi parametresi olarak kabul eden ve şifreli metni döndüren bir API'm var. API'nin AES 128 şifrelemesi kullandığını biliyorum ama şimdi hangi şifreleme modunu (ECB, CBC, OFB, CFB veya CTR) kullandığını belirlemem gerekiyor. Şifreleme modunu nasıl belirleyebilirim? Herhangi bir öneri, ipucu veya rehberlik çok takdir edilecektir.

Misal:

curl "http://dev/api/v1.0/test?iv=00112233445566778899&text=01234567"

Tepki: 7fcb5212d14de7ddcc334ec31acec6ae

Yanıtlar

4 Gilles'SO-stopbeingevil' Oct 22 2020 at 21:39

Verileri şifreleyen bir kara kutunuz var ve bu kara kutunun bir blok şifreleme üzerinden popüler (kimlik doğrulamasız) şifreleme modunu (ECB, CBC, CTR, OFB veya CFB) uyguladığı varsayımıyla çalışıyorsunuz. Şifrelenecek düz metinlerin yanı sıra seçtiğiniz bir IV girişini gönderebilirsiniz.

İlk olarak, akış modları ile akış dışı modlar arasında kolayca ayrım yapabilirsiniz:

  • CTR, OFB ve CFB, akış şifreleme modlarıdır. Şifreli metin her zaman düz metinle aynı uzunluktadır.
  • ECB ve CBC yalnızca tüm blokları şifreleyebilir. Şifreli metnin uzunluğu her zaman blok uzunluğunun bir katıdır (AES, Camellia, ARIA, SM4 için 16 bayt).
  • Şifreli metnin düz metin ile aynı uzunluğa sahip olduğu akış dışı modlar vardır, örneğin CBC veya XEX gibi bir modun üstünde CTS . Ama bu analizde onları dikkate almayacağım.

Yani 1 baytı şifreleyin. 1 baytlık şifreli metin alırsanız, bu bir akış modudur. 16 bayt alırsanız, dolgulu bir tam blok modudur. Bir hata alırsanız, ancak 16 baytı şifrelemek işe yarıyorsa, bu, doldurma olmadan tam blok modudur.

Dolgu ve blok modları

ECB aslında bir IV kullanmaz. Yani IV'den bağımsız olarak aynı çıktıyı alırsanız, ECB'dir, aksi takdirde muhtemelen değildir. Ancak garip bir şekilde tasarlanmış bir sistemse, IV standart olmayan bir şekilde kullanılabilir, örneğin bir "yarı ECB", IV + düz metin üzerinde ECB'yi kullanabilir.

İki özdeş bloğu şifreleyin. İlk iki şifreli metin bloğu aynıysa, ECB'dir. Aksi takdirde, eleme yoluyla, CBC'dir. (Dolgu yöntemine bağlı olarak üçüncü bir blok olabilir veya olmayabilir.)

CBC (veya ECB) dolgusu normalde şifreli metnin boyutunu 1 ila 16 bayta kadar artırır. Doldurmanın her zaman en az 1 bayt olmasının nedeni, şifre çözmeyi belirsiz hale getirmektir: boş doldurma durumları varsa, şifresi çözülmüş ama henüz doldurulmamış şifreli metne bakarak bunu söylemek imkansız olacaktır. Çoğu doldurma yöntemi, şifresi çözülmüş ancak henüz doldurulmamış şifreli metnin son baytının değeri aracılığıyla doldurma uzunluğunu iletir. Bununla birlikte, düz metnin uzunluğu ayrı olarak iletiliyorsa veya düz metin belirli bir bayt ile bitirme gibi bilinen özelliklere sahipse boş doldurmaya izin vermek mümkündür. (Bu iyi bir fikir değil, ancak burada kötü tasarlanmış bir sistemi analiz etmekten bahsediyoruz.)

Akış modlarını ayırt etme

(Notlar: $E$ blok şifreleme işlevidir, $||$ dize birleştirme, $\oplus$ bitsel xor, $+$ sayaç değerlerine ilavedir, $\mathbf{0}$ tamamı bit sıfır bloktur, $\mathbf{1}$ son bitin 1 olması dışında tüm bitlerin sıfır olduğu bir bloktur.)

Şifreleme için aynı IV'ü birden çok kez gönderebileceğiniz için, akış modları arasında ayrım yapmak mümkündür. Bakalım iki bloklu düz metnin$P_1 || P_2$ iki bloklu bir şifreli metne şifrelenmiştir $C_1 || C_2$:

  • OFB: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV})) \oplus P_2$
  • CFB: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV}) \oplus P_1) \oplus P_2$
  • TO: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(\mathrm{IV}+1) \oplus P_2$

Bu üç modu birbirinden ayırmanın bir yolunu oluşturmak için bunu kullanalım.

  1. Tüm bit sıfır IV ile tek bloklu, tümü bit sıfır düz metni şifreleyin. Kara kutunun bu üç moddan hangisini uyguladığı önemli değil, çıktı$E(\mathbf{0})$.
  2. IV ile tek bloklu, hepsi bit sıfır düz metni şifreleyin $E(\mathbf{0})$. Çıktı$E(E(\mathbf{0}))$.
  3. IV ile tek bloklu, hepsi bit sıfır düz metni şifreleyin $\mathbf{1}$(son bitin 1 olması dışında tümü sıfır). Çıktı$E(\mathbf{1})$.
  4. IV ile tek bloklu, hepsi bit sıfır düz metni şifreleyin $E(\mathbf{0}) \oplus \mathbf{1}$. Çıktı$E(E(\mathbf{0}) \oplus \mathbf{1})$.
  5. Şimdi iki bloklu bir düz metni şifreleyin: $\mathrm{IV} = \mathbf{0}$, $P_1 = \mathbf{1}$, $P_2 = \mathbf{0}$. Şifreli metnin ikinci bloğuna bakın.
    • OFB: $C_2 = E(E(\mathbf{0}))$ (2. adımda hesaplanmıştır).
    • CFB: $C_2 = E(E(\mathbf{0}) \oplus \mathbf{1})$ (4. adımda hesaplanmıştır).
    • TO: $E(\mathrm{0} + 1)$. Bu genellikle$E(\mathrm{1})$ (3. adımda hesaplanır) ancak TO uygulaması, sayaç artışını farklı şekilde yaparsa farklı olabilir.
3 SEJPM Oct 22 2020 at 09:13

Şifreleme modunu nasıl belirleyebilirim?

Etrafa göndermeden bu modu tam olarak tanımlayamazsınız $2^{64}$ish bayt veri aynı anahtar altında, çünkü ancak o zaman akış modları (CFB, OFB, CTR) güvenlik açısından farklı şekillerde bozulmaya başlar.

Bununla birlikte , blok uzunluğunun katı olmayan (AES için 16 bayt) bir şifreli metin görürseniz , CFB, OFB veya CTR'den (veya benzer bir akış modu veya herhangi birinin üzerine inşa edilmiş bir mod) sahip olduğunuzdan emin olabilirsiniz. bunlardan).

Şimdi, her zaman blok uzunluğunun katı olan çıktılar alırsanız, o zaman CBC veya ECB modudur. Bu ikisini, CBC'nin sahip olmadığı klasik ECB zafiyetine göre ayırt edebilirsiniz: Eşit girdi blokları, eşit çıktı bloklarına işlenir. Pratikte bu, 32 tümü 0 bayt gönderebileceğiniz anlamına gelir ve aynı olan iki 16 baytlık diziyi gösteren bir şey geri alırsanız, ECB'ye sahip olursunuz, aksi takdirde CBC'ye sahip olursunuz. Alternatif olarak, aynı düz metin için farklı IV'ler belirtirseniz ve yine de aynı şifreli metni geri alırsanız, ECB'nin kullanıldığını da bilirsiniz (CBC IV'ler gerçekten rakip tarafından değil rastgele seçilmelidir ...).