İki genel anahtar biçimi stili arasında nasıl dönüşüm yapabilirim: biri "BEGIN RSA PUBLIC KEY", diğeri "BEGIN PUBLIC KEY"


99

Açık anahtar biçiminin iki stili arasında nasıl dönüşüm yapabilirim, bir biçim şudur:

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

diğer biçim:

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

örneğin ssh-keygen komutunu kullanarak id_rsa / id_rsa.pub çifti oluşturdum, id_rsa'dan genel anahtarı şu şekilde hesapladım:

openssl rsa -in id_rsa -pubout -out pub2 

sonra tekrar id_rsa.pub'daki genel anahtarı şu şekilde hesapladım:

ssh-keygen -f id_rsa.pub -e -m pem > pub1

içerik pub1:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

ve pub2'nin içeriği:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----

Anladığıma göre, pub1 ve pub2 aynı genel anahtar bilgilerini içeriyor, ancak bunlar farklı formatta, iki format arasında nasıl dönüşüm yapabilirim? Biri bana çekme formatları hakkında kısa bir giriş gösterebilir mi?


Stack Overflow, programlama ve geliştirme soruları için bir sitedir. Bu soru, programlama veya geliştirmeyle ilgili olmadığı için konu dışı gibi görünüyor. Burada , Yardım Merkezinde hangi konular hakkında sorabilirim konusuna bakın . Belki Süper Kullanıcı veya Unix ve Linux Yığın Değişimi sormak için daha iyi bir yer olabilir.
jww

Yanıtlar:


12

Saf bir PHP RSA uygulaması olan phpseclib kullanarak ...

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----');
$rsa->setPublicKey();

echo $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW);

Başlıkta BEGIN PUBLIC KEY yazıp BEGIN RSA PUBLIC KEY yazmasına rağmen, base64 kodlu öğeler eşleşiyor gibi görünüyor. Yani belki bunu düzeltmek için str_replace kullanın ve gitmekte fayda var!


314

Burada neler olduğunu açıklamaya yardım etmek istedim.

RSA "Genel Anahtar" iki sayıdan oluşur:

  • modül (örn. 2,048 bitlik bir sayı)
  • üs (genellikle 65,537)

RSA genel anahtarınızı örnek olarak kullanırsak, iki rakam:

  • Modül : 297,056,429,939,040,947,991,047,334,197,581,225,628,107,021,573,849,359,042,679,698,093,131,908, 015,712,695,688,944,173,317,630,555,849,768,647,118,986,535,684,992,447,654,339,728,777,985,990,170, 679,511,111,819,558,063,246,667,855,023,730,127,805,401,069,042,322,764,200,545,883,378,826,983,730, 553.730.138.478.384.327.116.513.143.842.816.383.440.639.376.515.039.682.874.046.227.217.032.079.079.790.098.143.158.087.443.017.552.531.393.264.852.461.292.775.129.262.080.851.633.535.934.010.704.122.673.027.067.442.627.059.982.393.297.716.922.243.940.155.855.127.430.302.323.883.824.137.412.883.916.794.359.982.603.439.112.095.116.831.297.809.626.059.569.444.750.808.699.678.211.904.501.083.183.234.323.797.142.810.155.862.553.705.570.600.021.649.944.369.726.123.996.534.870.137.000.784.980.673.984.909.570.977.377.882.585.701
  • Üs : 65.537

O zaman soru, bu sayıları bir bilgisayarda nasıl saklamak istediğimizdir. İlk önce ikisini de onaltılık tabana çeviriyoruz:

  • Modülü : EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
  • Üs : 010001

RSA ilk formatı icat etti

RSA önce bir format icat etti:

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

İki sayıyı [1] temsil etmek için ASN.1 ikili kodlama standardının DER çeşidini kullanmayı seçtiler :

SEQUENCE (2 elements)
   INTEGER (2048 bit): EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
   INTEGER (24 bit): 010001

ASN.1'deki son ikili kodlama şudur:

30 82 01 0A      ;sequence (0x10A bytes long)
   02 82 01 01   ;integer (0x101 bytes long)
      00 EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
   02 03         ;integer (3 bytes long)
      010001

Daha sonra tüm bu baytları birlikte çalıştırır ve Base64 kodlarsanız, şunları elde edersiniz:

MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB

RSA laboratuvarları daha sonra bir başlık ve fragman eklediğini söyledi:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

Beş tire ve kelimeler BEGIN RSA PUBLIC KEY. Bu sizin PEM DER ASN.1 PKCS # 1 RSA Genel anahtarınızdır

  • PEM: base64 ile eşanlamlı
  • DER: ASN.1 kodlamasının bir çeşidi
  • ASN.1: kullanılan ikili kodlama şeması
  • PKCS # 1: Bir genel anahtarı, bir katsayı ve onu takip eden bir
  • RSA genel anahtarı: kullanılan genel anahtar algoritması

Sadece RSA değil

Bundan sonra, diğer açık anahtar şifreleme biçimleri ortaya çıktı:

  • Diffie-Hellman
  • Eliptik Eğri

Bu şifreleme algoritmalarının parametrelerinin nasıl temsil edileceğine dair bir standart oluşturma zamanı geldiğinde , insanlar RSA'nın başlangıçta tanımladığı fikirlerin çoğunu benimsedi:

  • ASN.1 ikili kodlamayı kullan
  • base64 it
  • beş kısa çizgiyle sarın
  • ve kelimeler BEGIN PUBLIC KEY

Ancak kullanmak yerine:

  • -----BEGIN RSA PUBLIC KEY-----
  • -----BEGIN DH PUBLIC KEY-----
  • -----BEGIN EC PUBLIC KEY-----

Bunun yerine, takip edilecek şeyin Nesne Tanımlayıcısını (OID) eklemeye karar verdiler. RSA genel anahtarı olması durumunda, yani:

  • RSA PKCS # 1 :1.2.840.113549.1.1.1

Dolayısıyla, RSA genel anahtarı için esasen:

public struct RSAPublicKey {
   INTEGER modulus,
   INTEGER publicExponent 
}

Şimdi , temelde şu olan SubjectPublicKeyInfo'yu oluşturdular :

public struct SubjectPublicKeyInfo {
   AlgorithmIdentifier algorithm,
   RSAPublicKey subjectPublicKey
}

Gerçek DER ASN.1 tanımında:

SubjectPublicKeyInfo  ::=  SEQUENCE  {
    algorithm  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER, -- 1.2.840.113549.1.1.1 rsaEncryption (PKCS#1 1)
        parameters              ANY DEFINED BY algorithm OPTIONAL  },
    subjectPublicKey     BIT STRING {
        RSAPublicKey ::= SEQUENCE {
            modulus            INTEGER,    -- n
            publicExponent     INTEGER     -- e
        }
}

Bu size bir ASN.1 verir:

SEQUENCE (2 elements)
   SEQUENCE (2 elements)
      OBJECT IDENTIFIER 1.2.840.113549.1.1.1
      NULL
   BIT STRING (1 element)
      SEQUENCE (2 elements)
         INTEGER (2048 bit): EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
         INTEGER (24 bit): 010001

ASN.1'deki son ikili kodlama şudur:

30 82 01 22          ;SEQUENCE (0x122 bytes = 290 bytes)
|  30 0D             ;SEQUENCE (0x0d bytes = 13 bytes) 
|  |  06 09          ;OBJECT IDENTIFIER (0x09 = 9 bytes)
|  |  2A 86 48 86   
|  |  F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1
|  |  05 00          ;NULL (0 bytes)
|  03 82 01 0F 00    ;BIT STRING  (0x10f = 271 bytes)
|  |  30 82 01 0A       ;SEQUENCE (0x10a = 266 bytes)
|  |  |  02 82 01 01    ;INTEGER  (0x101 = 257 bytes)
|  |  |  |  00             ;leading zero of INTEGER
|  |  |  |  EB 50 63 99 F5 C6 12 F5  A6 7A 09 C1 19 2B 92 FA 
|  |  |  |  B5 3D B2 85 20 D8 59 CE  0E F6 B7 D8 3D 40 AA 1C 
|  |  |  |  1D CE 2C 07 20 D1 5A 0F  53 15 95 CA D8 1B A5 D1 
|  |  |  |  29 F9 1C C6 76 97 19 F1  43 58 72 C4 BC D0 52 11 
|  |  |  |  50 A0 26 3B 47 00 66 48  9B 91 8B FC A0 3C E8 A0
|  |  |  |  E9 FC 2C 03 14 C4 B0 96  EA 30 71 7C 03 C2 8C A2  
|  |  |  |  9E 67 8E 63 D7 8A CA 1E  9A 63 BD B1 26 1E E7 A0  
|  |  |  |  B0 41 AB 53 74 6D 68 B5  7B 68 BE F3 7B 71 38 28
|  |  |  |  38 C9 5D A8 55 78 41 A3  CA 58 10 9F 0B 4F 77 A5
|  |  |  |  E9 29 B1 A2 5D C2 D6 81  4C 55 DC 0F 81 CD 2F 4E 
|  |  |  |  5D B9 5E E7 0C 70 6F C0  2C 4F CA 35 8E A9 A8 2D 
|  |  |  |  80 43 A4 76 11 19 55 80  F8 94 58 E3 DA B5 59 2D
|  |  |  |  EF E0 6C DE 1E 51 6A 6C  61 ED 78 C1 39 77 AE 96 
|  |  |  |  60 A9 19 2C A7 5C D7 29  67 FD 3A FA FA 1F 1A 2F 
|  |  |  |  F6 32 5A 50 64 D8 47 02  8F 1E 6B 23 29 E8 57 2F 
|  |  |  |  36 E7 08 A5 49 DD A3 55  FC 74 A3 2F DD 8D BA 65
|  |  |  02 03          ;INTEGER (03 = 3 bytes)
|  |  |  |  010001

Ve daha önce olduğu gibi, tüm bu baytları alırsınız, Base64 onları kodlar ve sonunda ikinci örneğiniz olur:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB   

Biraz farklı başlık ve fragmanı ekleyin ve şunları elde edin:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB   
-----END PUBLIC KEY-----

Ve bu sizin X.509 SubjectPublicKeyInfo / OpenSSL PEM genel anahtarınızdır [2] .

Doğru yapın ya da hackleyin

Artık kodlamanın sihirli olmadığını bildiğinize göre, RSA modülünü ve üssünü ayrıştırmak için gereken tüm parçaları yazabilirsiniz. Veya ilk 24 baytın orijinal PKCS # 1 standardının üzerine yeni şeyler eklendiğini fark edebilirsiniz.

30 82 01 22          ;SEQUENCE (0x122 bytes = 290 bytes)
|  30 0D             ;SEQUENCE (0x0d bytes = 13 bytes) 
|  |  06 09          ;OBJECT IDENTIFIER (0x09 = 9 bytes)
|  |  2A 86 48 86   
|  |  F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1
|  |  05 00          ;NULL (0 bytes)
|  03 82 01 0F 00    ;BIT STRING  (0x10f = 271 bytes)
|  |  ...

Bu ilk 24 bayt "yeni" şeyler eklendi:

30 82 01 22 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 82 01 0F 00

Ve olağanüstü bir talih ve iyi şanslar tesadüfü nedeniyle:

24 bayt tam olarak 32 base64 kodlanmış karaktere karşılık gelir

Çünkü Base64'te: 3 bayt dört karakter olur:

30 82 01  22 30 0D  06 09 2A  86 48 86  F7 0D 01  01 01 05  00 03 82  01 0F 00
\______/  \______/  \______/  \______/  \______/  \______/  \______/  \______/
    |         |         |         |         |         |         |         |
  MIIB      IjAN      Bgkq      hkiG      9w0B      AQEF      AAOC      AQ8A

Bu, ikinci X.509 genel anahtarınızı alırsanız, ilk 32 karakterin yalnızca yeni eklenen maddelere karşılık geleceği anlamına gelir:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END PUBLIC KEY-----

İlk 32 karakteri kaldırırsanız ve onu BEGIN RSA PUBLIC KEY olarak değiştirirseniz :

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

Tam olarak istediğiniz şeye sahipsiniz - eski RSA PUBLIC KEYformat.


29
Kutsal toplar, bu bilgilendiriciydi! teşekkür ederim. Bu, sorunumu yalnızca BEGIN RSA PUBLIC KEY bekleyen bir python adamıyla çözdü. Yine de son örneğinizde 32 karakteri silmeyi unutmuşsunuz gibi görünüyor.
NullVoxPopuli

Dosyaların onaltılık yapısını yazdırmak için hangi aracı kullandınız?
Buge

7
@Buge Mükemmel, mükemmel ASN.1 JavaScript kod çözücüyü kullandım . Bu ve TRANSLATOR, BINARY , alet çantanızda bulunan iki mükemmel araçtır.
Ian Boyd

1
Modülüsün başlangıcında fazladan bir "1" karakteri vardır. Böyle başlamalı ... 297,056,429,939,040,947,991,047,334,197,581,225,628,107,02,573 ... ama bu DEĞİL ... 297,056,429,939,040,947,991,047,334,197,581,225,628,107,021,573 ... heksonların dönüşümlerinde öfkelenmelerine yardımcı olmasını umuyorum.
EmpathicSage


52

Bu web sitesini farklı formatların iyi bir teknik açıklaması olarak buldum: https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem

"BEGIN RSA PUBLIC KEY", yalnızca RSA anahtarlarını içerebilen PKCS # 1'dir.

"BEGIN PUBLIC KEY", çeşitli biçimleri içerebilen PKCS # 8'dir.

Bunları sadece komut satırı ile dönüştürmek istiyorsanız, bunun için "openssl rsa" iyidir.

PKCS # 8'den PKCS # 1'e dönüştürmek için:

openssl rsa -pubin -in <filename> -RSAPublicKey_out

PKCS # 1'den PKCS # 8'e dönüştürmek için:

openssl rsa -RSAPublicKey_in -in <filename> -pubout

2
PKCS # 8'de ( RFC 5208 ) genel anahtar hakkında hiçbir şey bulamıyorum .
Franklin Yu

unknown option -RSAPublicKey_in
MacOS'ta

2
@FranklinYu: evet PKCS8 sadece privatekey ve polarssl bu noktada yanlış. Genel yayın formu X.509 ve özellikle Ian Boyd'un (uzun!) Cevabında doğru bir şekilde belirtildiği gibi SubjectPublicKeyInfo türü tarafından tanımlanır; bu bilgi (daha uygun bir şekilde) RFC5280'de ve algoritmaya bağlı olarak diğer RFC'lerde, RFC3279'daki 'temel' RSA ile çoğaltılır.
dave_thompson_085

@nakajuice: OpenSSL 1.0.0 (2010) veya daha yüksek sürümüne ihtiyacınız var. AIUI Apple, OS (X) üzerinde OpenSSL'yi desteklemeyi durdurdu, bu nedenle brew veya benzeri bir versiyona ihtiyacınız olabilir.
dave_thompson_085

Bu beni OpenSSH formatından dönüştürmek için doğru yöne götürdü. Ssh-keygen'i şu şekilde kullandım: ssh-keygen -i -f ~ / .ssh / id_rsa.pub -e -m PKCS8> ~ / .ssh / id_rsa.pub.pem
Bradley Kreider

13

32 bayt başlıklar, OID biçimleri ve benzeri konularla ilgili yukarıdaki yorumlar ilginç olsa da, ben anladığımı varsayarak kişisel olarak aynı davranışı görmüyorum. Bunu, çoğu kişinin aşırı ayrıntı olarak düşündüğü şeyle daha fazla araştırmanın yararlı olabileceğini düşündüm. Hiçbir şey aşırılık kadar aşılmaz.

Başlamak için bir RSA özel anahtarı oluşturdum ve kontrol ettim:

>openssl rsa -in newclient_privatekey.pem  -check
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4pOYWo+GeAEmU4N1HPZj1dxv70
4hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyozC/zSqcuU6iBrvzDTpyG1zhIG
76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknmLBrtZkLkBhchgYnMswIDAQAB
AoGAQaJ5aivspeEXcpahWavzAFLv27+Tz48usUV+stY6arRhqbBEkV19/N5t8EPA
01U6IGDQ8QIXEIW/rtsHKM6DAZhAbakPDJhJRatcMzJ08ryIkP/c3+onkTquiveG
brw7xzn6Xa8ls04aQ6VQR4jxXUjV5bB72pFZnGRoAmS2NiECQQDUoISbmTGjnHM+
kEfunNTXbNmKklwTYhyZaSVsSptnD7CvLWB4qB/g4h2/HjsELag6Z7SlWuYr7tba
H3nBYn35AkEAykFRudMqlBy3XmcGIpjxOD+7huyViPoUpy3ui/Bj3GbqsbEAt9cR
PyOJa1VFa2JqShta1Tdep8LJv1QvgvY7CwJBAML+al5gAXvwEGhB3RXg0fi2JFLG
opZMFbpDCUTkrtu3MeuVC7HbTVDpTSpmSO0uCed2D97NG+USZgsnbnuBHdECQQCw
S3FWPXdetQ0srzaMz61rLzphaDULuZhpBMNqnTYeNmMaUcPjewagd3Rf52rkKFun
juKE+Yd7SXGbYWEskT5zAkAD7tbNwe5ryD2CT71jrY/5uXMR2yg/A4Ry2ocZkQUp
iGflLrHnODvHO5LYLBlSKpjanBceYHJLuMFNZruf7uBM
-----END RSA PRIVATE KEY-----

(Ah, korkunç! Özel bir anahtarı açığa çıkardım. Meh ...)

Genel anahtarını çıkarıp görüntülüyorum:

>openssl rsa -in newclient_privatekey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

Bu durumda başka bir ortak anahtar çıktı parametresi vardır (daha önceki bir yorumda belirtildiği gibi). Bunun yerine bu anahtar kelimeyi kullanarak genel anahtarı çıkarıyorum ve görüntülüyorum

>openssl rsa -in newclient_privatekey.pem -RSAPublicKey_out
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----

Güzel güzel. Bu iki genel anahtar değeri, aynı özel anahtardan türetilse de aynı değildir. Yoksa aynı mı? İki genel anahtar dizesini kesip kendi dosyalarına yapıştırıyorum ve ardından her biri için bir modül kontrolü yapıyorum:

>openssl rsa -in newclient_publickey.pem -pubin -modulus
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

'Pubin' Bu gerçekten RSA söyler edilir bir ortak anahtar olması gerekiyordu ve bir özel anahtar olmadığını şikayet etmeyin.

Şimdi RSA genel anahtarını alıyoruz, modülü görüntülüyoruz ve onu düz bir eski 'genel anahtara' dönüştürüyoruz (yine, girişin bir genel anahtar olduğunu söylemeliyiz):

>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

Aynı modül ve aynı 'genel anahtar' değeri görüntülenir. İşleri daha ilginç hale getirmek için (yine de benim için), RSAPublicKey_out anahtar kelimesini takip ettiğimizde şunu elde ederiz:

>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus -RSAPublicKey_out
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----

... ve düz eski 'genel anahtarı' bir RSA genel anahtarına dönüştürdüğümüzde:

>openssl rsa -in newclient_publickey.pem -pubin -RSAPublicKey_out
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----

... amansız bir şekilde ilerliyoruz ve bunu birkaç komut önce yapmamıza rağmen, şeyleri tersine çevirdiğimiz noktayı belirlemek için, böylece dönüşüm RSA'dan düz eski 'genel anahtara' geçebilir:

>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

... bu da bizi başladığımız yere geri götürüyor. Ne öğrendik?

Özet: Anahtarlar dahili olarak aynıdır, sadece farklı görünürler. Daha önceki bir yorum, RSA anahtar formatının PKCS # 1'de tanımlandığını ve düz eski 'genel anahtar' formatının PKCS # 8'de tanımlandığını belirtti. Ancak, bir formu düzenlemek onu diğerine dönüştürmez. Umarım şimdi bu ayrımı ölümüne yendim.

Yine de hala bir yaşam kıvılcımı kaldıysa, bunu biraz daha kıralım ve çok uzun zaman önce RSA özel anahtarıyla oluşturulan sertifikayı açık anahtarını ve modülünü inceleyelim:

>openssl x509 -in newclient_cert.pem -pubkey -noout -modulus
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3

... ve hepsi sonsuza dek mutlu yaşadılar: sertifika RSA genel anahtarı, RSA özel anahtarı ve düz eski 'genel anahtar' ile aynı modül değerine sahip. Sertifika, RSA özel anahtarı olarak işaretlenmiş bir dosyayla imzalanmış olmasına rağmen, daha önce gördüğümüz aynı düz eski 'genel anahtar' değerini içeriyor. Bir fikir birliği olduğunu söylemek güvenlidir.

OpenSSL galaksisinin X509 çeyreğinde 'RSAPublicKey_out' eşdeğeri bir anahtar kelime yok, bu yüzden bunu deneyemiyoruz, ancak modül değeri, elde edebileceğimiz kadar yakın olduğunu düşündüğüm "RSA anahtar modülü" olarak tanımlanıyor.

Bunların tümü DSA imzalı bir sertifika ile nasıl görünecek, bilmiyorum.

Bunun orijinal soruyu yanıtlamadığını fark ediyorum, ancak belki de yararlı bir arka plan sağlıyor. Değilse özür dilerim. En azından, yapılmaması gereken şeyler ve yapılmaması gereken varsayımlar.

Hiç şüphe yok ki, böyle bir şey yapmadığı zaman "RSA anahtarı yazmanın" biraz rahatsız edici tekrarına dikkat çekildi. Sanırım, rsa modülünün düz eski açık anahtarı gerçek bir RSA anahtarı olarak tanıması ve bu yüzden "RSA anahtarı" nı (artı her şeyden önce rsa modülü) harmanlamaya devam etmesinin nedeni budur. Doğru hatırlıyorsam, genel EVP_PKEY yapısının tüm anahtar türleri için bir birleşimi vardır, her anahtar türü kendi özel değer kümesine sahiptir (yardımcı olarak adlandırılan g, w, q ve diğer ünsüzler).

Sonuç olarak, programlama ve geliştirme ile ilgili bir şikayet olduğunu not ettim; şimdi, her OpenSSL komutunun açıkça karşılık gelen kodu vardır ve eğer biri bugün OpenSSL programlamanın tüm harikalarını keşfetmek isterse, komut satırı başlamak için makul bir yer gibi görünecektir. Bu özel durumda (şu anda yeni bir cygwin kullandığım için), \ openssl-1.0.2f \ apps \ rsa.c ve (makrolar için yüksek bir toleransa sahipse) \ openssl-1.0'ı inceleyerek başlayabiliriz. 2f \ crypto \ pem \ pem_all.c


8

Senin pub1 ve pub2 arasındaki tek fark, üstbilgi / altbilgi yanında pub2 bu ek dizesidir: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A. Bunu kaldırırsanız, Base 64 pub1'dekiyle aynıdır.

Uygun algoritma tanımlayıcı için ekstra dize karşılık bu Yanıt .

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.