WinZip AE-1 ve AE-2, orijinal, zayıf PKZIP 2.0 akış şifresinin yerini alan, .zip arşivleri içinde kullanılan AES şifreleme şemalarıdır. Her fonksiyon sgcCrypto_Zip_AE2 içindedir ve her seferinde bir arşiv girdisi üzerinde çalışır; çevredeki .zip kapsayıcısını inşa etmenin kendisi bu birimin kapsamı dışındadır.
Yerleşim
Anahtar malzemesi, parola üzerinden PBKDF2-HMAC-SHA1'den gelir; 1000 yineleme, tek bir çağrıda bir şifreleme anahtarı, bir kimlik doğrulama anahtarı ve 2 baytlık bir parola doğrulayıcısı üretir. Hem tuz uzunluğu hem de anahtar uzunluğu, girdi için seçilen AES gücüne bağlıdır.
function sgcZipAE2_SaltLength(aStrength: TsgcZipAESStrength): Integer;
function sgcZipAE2_KeyLength(aStrength: TsgcZipAESStrength): Integer;
procedure sgcZipAE2_DeriveKeys(const aPassword, aSalt: TBytes; aStrength: TsgcZipAESStrength;
out aEncKey, aAuthKey, aVerifier: TBytes);
Bir girdiyi şifreleme ve şifresini çözme
function sgcZipAE2_Encrypt(const aPassword, aSalt, aPlain: TBytes; aStrength: TsgcZipAESStrength;
out aVerifier, aAuthCode: TBytes): TBytes;
function sgcZipAE2_Decrypt(const aPassword, aSalt, aCipher, aVerifier, aAuthCode: TBytes;
aStrength: TsgcZipAESStrength; out aPlain: TBytes): Boolean;
var
oSalt, oCipher, oVerifier, oAuth, oPlain: TBytes;
begin
oSalt := sgcRandomBytes(sgcZipAE2_SaltLength(zasAES256));
oCipher := sgcZipAE2_Encrypt(oPassword, oSalt, oPlain, zasAES256, oVerifier, oAuth);
if sgcZipAE2_Decrypt(oPassword, oSalt, oCipher, oVerifier, oAuth, zasAES256, oPlain) then
{ correct password, untampered data };
end;
2 baytlık doğrulayıcı, yanlış parolaların çoğunu hemen yakalar ve aAuthCode'un taşıdığı 10 baytlık HMAC-SHA1 kimlik doğrulama kodu, gerisini ve şifreli içerikle yapılan herhangi bir kurcalamayı yakalar.
AE-2'nin korumadığı şeyler
Kimlik doğrulama kodu yalnızca bir girdinin dosya içeriğini kapsar. Dosya adını, zaman damgalarını veya arşiv düzenini kapsamaz; bu yüzden içeriği okuyamayan bir saldırgan, tespit edilmeden arşivdeki girdileri yine de yeniden adlandırabilir, yeniden sıralayabilir veya düşürebilir. Ayrıca zayıf bir parolaya karşı da korumaz: anahtar türetme yalnızca 1000 PBKDF2 turu kullanır; bu, Argon2id veya scrypt'in kullanacağından çok daha azdır, çünkü biçim bunlardan önce gelir. Bir AE-2 arşivi, yalnızca onun için seçilen parola kadar güçlüdür.
Ek alan
Bir .zip girdisi, sıkıştırma yöntemini 99 olarak ayarlayarak ve altındaki gerçek sıkıştırma yöntemini, AE sürümünü (1 veya 2) ve AES gücünü kaydeden küçük bir ek alan (üstbilgi kimliği 0x9901) ekleyerek kendisini AE şifreli olarak işaretler; bu, bir okuyucunun bir parola denemeye başlamadan önce ihtiyaç duyduğu bilgidir.
function sgcZipAE2_BuildExtraField(aStrength: TsgcZipAESStrength; aCompressionMethod: Word;
aVersion: TsgcZipAEVersion = zavAE2): TBytes;
function sgcZipAE2_ParseExtraField(const aData: TBytes; out aStrength: TsgcZipAESStrength;
out aCompressionMethod: Word; out aVersion: TsgcZipAEVersion): Boolean;
İki yardımcı fonksiyon, yalnızca kriptografisi değil, tam bir girdiyi oluşturan veya okuyan çağıranlar için, yerel dosya başlığını izleyen tuz / doğrulayıcı / şifreli metin / kimlik doğrulama kodu yerleşimini paketler ve açar:
function sgcZipAE2_PackEntry(const aSalt, aVerifier, aCipher, aAuthCode: TBytes): TBytes;
function sgcZipAE2_UnpackEntry(const aEntry: TBytes; aStrength: TsgcZipAESStrength;
out aSalt, aVerifier, aCipher, aAuthCode: TBytes): Boolean;