Rsa

私鑰裡面到底是什麼?

  • July 6, 2017

對許多人來說可能聽起來很愚蠢,但我想對私鑰中包含的內容有一些指示。我對公鑰/私鑰/證書(已經創建了很多次)及其目的有很好的理解,但我想退後一步,使用“轉儲”實用程序或其他東西看看它們裡面有什麼——我能看到嗎私鑰中包含的大素數等?

是否有一個實用程序可以向我顯示以下命令輸出的“邏輯內容”,而不是一堆 ASCII 字元?

openssl genrsa

生成

-----BEGIN RSA PRIVATE KEY-----
MIIBPAIBAAJBANdINmZY7VuoRy5VZYwnVIAE/0sd/HkaDVXfMNpwVeKo7K2XLC6U
jpnPFP2MaDEqxs0T6cKVMmt5FsNGyfdKbvcCAwEAAQJBAMGuPQrtPHY2uftsZtSl
2bbnSAr7qlYFYzP7fYc4g3xLWSc5viAe7KgsU7+jXNCqEvflf4iOxhCadUK07APG
…
-----END RSA PRIVATE KEY-----

任何指針表示讚賞。同樣的問題也適用於公鑰 btw ..

$ openssl genrsa | openssl rsa -text -noout
Private-Key: (512 bit)
modulus:
   00:e7:be:c0:b7:7a:8a:e6:58:c3:dc:3e:eb:ed:bc:
   a7:15:04:78:8d:9d:fe:a2:83:aa:ca:85:5f:4b:ae:
   5c:fa:3d:bd:2b:a9:91:58:e1:da:d8:8a:bd:25:6d:
   07:10:74:52:2f:ee:ce:bd:3c:c6:89:01:2e:ff:9a:
   3b:61:4d:e7:81
publicExponent: 65537 (0x10001)
privateExponent:
   00:8d:b9:23:44:51:e5:c6:0e:fc:e0:a1:7e:49:2a:
   79:07:aa:6f:4b:34:17:38:2d:cb:72:04:f4:8d:64:
   f9:a9:72:94:30:6e:d8:65:81:e7:be:05:a8:19:fb:
   82:c9:77:b2:fa:76:0d:4b:ff:b3:ad:a9:f1:9e:55:
   cd:b3:d2:c8:41
prime1:
   00:fc:ea:3f:dd:a9:5f:6f:4d:05:41:50:04:81:8e:
   c7:6b:a0:95:d3:d4:36:09:73:b4:b8:06:db:fc:f2:
   89:0c:e9
prime2:
   00:ea:92:65:f9:06:58:11:f4:bc:fe:e6:10:0b:80:
   51:73:18:1b:91:24:27:83:ab:c9:b3:4c:79:01:1f:
   60:86:d9
exponent1:
   00:e6:7b:63:30:51:c5:d2:dc:51:c9:af:6e:2b:d3:
   3e:10:eb:0b:1f:3b:e8:f2:bc:2b:18:f9:c7:48:c0:
   8d:fc:e1
exponent2:
   11:b3:04:30:bb:12:d0:20:08:56:af:63:4c:8a:dd:
   1a:73:1a:39:64:61:fa:e4:6e:6e:b1:f9:7b:65:33:
   b2:59
coefficient:
   3a:6d:f6:8f:4b:d2:c3:a8:53:aa:32:0d:b9:c5:50:
   d8:db:9c:e3:9b:a8:40:c3:c0:14:2b:7e:67:25:67:
   b7:03

這些數字是十六進制的,格式很有趣,除了公共指數。您可以通過一些文本處理將它們轉換為您喜歡的格式。

Python 是一個更好的環境,可用於使用常見的加密原語,例如 RSA。除了核心 Python 發行版之外,還安裝pycrypto 。

~% python                    
Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from Crypto.PublicKey import RSA
>>> k = RSA.generate(1024)
>>> k.n
137989966843141497713268840304515414544555471898207567571275317377632553064486587462119814017348007187827660662823764767983835450392238729966453378972206066751517751868783987379434607487796692691455662440665457077710749398149038850219502976135918708465391309679715881739357423413344802810741483299360557935787L
>>> k.p * k.q
137989966843141497713268840304515414544555471898207567571275317377632553064486587462119814017348007187827660662823764767983835450392238729966453378972206066751517751868783987379434607487796692691455662440665457077710749398149038850219502976135918708465391309679715881739357423413344802810741483299360557935787L
>>> (k.d * k.e) % ((k.p - 1) * (k.q - 1))
1L

首先,有兩種常見的格式來儲存這些值:PEM 和 DER。PEM 是您發布的內容。實際上,它是與 DER 相同的數據,但採用 base-64 編碼。

其次,有一種叫做“ASN.1”結構的東西。基本上,ASN.1 結構是一組基本類型的欄位,例如 INTEGER、BOOLEAN、SEQUENCE 等。

在上一篇文章中,您可以看到此 ASN.1 結構的一個具體範例。

在不同的平台上,存在能夠讀取和編寫這些 ASN.1 結構的工具。甚至還有一個工具,您可以向它提供某種格式的 ASN.1 結構的規範,它會生成一個 C 程式碼,該程式碼可以讀取並寫入該結構的文件。

對於諸如 RSA 私鑰之類的東西,這個 ASN.1 結構在標準中定義:

PKCS#1 (RFC 3447) 定義了 RSA 私鑰的 ASN.1 結構。每個人都必須使用它。當然,您可以創建自己的:) 但我認為您意識到標準化的重要性。

你可以這樣玩:生成你自己的 RSA 密鑰對(創建一些短的)。然後獲取這個 .PEM 文件並將這個 base-64 編碼字元串複製到 ASN.1 解碼器(有幾個線上解碼器,例如https://lapo.it/asn1js/)。看看吧!:) 你會看到一長串數字,你可以在一些文本編輯器中理解它們。

據我記得,前幾個數字是一個標題,然後它是這樣的:(TYPE)(LENGTH)(DATA)(TYPE)(LENGTH)(DATA)(TYPE)(LENGTH)(DATA)(TYPE) (長度)(數據)

例如,020108

02 - 表示“int” 01 - 表示“長度為 1” 08 - 是你的 int

並且 ASN.1 解析器將以這種方式讀取所有值 - 讀取類型,讀取長度,然後讀取(長度)字節數,讀取類型,讀取長度,讀取(長度)字節數……

之後,由於解析器知道它是 RSA 私鑰的 ASN.1 結構,他會說“好的,那個欄位是第一個素數,那個欄位是第二個素數”

引用自:https://crypto.stackexchange.com/questions/12378