【问题标题】:explanation of a rsa key filersa 密钥文件的解释
【发布时间】:2016-02-26 23:32:18
【问题描述】:

我正在做一个关于 RSA 算法的纯数学演示,所以我用命令制作了一对密钥:

ssh-keygen -t rsa -C "my_mail@server.com"

所以它制作了 id_rsa 和 id_rsa.pub 文件,因为这些文件只是为了演示海豚我没有问题展示它们,这些是

id_rsa

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA3WqSN/xKwYb3NcgkLV0FO+KSKTcAQR/LChN6gXfHi8n+DXy9
4Ms4RnXohW2pSFinTs+k0I6VEgiwUYGqO5Ak6S5k6L4DuOG2frQtLkIvapV+LG4W
8jkWXRgsyrtne3iUTjbUa9/iDPN6hsGuCDANLjodu8dxzOXNApX7EyIv+9NpabcF
kt8AUwN8z8mCz52j4fhzOD/0DlfHWj1trqtNkq9dzKyY+4FOpgxTUSmKBxzuYT6m
f8T3E8S9eHPA9GB9ZidauqdOYhP8YYJp9cTHaxZFpmzjBfY0wAajOjN7oLWuoXRD
Ave8pI6WMABLlC4duVym6hFW+SIjlb0SlitF5QIDAQABAoIBAQDWK1+EB+XHjGVT
AGT9/Bwz8NSwSSNV2wrqlCzLTrEV5ix3n1GLPwcQILzpU0mLUTWEZhVmJoTLDNx/
+oxPUP5jDx1Mg3/WNX3w0Rdix2JWFoQVNee8JLwdEGVDNELEi73oaeDO96AQJvM9
pdpQ0SnurQhVunW5XA8RkUFrIIaJbgjCrCajNdh0uilGXj8MZInQoApCsVd0Eax4
/X1iaCndkAnYGsy7s3YQMrZ3iPigbLG4nuYgS8NYDLQpEX9vq9bqbER5wUjfldyp
0nN3mSltvFItkzW6LfYsgRD86KVUwqMq/EjN6xNX1M4pSfRh9BQKcgwLWQwBDkyw
fcOn4zwBAoGBAPIaiMVf2oIV0bEUCdkY+rFGoNHWgkeMBfbxeqfZ7K9sXp7eLUic
Knciqzh/GQ9PM6H6g8PhedLXonFtzShNG+dFW+UX3fFTdfJDgX0MUih+6qDp5QkI
0Ej1K5y7g9pOEVOxbgyHtN0s38Li6oZHGRnbf7tDrnMpZP0LGdZceiNpAoGBAOog
Dq5/Z8HpYTr/C8GT3BsZTKqs1wawKJaZ9NKf/0+vc1lTZ8ZlSG0Dy9HlECfYdIhX
af5n0QG3OR77gh6oYqt9cCokggTrmgxxz7NdcXQezfQr5zVMeqDc2oTCKymrIXru
WLWZrb0134UgRl6lcIx3XGCci1+BlEJUlAjFGcsdAoGALUhtQI2XLzGpkPdwiBy1
9yaAuf7nSz6TdwbfrDmEnaMlZ42i5qve/X2MjPqo00Y7IBbdQmwP/zG5/oFNGDaj
+3PrpkP6jULREskxlRQS4eQrOoHFBxWQ77R7vcsM9G4Zq4/KR6myWJQmHiuXNhpi
RYXatEoKfRvG+dVztbaCWdECgYAYd6sxH013nW003iybWVl6V4WEnLWIFGbZflNw
o5np+PsEDcxdln4gLnJhiB/NGjjrer8wACd+l2hXzY8GpzBQnbZYISKZYwnhXQ+I
vi46JXH+n4v1LP3vy8TmdOhP3XuNPlV0/Q+EI5otbncMMxv1AhBcZF/IZmFZIT+r
PvX4HQKBgQC2AY43HY/TQABe0SpygRwVfyTNgLsVCZNu+BKZ9V3wc4Wviq8CeXSo
eD6M3j8adkVIsz/QRwiau3RavoMfH3I6K04F+a3TtfuCvlbuj4WOJGU1s29iD8DZ
enu/vDfWeNFZIVvhx2e70ahdpy0ZbV7rYogMesAa+0VOQ0ZfK1a0Jw==
-----END RSA PRIVATE KEY-----

id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdapI3/ErBhvc1yCQtXQU74pIpNwBBH8sKE3qBd8eLyf4NfL3gyzhGdeiFbalIWKdOz6TQjpUSCLBRgao7kCTpLmTovgO44bZ+tC0uQi9qlX4sbhbyORZdGCzKu2d7eJRONtRr3+IM83qGwa4IMA0uOh27x3HM5c0ClfsTIi/702lptwWS3wBTA3zPyYLPnaPh+HM4P/QOV8daPW2uq02Sr13MrJj7gU6mDFNRKYoHHO5hPqZ/xPcTxL14c8D0YH1mJ1q6p05iE/xhgmn1xMdrFkWmbOMF9jTABqM6M3ugta6hdEMC97ykjpYwAEuULh25XKbqEVb5IiOVvRKWK0Xl my_mail@server.com

但是当我查看https://en.wikipedia.org/wiki/RSA_(cryptosystem) 中的信息时,我发现算法是: c = m^e mod n m = c^d mod n

在哪里

e is public key
d is private key
n is the common module

我的问题是文件中哪一部分是e,哪一部分是d,哪一部分是n?

有没有办法从文件中读取并直接从 gmp c++​​ 库中将其插入到 mpz_class 中?

这些对我来说都足够了

【问题讨论】:

  • 这是一个PKCS#1-encoded RSA private key。您必须使用 ASN.1 从那里提取信息。这不是一个真正的编程问题,是吗?
  • 其实我是用这个tu在c++中输入信息到一个mpz_class,我想我之前可以提过,给我一秒钟,我会编辑它

标签: ssl math cryptography rsa


【解决方案1】:

ssh-keygen-m 命令行选项在手册页中记录如下:

-mkey_format-i(导入)或-e(导出)转换选项指定密钥格式。支持的密钥格式为:“RFC4716”(RFC 4716/SSH2 公钥或私钥)、“PKCS8”(PEM PKCS8 公钥)或“PEM”(PEM 公钥)。默认转换格式为“RFC4716”。

正如Artjom B. 的评论所说,数据是某种形式的 ASN.1,让我们导出到 PEM 并将结果提供给openssl asn1parse

$ ssh-keygen -m PEM -e -f id_rsa.pub | openssl asn1parse -i
    0:d=0  hl=4 l= 266 cons: SEQUENCE          
    4:d=1  hl=4 l= 257 prim:  INTEGER           :DD6A9237FC4AC186F735C8242D5D053BE292293700411FCB0A137A8177C78BC9FE0D7CBDE0CB384675E8856DA94858A74ECFA4D08E951208B05181AA3B9024E92E64E8BE03B8E1B67EB42D2E422F6A957E2C6E16F239165D182CCABB677B78944E36D46BDFE20CF37A86C1AE08300D2E3A1DBBC771CCE5CD0295FB13222FFBD36969B70592DF0053037CCFC982CF9DA3E1F873383FF40E57C75A3D6DAEAB4D92AF5DCCAC98FB814EA60C5351298A071CEE613EA67FC4F713C4BD7873C0F4607D66275ABAA74E6213FC618269F5C4C76B1645A66CE305F634C006A33A337BA0B5AEA1744302F7BCA48E9630004B942E1DB95CA6EA1156F9222395BD12962B45E5
  265:d=1  hl=2 l=   3 prim:  INTEGER           :010001

这是公共模数n,后跟公钥e,均以十六进制表示。查看私钥:

$ openssl asn1parse -i < id_rsa
    0:d=0  hl=4 l=1188 cons: SEQUENCE          
    4:d=1  hl=2 l=   1 prim:  INTEGER           :00
    7:d=1  hl=4 l= 257 prim:  INTEGER           :DD6A9237FC4AC186F735C8242D5D053BE292293700411FCB0A137A8177C78BC9FE0D7CBDE0CB384675E8856DA94858A74ECFA4D08E951208B05181AA3B9024E92E64E8BE03B8E1B67EB42D2E422F6A957E2C6E16F239165D182CCABB677B78944E36D46BDFE20CF37A86C1AE08300D2E3A1DBBC771CCE5CD0295FB13222FFBD36969B70592DF0053037CCFC982CF9DA3E1F873383FF40E57C75A3D6DAEAB4D92AF5DCCAC98FB814EA60C5351298A071CEE613EA67FC4F713C4BD7873C0F4607D66275ABAA74E6213FC618269F5C4C76B1645A66CE305F634C006A33A337BA0B5AEA1744302F7BCA48E9630004B942E1DB95CA6EA1156F9222395BD12962B45E5
  268:d=1  hl=2 l=   3 prim:  INTEGER           :010001
  273:d=1  hl=4 l= 257 prim:  INTEGER           :D62B5F8407E5C78C65530064FDFC1C33F0D4B0492355DB0AEA942CCB4EB115E62C779F518B3F071020BCE953498B5135846615662684CB0CDC7FFA8C4F50FE630F1D4C837FD6357DF0D11762C7625616841535E7BC24BC1D1065433442C48BBDE869E0CEF7A01026F33DA5DA50D129EEAD0855BA75B95C0F1191416B2086896E08C2AC26A335D874BA29465E3F0C6489D0A00A42B1577411AC78FD7D626829DD9009D81ACCBBB3761032B67788F8A06CB1B89EE6204BC3580CB429117F6FABD6EA6C4479C148DF95DCA9D2737799296DBC522D9335BA2DF62C8110FCE8A554C2A32AFC48CDEB1357D4CE2949F461F4140A720C0B590C010E4CB07DC3A7E33C01
  534:d=1  hl=3 l= 129 prim:  INTEGER           :F21A88C55FDA8215D1B11409D918FAB146A0D1D682478C05F6F17AA7D9ECAF6C5E9EDE2D489C2A7722AB387F190F4F33A1FA83C3E179D2D7A2716DCD284D1BE7455BE517DDF15375F243817D0C52287EEAA0E9E50908D048F52B9CBB83DA4E1153B16E0C87B4DD2CDFC2E2EA86471919DB7FBB43AE732964FD0B19D65C7A2369
  666:d=1  hl=3 l= 129 prim:  INTEGER           :EA200EAE7F67C1E9613AFF0BC193DC1B194CAAACD706B0289699F4D29FFF4FAF73595367C665486D03CBD1E51027D874885769FE67D101B7391EFB821EA862AB7D702A248204EB9A0C71CFB35D71741ECDF42BE7354C7AA0DCDA84C22B29AB217AEE58B599ADBD35DF8520465EA5708C775C609C8B5F819442549408C519CB1D
  798:d=1  hl=3 l= 128 prim:  INTEGER           :2D486D408D972F31A990F770881CB5F72680B9FEE74B3E937706DFAC39849DA325678DA2E6ABDEFD7D8C8CFAA8D3463B2016DD426C0FFF31B9FE814D1836A3FB73EBA643FA8D42D112C931951412E1E42B3A81C5071590EFB47BBDCB0CF46E19AB8FCA47A9B25894261E2B97361A624585DAB44A0A7D1BC6F9D573B5B68259D1
  929:d=1  hl=3 l= 128 prim:  INTEGER           :1877AB311F4D779D6D34DE2C9B59597A5785849CB5881466D97E5370A399E9F8FB040DCC5D967E202E7261881FCD1A38EB7ABF3000277E976857CD8F06A730509DB6582122996309E15D0F88BE2E3A2571FE9F8BF52CFDEFCBC4E674E84FDD7B8D3E5574FD0F84239A2D6E770C331BF502105C645FC8666159213FAB3EF5F81D
 1060:d=1  hl=3 l= 129 prim:  INTEGER           :B6018E371D8FD340005ED12A72811C157F24CD80BB1509936EF81299F55DF07385AF8AAF027974A8783E8CDE3F1A764548B33FD047089ABB745ABE831F1F723A2B4E05F9ADD3B5FB82BE56EE8F858E246535B36F620FC0D97A7BBFBC37D678D159215BE1C767BBD1A85DA72D196D5EEB62880C7AC01AFB454E43465F2B56B427

对比the document Artjom referenced,你可以猜到这个9个整数的序列大概对应version,modulus,publicExponent,privateExponent,prime1,prime2,exponent1, exponent2coefficient。您可以识别 moduluspublicExponent 的值,因为它们与您在公钥中的值匹配。因此,为了读取私钥,我们知道解析类似 PEM 的文件就足够了。您可能可以链接到 libopenssl 并使用它的 API 为您执行此操作。

但是id_rsa.pub 的格式是什么?如果你在没有-m 标志的情况下运行命令,你会得到类似

$ ssh-keygen -e -f id_rsa.pub
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by … from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQDdapI3/ErBhvc1yCQtXQU74pIpNwBBH8sKE3qBd8
eLyf4NfL3gyzhGdeiFbalIWKdOz6TQjpUSCLBRgao7kCTpLmTovgO44bZ+tC0uQi9qlX4s
bhbyORZdGCzKu2d7eJRONtRr3+IM83qGwa4IMA0uOh27x3HM5c0ClfsTIi/702lptwWS3w
BTA3zPyYLPnaPh+HM4P/QOV8daPW2uq02Sr13MrJj7gU6mDFNRKYoHHO5hPqZ/xPcTxL14
c8D0YH1mJ1q6p05iE/xhgmn1xMdrFkWmbOMF9jTABqM6M3ugta6hdEMC97ykjpYwAEuULh
25XKbqEVb5IiOVvRKWK0Xl
---- END SSH2 PUBLIC KEY ----

该输出的主要部分的 base64 数字正是来自id_rsa.pub 行的数字,因此它必须是这种“RFC4716”格式的轻微变体。阅读RFC 4716 section 3.4

3.4.公钥文件正文

公钥文件的主体是 base64 编码的 ([RFC2045]) [RFC4253], Section 6.6指定的公钥数据:

    string    certificate or public key format identifier
    byte[n]   key/certificate data

与所有其他行一样,正文中的每一行不得更长 超过 72 个 8 位字节,不包括行终止字符。

RFC4253 Section 6.6 写道:

“ssh-rsa”密钥格式具体编码如下:

 string    "ssh-rsa"
 mpint     e
 mpint     n

此处使用的类型stringmpintRFC4251 Section 5 中进行了说明。本质上,每个都是一个 32 位数字,以字节为单位给出长度,然后是实际数据。如果您仔细观察,您可以识别出与其他表示相同的整数。

$ cut -d' ' -f2 < id_rsa.pub | base64 -d | hexdump -C
00000000 [00 00 00 07:73 73 68 2d  72 73 61|00 00 00 03:01  |....ssh-rsa.....|
00000010  00 01|00 00 01 01:00 dd  6a 92 37 fc 4a c1 86 f7  |........j.7.J...|
00000020  35 c8 24 2d 5d 05 3b e2  92 29 37 00 41 1f cb 0a  |5.$-].;..)7.A...|
00000030  13 7a 81 77 c7 8b c9 fe  0d 7c bd e0 cb 38 46 75  |.z.w.....|...8Fu|
00000040  e8 85 6d a9 48 58 a7 4e  cf a4 d0 8e 95 12 08 b0  |..m.HX.N........|
00000050  51 81 aa 3b 90 24 e9 2e  64 e8 be 03 b8 e1 b6 7e  |Q..;.$..d......~|
00000060  b4 2d 2e 42 2f 6a 95 7e  2c 6e 16 f2 39 16 5d 18  |.-.B/j.~,n..9.].|
00000070  2c ca bb 67 7b 78 94 4e  36 d4 6b df e2 0c f3 7a  |,..g{x.N6.k....z|
00000080  86 c1 ae 08 30 0d 2e 3a  1d bb c7 71 cc e5 cd 02  |....0..:...q....|
00000090  95 fb 13 22 2f fb d3 69  69 b7 05 92 df 00 53 03  |..."/..ii.....S.|
000000a0  7c cf c9 82 cf 9d a3 e1  f8 73 38 3f f4 0e 57 c7  ||........s8?..W.|
000000b0  5a 3d 6d ae ab 4d 92 af  5d cc ac 98 fb 81 4e a6  |Z=m..M..].....N.|
000000c0  0c 53 51 29 8a 07 1c ee  61 3e a6 7f c4 f7 13 c4  |.SQ)....a>......|
000000d0  bd 78 73 c0 f4 60 7d 66  27 5a ba a7 4e 62 13 fc  |.xs..`}f'Z..Nb..|
000000e0  61 82 69 f5 c4 c7 6b 16  45 a6 6c e3 05 f6 34 c0  |a.i...k.E.l...4.|
000000f0  06 a3 3a 33 7b a0 b5 ae  a1 74 43 02 f7 bc a4 8e  |..:3{....tC.....|
00000100  96 30 00 4b 94 2e 1d b9  5c a6 ea 11 56 f9 22 23  |.0.K....\...V."#|
00000110  95 bd 12 96 2b 45 e5]                             |....+E.|
00000117

我已编辑输出以使数据边界更加明显。查看十六进制输出,您会看到以下三个部分:

[7: "ssh-rsa" | 3: e=0x010001 | 0x101=257: n=0x00dd6a…3b45e5]

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 2012-04-07
    • 2020-02-17
    • 2012-05-08
    • 1970-01-01
    • 2010-12-17
    • 2018-12-10
    • 2021-10-03
    • 2018-09-10
    相关资源
    最近更新 更多