Ortak anahtar oluşturmak için RSA özel anahtarı kullanılsın mı?


394

Bunu gerçekten anlamıyorum:

şuna göre: http://www.madboa.com/geek/openssl/#key-rsa , Özel bir anahtardan ortak bir anahtar oluşturabilirsiniz.

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

İlk düşüncem, bir çiftte birlikte üretilmeleriydi. RSA özel anahtarı toplamı içeriyor mu? veya ortak anahtar?


1
Rsa ve openssl kullanan ve 5 Kbyte gibi büyük bir dosyayı şifrelemek isteyen herkese. genel anahtarın şifrelemek istediğiniz şeyle orantılı veya daha büyük olması gerektiğini unutmayın, aksi takdirde bir "şifrelenecek hata büyük dosya" alırsınız. Oldukça büyük ve ciddi bir özel anahtar oluşturduğunuzu ve bununla birlikte özel anahtarlarınızı oluşturduğunuzu özetliyoruz, böylece çalışmak için çok fazla veriniz var. Ben kusur hakkında openssl kime biliyorum ve onlar sadece kendi üzerine döngü yapmak gerektiğini söyledi, aksi takdirde neden boyutu hakkında şikayet anlamaya çok zaman kullanacak.
Kent Hansen

10
Kent Hansen'in açıkladığı sorun, RSA'yı doğrudan düz metin verilerinde kullanmasıdır, bu da hiçbir zaman güvenlik nedeniyle yapılmamalıdır. Bunun yerine, RSA-KEM ( tools.ietf.org/html/rfc5990#appendix-A ) gibi iyi analiz edilmiş bir hibrit şifreleme şemasını kullanın ve verilere şifreleme-ve-HMAC gibi kimliği doğrulanmış bir simetrik şifreleme şeması kullanın.
Daira Hopwood

Bu yardımcı olabilir: jason4zhu.blogspot.jp/2014/10/...
Judking


@ SteffenUllrich'in bu linkteki cevabı nedenini açıklıyor: security.stackexchange.com/questions/172274/…
bearzyj

Yanıtlar:


577
openssl genrsa -out mykey.pem 1024

aslında bir kamu - özel anahtar çifti üretecektir. Çift oluşturulan mykey.pemdosyada saklanır .

openssl rsa -in mykey.pem -pubout > mykey.pub

açık anahtarı çıkarır ve yazdırır. İşte bunu daha iyi açıklayan bir sayfaya bağlantı.

EDIT: Buradaki örnekler bölümüne bakın . Özel bir anahtarın herkese açık kısmını çıkarmak için:

openssl rsa -in key.pem -pubout -out pubkey.pem

SSH amaçları için kullanılabilir bir ortak anahtar almak için ssh-keygen kullanın :

ssh-keygen -y -f key.pem > key.pub

50
her yerdeki öğreticilerdeki herkesin openssl genrsa komutunu kullanarak ÖZEL ANAHTARI oluşturacağınızı nasıl söylediği kafa karıştırıcıdır, çünkü onlar da KAMU ANAHTARINI ürettiğini unutuyorlar
Jaime Hablutzel 16:12

15
@jaime onları gerçekten suçlayabilir misin? Resmi belgeler, açık anahtar hakkında kesinlikle hiçbir şey söylemez. "AÇIKLAMA: genrsa komutu bir RSA özel anahtarı oluşturur." openssl.org/docs/apps/genrsa.html
Despertar

124
@jaime, Çünkü değil - genrsa sadece özel anahtarı oluşturur, ortak anahtar depolanmaz. Ancak özel anahtarınız varsa, ortak anahtarı ondan hesaplayabilir (türetebilirsiniz) - bu yukarıdaki 2. komutun yaptığı şeydir. Açık anahtarı değil, anahtarları hesaplar.
steveayre

13
@steveayre RSA anahtarlarının sadece iki üs ( eve dortak literatürde) olduğu benim anlayışımdı . İkisi de matematiksel olarak özel veya herkese açık değildir, bunlar oluşturulduklarında keyfi olarak atanan etiketlerdir. Tersine kolayca atanabilirler. Birini diğerinden üretmek, eşdeğer bir sorundur. .pemBiçimi de dahil olmak üzere bilgi bir sürü içerir hem üstler ve her iki tuşları böylece, doğru mu?
lynks

13
@steveayre çoğunlukla yanlış. Genel RSA anahtarı bileşenleri (n, e) DO ile oluşturulur ve openssl genrsakomutla oluşturulan özel RSA anahtar dosyasına gömülür . Yine de aynı adımda ayrı bir ortak anahtar dosyası oluşturulmaz. Ortak anahtarı özel anahtar dosyasından ayrı bir ortak anahtar dosyasına ayıklamak için openssl rsa -in private.pem -pubout -out public.pemkomutunuzu kullanırsınız . Bu şekilde bir ortak anahtar ürettiğinizde, hesaplanmayan özel anahtar dosyasından çıkarılır. Daha fazla ayrıntı için aşağıdaki cevabıma bakın.
golem

273

SSH ortak anahtarını arayanlar ...

Açık anahtarı OpenSSH ile kullanmak için ayıklamak istiyorsanız, açık anahtarı biraz farklı almanız gerekir

$ ssh-keygen -y -f mykey.pem > mykey.pub

Bu ortak anahtar biçimi OpenSSH ile uyumludur. Açık anahtarı ekleyin ve remote:~/.ssh/authorized_keysgitmeye hazır olun


dokümanlar SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y Bu seçenek özel bir OpenSSH biçimindeki dosyayı okur ve stdout'a bir OpenSSH ortak anahtarı yazdırır.


3
Bu bir cazibe gibi çalışıyor! Github'ın aldığı bir format oluşturur! Github, PEM openssl rsa -in key.pem -pubout -out pubkey.pemformatını almaz.Önerilen cevap , bunun çıktısının bir pem formatı ortak anahtarı olduğu kabul edilmedi. Bu hatayı aldım: "Anahtar geçersiz. 'Ssh-rsa' veya 'ssh-dss' ile başlamalıdır. Anahtarın ortak yarısını kopyaladığınızdan emin olun". Ancak ssh-keygen -y [-f input_keyfile] Github'un aldığı doğru formatı üretir.
Devy

71

Openssl'ler de dahil olmak üzere RSA özel anahtarları üreten çoğu yazılımda, özel anahtar bir PKCS # 1 RSAPrivatekey nesnesi veya bunların bir varyantı olarak temsil edilir:

A.1.2 RSA özel anahtar sözdizimi

Bir RSA özel anahtarı ASN.1 tipi
RSAPrivateKey ile temsil edilmelidir :

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

Gördüğünüz gibi, bu format, modül ve genel üs dahil olmak üzere bir dizi alana sahiptir ve bu nedenle bir RSA genel anahtarındaki bilgilerin katı bir üst kümesidir .


Özel bir anahtar verildiğinde, açık anahtarı oluşturmak için matematiksel olarak mümkün olduğu anlamına mı geliyor? RSA'nın gücü, diğeri göz önüne alındığında bir anahtarı üretmenin hesaplanabilir olmasının mümkün olmadığı gerçeği değil mi?
Raam

30
@Raam: Hayır, RSA'nın gücü, özel anahtarı halktan üretmenin mümkün olmamasıdır. Özel olan kamu formunu oluşturmak önemsizdir.
Başkan James K. Polk

@GregS, Neden? Anahtar, bir modül ve bir üsten oluşur. Diğer üs bu iki sayıdan hesaplanabilirse RSA kolayca kırılır. Öyleyse OpenSSL özel anahtarı üs ve modülten fazlasını içeriyor mu?
Calmarius

1
@Calmarius: Bir anahtarın bir modül ve üsten oluştuğunu kim söylüyor? Bu en az özel anahtar olur, ancak genellikle özel anahtar asal faktörler gibi diğer bileşenleri içerir. Ayrıntılar için cevabı okuyun.
Başkan James K. Polk

1
@JamesKPolk Bu mutlaka doğru değildir. Eğer halka üs (özel üs ile aynı özelliklere sahiptir) büyük olduğu daha sonra genel anahtar olabilir yeniden imkansız. Çoğu kütüphane bunu desteklemeyecektir, ancak RSA şifreleme sistemi kesinlikle ortak anahtarı özel anahtardan yeniden yapılandırmanızı gerektirmez.
Maarten Bodewes

34

Aşağıdaki cevabım biraz uzun, ancak umarım önceki cevaplarda eksik olan bazı ayrıntıları sağlar. İlgili bazı ifadelerle başlayacağım ve sonunda ilk soruyu cevaplayacağım.

RSA algoritmasını kullanarak bir şeyi şifrelemek için modül ve şifreleme (genel) üs çiftine (n, e) ihtiyacınız vardır. Bu sizin genel anahtarınız. RSA algoritmasını kullanarak bir şeyin şifresini çözmek için modül ve şifre çözme (özel) üs çiftine (n, d) ihtiyacınız vardır. Bu senin özel anahtarın.

RSA genel anahtarını kullanarak bir şeyi şifrelemek için düz metninizi sayı olarak ele alırsınız ve e modülünün gücüne yükseltirsiniz:

ciphertext = ( plaintext^e ) mod n

RSA özel anahtarını kullanarak bir şeyin şifresini çözmek için şifre metninize sayı olarak davranır ve d modülünün gücüne yükseltirsiniz:

plaintext = ( ciphertext^d ) mod n

Openssl kullanarak özel (d, n) anahtar oluşturmak için aşağıdaki komutu kullanabilirsiniz:

openssl genrsa -out private.pem 1024

Openssl kullanarak özel anahtardan genel (e, n) anahtar oluşturmak için aşağıdaki komutu kullanabilirsiniz:

openssl rsa -in private.pem -out public.pem -pubout

Yukarıdaki openssl komutu tarafından oluşturulan private.pem private RSA anahtarının içeriğini incelemek için aşağıdakini çalıştırın (çıktı burada etiketlere kısaltılmıştır):

openssl rsa -in private.pem -text -noout | less

modulus         - n
privateExponent - d
publicExponent  - e
prime1          - p
prime2          - q
exponent1       - d mod (p-1)
exponent2       - d mod (q-1)
coefficient     - (q^-1) mod p

Özel anahtar yalnızca (n, d) çiftinden oluşmamalı mı? Neden 6 ekstra bileşen var? Genel RSA anahtarının private.pem özel RSA anahtarından oluşturulabilmesi / çıkarılabilmesi için e (genel üs) içerir. Geri kalan 5 bileşen, şifre çözme işlemini hızlandırmak için vardır. Bu 5 değeri önceden hesaplayıp saklayarak, RSA şifre çözmeyi 4 katına kadar hızlandırmak mümkün. Hızlandırma algoritması, Çin Kalan Teoremine .

Evet, private.pem RSA özel anahtarı aslında bu 8 değerin tümünü içerir; önceki komutu çalıştırdığınızda bunların hiçbiri anında oluşturulmaz. Aşağıdaki komutları çalıştırmayı deneyin ve çıktıyı karşılaştırın:

# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der

# Print private.der private key contents as binary stream
xxd -p private.der

# Now compare the output of the above command with output 
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less

RSA özel anahtarının bu yapısı, alternatif ( ikinci ) bir gösterim olarak PKCS # 1 v1.5 tarafından önerilir . PKCS # 1 v2.0 standardı, e ve d üslerini alternatif gösterimden tamamen hariç tutar. PKCS # 1 v2.1 ve v2.2 , isteğe bağlı olarak daha fazla CRT ile ilgili bileşen ekleyerek alternatif sunumda başka değişiklikler önermektedir.

Public.pem public RSA anahtarının içeriğini görmek için aşağıdakileri çalıştırın (çıktı burada etiketlere kısaltılmıştır):

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

Burada sürpriz yok. Söz verdiğim gibi (n, e) çifti.

Şimdi nihayet ilk soruyu cevaplıyor: Yukarıda gösterildiği gibi, openssl kullanılarak oluşturulan özel RSA anahtarı hem genel hem de özel anahtarların bileşenlerini ve daha fazlasını içerir. Özel anahtardan ortak anahtar oluşturduğunuzda / ayıkladığınız / türettiğinizde, bu bileşenlerden ikisini (e, n) ortak anahtarınız olan ayrı bir dosyaya kopyalar.


"Özel anahtardan genel (d, n) anahtar oluşturmak için ..." yazdınız. "(E, n)" olmamalı mı? Yine de harika cevap için teşekkürler!
elactic

V1.5'teki (dış) 'sözdizimini' sonraki sürümlerde semantikle karşılaştırıyorsunuz; 2.0 # 11.1.2 ve 2.1 ve 2.2 # A.1.2'yi kontrol edin ve n, e, d'nin hala mevcut olduğunu göreceksiniz. (James Polk'un cevabının daha önce belirttiği gibi.)
dave_thompson_085

1
inanılmaz bir açıklama. Teşekkürler
Francisco Albert

1
Kamu üssü eher zaman 65537 gibi görünüyor 0x010001. Muhtemelen kamu üssünü seçmek için bir kusurludur ve bu muhtemelen man sayfasında ve hemen hemen her yerde genrsaolarak açıklanmaktadır to generate the private key. Kamusal olan çok açık.
şampuan

(N, e) 'yi yalnızca (n, d)' den hesaplayabilir miyim ?
Flyq

21

Bazı kişilerin düşündüğü gibi Açık Anahtar PEM dosyasında saklanmaz. Özel Anahtar Dosyasında aşağıdaki DER yapısı bulunur:

openssl rsa -text -in mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

Genel Anahtarı (modül ve genel üs) hesaplamak için yeterli veri openssl rsa -in mykey.pem -puboutvar.


Ortak anahtarın orada saklanmadığını görüyorum, özel anahtar gibi türetilebilir, ancak özel anahtarın orada da saklandığını görmüyorum ?! henüz pem dosyasını kedi i özel anahtar ve bazı ascii diyor görüyorum.
barlop

2
Özel anahtar da türetilir, privateExponent alanına bakın. Mykey.pem
Uxio

2
Ortak anahtar aslında pem'de depolanır, çünkü pem ayrıca e ve d'yi, yani ortak anahtarı içerir. Ayrık günlük algoslarından farklı olarak, rsa ortak anahtarı yalnızca özel anahtardan (d, n) hesaplanamaz. Sadece rsa özellikleri onu özel anahtar ve diğer bilgilerle sakladığını belirttiği için var.
Michael Chourdakis

1
Evet, bu cevap tüm niyet ve amaçlarla YANLIŞ . Hem kamu üssü hem de modül oradadır, bu yüzden açık anahtar kesinlikle mevcuttur. Oradaki genel üsse herhangi bir hesaplama yapmadan genel anahtarı kolayca almaktan başka bir gerek yoktur .
Maarten Bodewes

1
@MaartenBodewes: Cevap doğru. Alıntılanan bir PRIVATE anahtarı için saklanan değerler olarak ilgili RFC'den alınır. Değerlerden ikisinin de / yalnızca ortak anahtar şifrelemesi için kullanılması, bunun özel anahtar verileri olduğunu değiştirmez. Bütün bu şeyleri son iki gün boyunca, soru sorarak değil, ilgili standarda bakarak ve okuyarak öğrendim. Şimdi ASN.1, DER, PEM ve RSA (RSA hakkında TÜM değil) hakkında her şeyi anlıyorum.
AlastairG

8

burada bu kodda önce özel olan RSA anahtarını oluşturuyoruz, ancak ortak anahtarının bir çiftine sahip, bu yüzden gerçek ortak anahtarınızı almak için sadece bunu yapıyoruz

openssl rsa -in mykey.pem -pubout > mykey.pub

daha fazla bilgi için olsun umarım bunu kontrol et


6

Öncelikle RSA anahtar üretimi hakkında hızlı bir özet.

  1. Rastgele uygun büyüklükte iki rastgele olası primer seçin (p ve q).
  2. (N) modülünü üretmek için iki primeri birlikte çarpın.
  3. Genel bir üs seçin (e).
  4. Özel üs (d) üretmek için asal ve kamu üssü ile biraz matematik yapın.

Ortak anahtar, modül ve genel üsten oluşur.

Minimal bir özel anahtar, modül ve özel üsten oluşur. Bilinen bir modül ve özel üsten ilgili kamu üssüne gitmek için hesaplamaya uygun bir kesin yol yoktur.

Ancak:

  1. Pratik özel anahtar biçimleri neredeyse her zaman n ve d'den fazlasını depolar.
  2. e normalde rastgele seçilmez, iyi bilinen bir avuç değerden biri kullanılır. Eğer e iyi bilinen değerlerden biriyse ve d'yi biliyorsanız, e'yi deneme yanılma yoluyla bulmak kolay olurdu.

Bu nedenle, çoğu pratik RSA uygulamasında ortak anahtarı özel anahtardan alabilirsiniz. Bunun mümkün olmadığı yerlerde RSA tabanlı bir şifreleme sistemi oluşturmak mümkün olurdu, ancak yapılan şey bu değildir.


1
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.

1
Bu aptalca; İstediğiniz tek şey bir anahtar çifti olduğunda işe yaramaz bir sertifika oluşturmak için fazladan çaba sarf etmeye gerek yoktur. Bir sertifika istediğiniz başka bir Q için bu bir cevap olabilir.
dave_thompson_085
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.