RSA Şifreleme / Şifre Çözme

Tarayıcıda RSA anahtar çiftleri üretin, RSA-OAEP ile şifreleyip şifre çözün, RSA-PSS ya da PKCS#1 v1.5 ile imzalayın ve anahtarları SPKI, PKCS#8 ve PKCS#1 PEM biçimleri arasında dönüştürün. Her şey WebCrypto motoruyla yerel olarak çalışır — hiçbir anahtar ya da ileti bu sayfadan asla ayrılmaz.
RSA ne içindir: toplu veri için değil, küçük iletiler ve imzalar için. RSA çağrı başına en fazla k−2·hashLen−2 bayt şifreler (SHA-256 ile 2048 bitlik bir anahtar için 190 bayt) ve AES’ten yaklaşık 1000× yavaştır. Gerçek sistemler hibrit şifreleme kullanır: RSA rastgele bir AES anahtarını sarar, AES veriyi şifreler (bkz. AES aracı). Bu sayfa öğrenme, test etme ve birlikte çalışma kontrolleri için vardır.
Modül boyutu:
Karma: Etiket:
PKCS#1 v1.5 şifrelemesi bilerek uygulanmamıştır: şifreli metin bütünlüğü yoktur ve dolgu oracle saldırılarına (Bleichenbacher) düşer. OAEP, yeni bir tasarımın kullanması gereken tek şifreleme modudur.
Şema: Karma:
Şema: Karma:
Tek bir RSA çağrısı ne kadar taşıyabilir? OAEP ileti sınırı = anahtar baytı − 2×karma baytı − 2:
ModülSHA-256SHA-384SHA-512
1024 bit62 bayt30 bayt0 bayt
2048 bit190 bayt126 bayt62 bayt
3072 bit318 bayt254 bayt190 bayt
4096 bit446 bayt382 bayt318 bayt
İmzaların ileti sınırı yoktur — ileti önce karmalanır; imzanın kendisi her zaman tam anahtar boyutundadır (2048 bit için 256 bayt).
Anahtar gücü ve ömrü (NIST SP 800-57 Bölüm 1 Rev. 5): 1024 bit, 2013’ten sonra yeni kullanım için yasaklandı; 2048 bit bugün asgari olandır ve 2030’a kadar kabul edilebilir kalır; 3072 bit ve üzeri 2031 ve sonrası için rahat bir seçimdir. 8192 bit burada çalışır ama tarayıcıda üretimi bir dakika ya da daha uzun sürebilir ve şu an kimsenin ihtiyaç duymadığı bir güvenlik sağlar — 3072/4096 tercih edin.
OpenSSL ile birlikte çalışma — bu sayfanın ürettiği PEM’ler komut satırında gidip gelir:
openssl pkeyutl -encrypt -pubin -inkey pub.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256
openssl pkeyutl -decrypt -inkey priv.pem -pkeyopt rsa_padding_mode:oaep ...
openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt (PKCS#1 v1.5)  /  openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt
PSS: her iki dgst çağrısına -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 ekleyin. Anahtar biçimi dönüşümü: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem diskte SPKI ↔ PKCS#1 dönüşümünü yapar; bu sayfa bunu tarayıcıda yapar.
Öz test
Sayfa motorunu bağımsız çapalara karşı çalıştırır: üç modül boyutunda anahtar üretimi, OAEP şifrele/çöz gidiş-dönüşleri, farklı karmalarla PSS ve PKCS#1 v1.5 imzala/doğrula, bayt bayt bir belirleyici v1.5 imza vektörü (bağımsız bir yerel uygulama tarafından üretilmiştir), OpenSSL tarafından üretilmiş ve bu sayfanın şifresini çözmesi/doğrulaması gereken sabit bir OAEP şifreli metni ve PSS imzası (uygulamalar arası birlikte çalışma), PEM biçim dönüşümü gidiş-dönüşleri ve olumsuz testler (kurcalanmış imza, yanlış anahtar başarısız olmalıdır). Hiçbir şey hiçbir yere gönderilmez.
RSA şifreleme ve imzalar sıfırdan açıklanmıştır
Tek cümleyle: RSA bir açık anahtar kriptografisidir — herkes genel anahtarla size şifreleyebilir ya da imzalarınızı doğrulayabilir, ancak yalnızca özel anahtar şifre çözebilir ya da imzalayabilir — ve güvenliği, 2048 bitlik bir sayının iki asala çarpanlarına ayrılmasının bugün var olan hiçbir bilgisayarın erişiminin ötesinde olmasına dayanır.
RSA gerçekte ne hesaplar

İki asal ve bir kapı. Bir RSA anahtarı iki büyük rastgele asal p ve q ile başlar; çarpımları n (modül, dolayısıyla "2048 bitlik anahtar") bir e üssüyle (neredeyse her zaman 65537) birlikte genel anahtarda yayımlanır. Özel anahtar, e'nin modüler tersi olan d çiftidir — p ve q'dan hesaplanır — ayrıca özel anahtar işlemlerini 4× hızlandıran, asallardan türetilen kısayollarla birlikte.

Şifreleme ve imzalama aynı üstel işlemdir. Bir ileti bloğu m'yi şifrelemek me mod n hesaplamaktır; şifre çözmek cd mod n'dir. Önceden biçimlendirilmiş bir bloğu özel üsle imzalamak ve genel üsle doğrulamak, diğer yönde aynı işlemdir. Bu sayfadaki diğer her şey — OAEP, PSS, PKCS#1 — o bloğu güvenli biçimde biçimlendirmekle ilgilidir, böylece ham üs alma hiçbir zaman açığa çıkmaz.

Neden yavaştır. 2048 bitlik bir anahtarla bir RSA işlemi, bir bloğu AES ile şifrelemeye kıyasla kabaca bir milyon kat daha fazla CPU harcar. TLS'nin RSA'yı (ya da ECC'yi) yalnızca rastgele bir AES anahtarı üzerinde anlaşmak için kullanıp sonra değiştirmesinin nedeni budur. Oluşturduğunuz her şey için aynı kural geçerlidir: anahtar için RSA, veri için AES.

Anahtar boyutu. Modül uzunluğu güvenlik kadranıdır: 1024 bit politika gereği kırılmıştır (çarpanlarına ayırma devletlerin erişimine yakındır), 2048 bit ≈ 112 bit simetrik güç, 3072 bit ≈ 128 bit, 15360 bit ise 256 bitlik bir simetrik anahtara denk gelir. Kuantum notu: Shor’un algoritması büyük bir kuantum bilgisayarda RSA'yı tamamen kırar — anahtar ömürlerini sonlu tutmak için bir neden daha.

OAEP: kullanmanız gereken tek şifreleme dolgusu

Ham RSA'nın sorunu. Ders kitabı RSA'sı (ham ileti üzerinde me mod n) belirleyicidir ve değiştirilebilirdir: aynı iletiler aynı şekilde şifrelenir, bir saldırgan bir şifreli metni 2'nin şifrelemesiyle çarparak düz metni iki katına çıkarabilir ve kısa iletiler ortadan buluşma saldırısına düşer. Doğrudan asla kullanılmamalıdır.

OAEP ne yapar. OAEP (PKCS#1 v2, RFC 8017), üslemeden önce iletiyi karma tabanlı bir Feistel ağı üzerinden rastgele bir tohumla karıştırır. Sonuç: şifreleme rastgeledir (aynı düz metin her seferinde farklı bir şifreli metin verir — OAEP Örneğini iki kez çalıştırıp karşılaştırın), şifre çözmede kurcalama tespit edilir ve ileti karma için yer bırakarak modül içine sığmalıdır — yukarıda tablolanan k−2·hashLen−2 sınırı.

Etiket. Dolguya bağlanan isteğe bağlı bir genel dizgi. Her iki taraf da aynı etiketi sağlamalıdır, yoksa şifre çözme başarısız olur — AES-GCM'deki AAD gibi, şifreli metni bir bağlama (bir dosya adı, bir algoritma kimliği) bağlamanızı sağlar. Boş olması normaldir.

PKCS#1 v1.5 şifrelemesi bilerek yoktur. 1993 dönemi dolgusunda bütünlük yoktur ve şifre çözme hata davranışı yoluyla bilgi sızdırır (Bleichenbacher’in 1998 saldırısı, birkaç milyon özel hazırlanmış şifreli metinle bir dolgu oracle’ını tam şifre çözmeye dönüştürür; ROBOT olarak 2017’de hâlâ gerçek sistemleri kırıyordu). WebCrypto bunu uygulamayı reddeder; bu sayfa da uygulamaz.

PSS ile PKCS#1 v1.5 imzaları

İmzalamak = karmala, sonra doldur, sonra üsle. Her iki şema da iletiyi karmalar (burada SHA-256/384/512), özeti bir bloğa biçimlendirir ve özel üssü uygular. Doğrulama, bloğu genel anahtarla yeniden biçimlendirir ve karşılaştırır. Fark biçimlendirmededir:

ŞemaBlok içeriğiÖzellikler
RSASSA-PKCS1-v1_5özet + özet-bilgi başlığı, belirleyiciAynı iletinin her imzası bayt bayt aynıdır (öz-testi kontrol edin: v1.5 vektörü sabittir). Evrensel eski destek: X.509 sertifikaları, JWT RS*, 1.3 öncesi TLS. Doğrulama doğru uygulandığında bilinen bir sahtecilik yoktur.
RSA-PSSözet + karma uzunluğunda rastgele tuz, MGF1 maskelemeRastgele — her imza farklıdır. Rastgele-oracle modelinde kanıtlanabilir güvenli; gelecekteki TLS 1.3 sertifikalarında ve daha yeni protokollerde gerekli. Doğrulayıcı tuz uzunluğunu bilmelidir (bu sayfa karma uzunluğunu kullanır, yaygın varsayılan).

Hangisini seçmeli. Yeni tasarımlar: PSS. Mevcut sertifikalar, JWT’ler (RS256) ya da eski eşlerle birlikte çalışma: v1.5. İkisi de imza şemaları olarak güvenlidir — v1.5 felaket hikâyesi *şifreleme* dolgusuyla ilgilidir, benzer adına rağmen farklı bir yapıdır.

PKCS#1, PKCS#8 ve SPKI: aynı anahtarın neden dört PEM’i var

PEM sadece base64 ile sarılmış DER’dir. Bir PEM dosyası bir etiket ile bir DER (ikili ASN.1) yapısının base64’üdür. Etiket hangi yapı olduğunu söyler — ve bu, bu sayfanın ürettiği dört biçim arasındaki farkın tamamıdır:

PEM etiketiDER yapısıİçerir
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo (SPKI)Algoritma OID'si + genel anahtar (n, e). Her yerde varsayılan "genel anahtar".
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKeyÇıplak (n, e). Eski OpenSSL ve bazı gömülü yığınlar.
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoAlgoritma OID'si + özel anahtar. Algoritmadan bağımsız kapsayıcı, modern varsayılan.
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn, e, d, p, q, …. Klasik OpenSSL genrsa çıktısı.

Aynı anahtar, farklı sargılar. Üret’ten sonra yukarıdaki dört kutunun hepsi aynı anahtar çiftini tutar — SPKI ve PKCS#1 genel anahtarları aynı n, e değerlerini içerir; PKCS#8 ve PKCS#1 özel anahtarları aynı özel değerleri içerir. Bu sayfa bunlar arasında tarayıcıda kayıpsız dönüştürür (öz-testi dönüşümleri gidip gelerek doğrular). Biçimleri karıştırmak, araçlar arasında anahtar yapıştırırken "geçersiz anahtar" hatalarının en yaygın tek nedenidir.

Şifrelenmiş PEM’ler (-----BEGIN ENCRYPTED PRIVATE KEY-----), parola tabanlı şifreleme katmanı olan PKCS#8’dir. Bu sayfa bunları kabul etmez — önce çevrimdışı çözün (openssl pkcs8 -in enc.pem -out plain.pem).

Yaygın hatalar
  • RSA ile toplu veri şifrelemek. Katı OAEP boyut sınırının ötesinde, son derece yavaştır. Örüntü şudur: rastgele bir AES anahtarı üret, AES anahtarını RSA-OAEP ile şifrele, veriyi AES-GCM ile şifrele, iki parçayı da gönder.
  • "Bu bir test" diye özel anahtarı paylaşmak. Bu sayfanın vektörlerine gömülü örnek anahtarlar bilerek yayımlanmıştır — yalnızca test verilerini imzalayabilirler. Sizin anahtarlarınız böyle değildir.
  • Özel anahtarla doğrulamak. Genellikle matematiksel olarak "çalışır" ve bazı araçlar buna izin verir, ancak doğrulayıcılara özel anahtar dağıtmak tüm modeli bozar. Genel anahtarla doğrulayın (bu sayfa bunu zorunlu kılar).
  • Kodu kontrol etmek için imzaları bayt bayt karşılaştırmak. PSS (ve OAEP) rastgeledir: iki doğru çalıştırma farklı çıktılar üretir. Eşitlikle değil, doğrulayarak karşılaştırın — yalnızca v1.5 imzaları belirleyicidir.
  • "Daha hızlı oldukları için" 1024 bitlik anahtarlar. Ayrıca iyi kaynaklı çarpanlara ayırmanın erişimi içindedirler. Hız argümanı hibrit şifrelemeyle öldü: RSA oturum başına bir kez çalışır, bayt başına değil.
  • PSS için karma uzunluğundan farklı bir salt uzunluğunu sabit kodlamak. Doğrulayıcının da kabul etmesi gerekir; karma uzunluğu (bu sayfanın seçimi ve OpenSSL'in -sigopt rsa_pss_saltlen:32'si) birlikte çalışabilir varsayılandır.
SSS

Şifre çözme neden "yanlış anahtar, yanlış karma ya da bozuk şifreli metin" hatasıyla başarısız oldu? OAEP şifre çözme şu durumlardan herhangi birinde başarısız olur: eşleşen özel anahtar değilse, karma şifreleme tarafından farklıysa, etiket farklıysa ya da bir şifreli metin baytı değiştiyse. Hata kasıtlı olarak tüm durumlar için aynıdır — hangi denetimin başarısız olduğunu açıklamak, kendi başına bir dolgu oracle sızıntısıdır.

Özel anahtardan genel anahtarı alabilir miyim? Evet — özel biçimler de n ve e içerir. Bu sayfa Üret'ten sonra ikisini de gösterir; OpenSSL bunu openssl pkey -in priv.pem -pubout ile yapar.

Üs olarak neden 65537? Asaldır, yalnızca iki 1 biti vardır (hızlı üs alma) ve e=3'ü vuran düşük üs saldırılarından kaçınacak kadar büyüktür. 1990'lardan beri standart seçimdir; "tuhaf" bir üs genellikle zayıf ya da standart dışı bir anahtar anlamına gelir.

Kuantum bilgisayarlar yüzünden RSA öldü mü? Henüz değil — 2048 bitlik bir modülde Shor’un algoritmasını çalıştırabilecek bir makine yok. Ancak 2030'lara kadar gizli kalması gereken veriler şimdiden taşınıyor; PQC hibrit şemaları mühendislik yanıtıdır.

openssl rsautl ne olacak? pkeyutl'ın kullanımdan kaldırılmış atasıdır. Varsayılan olarak v1.5 şifreleme dolgusunu kullanır — emekliye ayrılmasının bir nedeni daha.