DES şifre çözme "bad decrypt" veya dolgu hatasıyla başarısız oluyor — neyi kontrol etmeliyim?
Şifre çözme, her parametrenin şifreleyen tarafla eşleşmesini gerektirir: anahtar baytları, anahtar uzunluğu (8/16/24), mod (ECB/CBC), IV, dolgu ve şifreli metnin hex mi Base64 mü olduğu. En yaygın iki tuzak: anahtar uzunluğu uyuşmazlığı (32 onaltılık karakterden oluşan bir "DES anahtarı" 16 bayttır — bu 2 anahtarlı 3DES'tir, tekli DES değil) ve dolgu adı karmaşası (Java'nın PKCS5Padding'i DES için PKCS#7'dir — None seçmeyin). Sağdaki katlanır panel, geçerli ayarlar için eşdeğer OpenSSL komutunu gösterir; onu karşı tarafa gönderin — sapmanın nerede olduğunu bulmanın en hızlı yolu budur.
DES anahtarı kaç karakterdir? Peki 3DES?
Tekli DES: nominal olarak 64 bit (8 bayt, 56 etkili — her baytta bir bit eşlik bitidir). 3DES'in iki biçimi vardır: 2 anahtarlı (16 bayt, K1‖K2, K3=K1) ve 3 anahtarlı (24 bayt, K1‖K2‖K3). Nominal anahtar malzemesi 112/168 bit, ancak NIST'in etkin güvenlik gücü (SP 800-57 Part 1 Rev.5 Tablo 2) yalnızca yaklaşık 80 ve 112 bit — üstelik 3 anahtarlı biçim de artık önerilmiyor. Bu araç biçimi bayt sayısından belirler; 8/16/24 dışındaki her uzunluk hata fırlatır — CryptoJS ve openssl enc -K bunun yerine sessizce kırpar veya sıfırla doldurur ki bu da birlikte çalışma sorunlarının bir numaralı kaynağıdır.
IV nedir ve DES için uzunluğu ne kadardır?
IV, CBC'nin ilk bloğa karıştırdığı 8 baytlık değerdir; ECB bir IV kullanmaz. Tam olarak 8 bayt olmalıdır (16 onaltılık hane veya 8 ASCII karakteri). Dikkat: DES'in IV'sü 8 bayt, AES'inki 16 bayttır — AES IV uzunluğunu kopyalamak anında başarısız olur. Aynı anahtarla bir IV'yi asla yeniden kullanmayın.
Java'nın DES/ECB/PKCS5Padding'i bu araçta neye karşılık gelir?
ECB modu + PKCS#7 dolgusu. JCE'de DES için "PKCS5Padding", genel PKCS#7 algoritmasını çalıştırır — PKCS#5 hiçbir zaman yalnızca 8 baytlık bloklar için dolgu tanımlamıştı ki bu, DES'in bloğudur. Java Cipher.getInstance("DES/ECB/PKCS5Padding") çıktısı, burada ECB + PKCS#7 ve 8 baytlık tekli DES anahtarıyla çözülür. ⚠️ Java'nın 3DES'i (DESede) yalnızca 24 baytlık anahtarları kabul eder — 2 anahtarlı biçim için K1‖K2'yi kendiniz K1‖K2‖K1'e genişletmelisiniz.
PHP'nin des-ede3 algoritma adları nasıl eşleşir?
PHP, OpenSSL'in adlarını ödünç alır: des-ede3-cbc, 3 anahtarlı 3DES + CBC'dir; des-ede3-ecb, 3 anahtarlı + ECB'dir; des-ede-cbc ise 2 anahtarlı biçimdir. 24 baytlık anahtar 3 anahtarı, 16 bayt 2 anahtarı seçer.
DES anahtarındaki eşlik bitleri nedir? Kontrol edilirler mi?
Her anahtar baytının düşük biti eşlik biti olarak tanımlanmıştır, yani gerçek 56 bitlik anahtar 64 bitin içinde yer alır. FIPS 46-3 bunu kontrol etmeyi gerektirmez — OpenSSL, Java ve bu araç da onu yok sayar; herhangi 8 bayt çalışır ve eşlik bitlerini değiştirmek şifreli metni değiştirmez. .NET istisnadır: önce eşliği normalleştirir, sonra zayıf anahtar tablosuyla karşılaştırır, bu nedenle sıfır anahtar ve diğer zayıf anahtarlar .NET'te reddedilir — diğer tüm kütüphaneler onlarla mutlu mutlu şifrelerken. Bu tuzak yalnızca, test anahtarlarını Java/OpenSSL'den .NET'e taşırken tetiklenir.
3DES'te K1 = K2 olduğunda ne olur?
2 anahtarlı 3DES'te K3 her zaman K1'e eşittir; K1 = K2 de ise, EDE zincirinin tamamı tekli DES'e çöker: E_K(D_K(E_K(P))) = E_K(P). Aynı şey, 24 baytlık anahtarın üç 8 baytlık bileşeni de aynı olduğunda gerçekleşir. Bu araç yine de şifreler (önce birlikte çalışabilirlik), ama o zaman gerçek güç tekli DES'in 56 biti, 3DES değildir.
DES hâlâ güvenli mi?
Hayır — yalnızca eski sistemlerle uyum için. NIST, tekli DES'i 19.05.2005'te emekliye ayırdı (56 bitlik anahtarlar kaba kuvvetle kırılabilir; EFF'nin Deep Crack'i 1998'de bunu 56 saatte başardı, bir yıl sonra distributed.net ile 22 saatte). SP 800-131A Rev.2, 2 anahtarlı TDEA şifrelemesini Yasak, 3 anahtarlı şifrelemeyi de 31.12.2023'ten sonra Yasak olarak listeler (şifre çözme, yalnızca geçmiş verileri okumak için "Legacy use" olarak kalır); SP 800-67'nin kendisi de 01.01.2024'te geri çekildi. Küçük 64 bitlik blok, Sweet32 sınıfı birthday sınırını da (CVE-2016-2183) taşır — NIST tek bir anahtar demetini 2²⁰ blok (≈8 MB) düz metinle sınırlar. Yeni her şey için AES-256 kullanın. Bu aracın var olma nedeni, banka takas sistemlerinin, ödeme ağ geçitlerinin ve eski Java/.NET sistemlerinin hâlâ DES çağından mesajlar taşımaları — onları düzeltmeye, onları okuyabilmekle başlanır.
3DES sonucum neden Java/PHP'den farklı?
İsabet oranına göre kontrol edin: ① anahtar uzunluğu — karşı tarafın "32 onaltılık DES anahtarı" 16 bayttır (2 anahtarlı 3DES), siz tekli DES olarak çözdünüz; ② mod — Java'da çıplak "DES" varsayılan ECB, OpenSSL'de mod soneki olmayan adlar des-ede3/des-ede ECB'dir (CBC takma adı -des3); PHP'de openssl_encrypt algoritma adını açıkça yazmayı gerektirir — kafa karıştıran taraf, varsayılan çıktının ham bayt değil Base64 metni olmasıdır; ③ dolgu — eski PHP mcrypt çoğu zaman sıfır dolgusu kullanır, JCE PKCS#5/#7 kullanır; ④ kodlama — hex mi Base64 mi, ve harf büyüklüğü; ⑤ CryptoJS parola tuzağı — "anahtar" olarak bir dize vermek, anahtar türetme çalıştırır (MD5 + rastgele salt, Salted__ önekli çıktı, her seferinde farklı), ki bu hiçbir zaman ham anahtar değildir — "aynı kod, her çalıştırmada farklı sonuç" demekle açıklanan bir numaralı neden. Bu araç, her birini değiştirmenize izin verir; sağdaki eşdeğer OpenSSL komutu, karşı tarafa yeniden üretmesi için gönderilebilir.
ECB mi CBC mi — hangisini kullanmalıyım?
Konuştuğunuz sistemin gerektirdiği hangisiyse — eski sistemlerle uyumda seçme hakkı yoktur. Yine de seçebilseydiniz, her zaman rastgele IV ile CBC: ECB, eşit düz metin bloklarını eşit şifreli metin bloklarına çevirir ve DES'in küçük 8 baytlık blokları, desenleri AES-ECB'den bile belirgin biçimde sızdırır. DES çağı bankacılık protokolleri ikisini de kullanır; önce protokol belgesini kontrol edin.
Çevrimdışı çalışır mı? Verilerim yükleniyor mu?
Tüm hesaplama tarayıcınızda gerçekleşir (saf TypeScript, sıfır bağımlılık, sıfır ağ isteği); anahtarlar ve düz metin asla cihazdan çıkmaz. Sayfa yüklendikten sonra çevrimdışı kalabilir, çalışmayı sürdürebilirsiniz. Anahtar işleyen bir araç için kabul edilebilir tek biçim budur.
2 anahtarlı mı 3 anahtarlı 3DES mi — eski sistemlerde hangisi daha yaygın?
2 anahtarlı (16 bayt) daha yaygındır: bankalar ve ödeme sektörü, uyumluluk için 16 baytlık anahtarlı donanım devreye aldı ve SP 800-67 ona ayrı (daha erken) bir emeklilik tarihi tanıdı. Bu yüzden 32 onaltılık karakterlik bir "3DES anahtarı" büyük olasılıkla 2 anahtarlı biçimdir. Bu araç, biçimi bayt sayısından otomatik belirler.