openssl rsa related commands

Derive public key from private key
openssl rsa -in private.pem -pubout -out public.pem

Export the private key in PEM format to text format:
openssl rsa -in inspur_rsa_key1.pem -text -out inspur_rsa_key1.txt

rsa_private_key.pem:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuZ6gqkv2f16lSAfWSMXAL6DXaG6Cwz0S/R5+oQFkBS0CLKzH
xm6QKv2Esf9Fh8EJR0BI+cL44s5V++WRjEcWUSBGIntQ4vXoqAuWCKY6G9YFcboH
EK44mswrNgcsuhwib7+HHHFr4He940rMaSLTce9bSZOHWMQ83WSJpJm1Aoz8QVYL
3Wnvm5uo0+sL9/XRRsan2BKm7A/HjvWiKj2IeIiXNMppha3sHWeoC2C9PGRC3PN5
C0GXzQmAVnxaClGKyUX06NloxBARuDRUmVs+8tqr7x9yAKi1ObajEwMaesNg58vZ
VUZjZqeVOtwgFQkQw/r9xHN+vOk39soZkfFoYwIDAQABAoIBACB99AHbajrBho0l
Ug1LEGlF7m8JaTpj5n8IZ4InjCqbxlWrqQzDLdlYp3HBDZrF36npRtzxlD+ffs2p
UeEMUIvC6oP+shoIkcFYxdqdvm5A+JL/zVzOInp2YtoCR4IMirqk/DGuaQPR8htn
bIC65+h5zbEDch3HvB/FCZMWlOjtGJWNTcm5AKwMvbpBvcqci08om/w2PcBpF1us
TUzkV64ymZroX+ZUMbRLF2Po0P5zj1xAD7rb4Q8Fu9griMuTKS+eprA8kGZXoHmS
rpf0k+ZTcxHd4H5DNdNWEWKmEk7bLsHgpJnKk7tUbVyEqOrBlgu3cAg8D5zB+np2
wClL2AECgYEA5C2IVF36+SIFLazx3yIxOiauUz2pBL6nQ4bDwOSko01ldLLww9Z0
NF5wHxaIhbEbJSuDiqz6kwRAZUSZBbizaB52SqYiiCmKW4sidbyH1UFUVcM0dVfu
U66nR7SZ+f84UcCtaBTqx/Z/2jpMDzsBsZy51uNJ5Fusu4Zsjc1QXyMCgYEA0ECo
3ebTD1rwmEYMRp+frsk+/+BX6oI7Wt2gAY7BI5gpvpc6hZRbGb5TCMzZ5IxBT1OM
Oiy/E4lv9aCKZ3DFTc6ympNVY+4/lDrsjkpeCcM2gZy48r9/BUerovChyUELSnzS
msrosczN6y6Tg9UnIXHuxQ6YHID6RYid7wZqBcECgYBifw00bgUief8GQnt+OIJL
edsSb7GALNSDH69smsY+/+/lukCYKQCsgn+fy9hO7a6sEuaLfDQGNnWdwUjU4XAA
Z/XkL2cEo/nnnl3XuPRhp/vBsav5Y2Wrld774wf8lKE5GRVBspXOj6eNClE+2dfX
VbIbAq4o9zHPGS3O4GvrRQKBgQCKEXRjujdQROCidD6LTCUYQsCL8HcZOUKU2b7N
iZGvQaDbhXP9QACuLqrqeLY1em+KYj/kCeqcz0/1L3zTW8bT8Sgkp23DlR997RsM
s21pV415nShZeHCEVaILozIANimANwWCLujbiIc1V2nhy53n5JuC9kwPCcvj8dGT
uVLtgQKBgQCbnfl3f+QMe4sbtUp5IYBn5LvFHK9R411+4ldIyikwPEGA9JftDS+X
twUgzPjgOdoXex66gz040RHyHpjg0SuA8+GYJRbH3igu0/E3FzERbL6spfsxgdJt
9BHPqNLeLhGN3NggP5DoRv1UksTLa0Um9Hxag4Uqau4Fj2ANA1vZDw==
-----END RSA PRIVATE KEY-----


public.pem:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuZ6gqkv2f16lSAfWSMXA
L6DXaG6Cwz0S/R5+oQFkBS0CLKzHxm6QKv2Esf9Fh8EJR0BI+cL44s5V++WRjEcW
USBGIntQ4vXoqAuWCKY6G9YFcboHEK44mswrNgcsuhwib7+HHHFr4He940rMaSLT
ce9bSZOHWMQ83WSJpJm1Aoz8QVYL3Wnvm5uo0+sL9/XRRsan2BKm7A/HjvWiKj2I
eIiXNMppha3sHWeoC2C9PGRC3PN5C0GXzQmAVnxaClGKyUX06NloxBARuDRUmVs+
8tqr7x9yAKi1ObajEwMaesNg58vZVUZjZqeVOtwgFQkQw/r9xHN+vOk39soZkfFo
YwIDAQAB
-----END PUBLIC KEY-----



对vmlinuz-initrd-7260a0进行签名:
openssl dgst -sha256 -sign private_key.pem -out vmlinuz-initrd-7260a0.sign vmlinuz-initrd-7260a0

对vmlinuz-initrd-7260a0+vmlinuz-initrd-7260a0.sign进行校验:
openssl dgst -sha256 -verify public_key.pem -signature vmlinuz-initrd-7260a0.sign vmlinuz-initrd-7260a0




我在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件:
openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
解密文件:
openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。
至此,一次加密解密的过程告终



关于RSA加密的填充方式:
PKCS1_PADDING
PKCS1_OAEP_PADDING
NO_PADDING
加入填充之后,每次加密的结果都会不一样。签名也是如此,如果在加密哈希的时候使用填充,那么每次生成的签名都会不一样。

利用openssl+dgst命令进行签名时,使用的是no-padding,也就是说,每次生成的签名是一样的。

利用openssl+rsautl命令进行加密时,可以指定是否使用padding。

对vmlinuz-initrd-7260a0进行签名:
openssl dgst -sha256 -sign private_key.pem -out vmlinuz-initrd-7260a0.sign vmlinuz-initrd-7260a0

对vmlinuz-initrd-7260a0+vmlinuz-initrd-7260a0.sign进行校验:
openssl dgst -sha256 -verify public_key.pem -signature vmlinuz-initrd-7260a0.sign vmlinuz-initrd-7260a0



openssl dgst -sha256 -sign test_sec.key -out vmlinuz-initrd-7260a0.sign vmlinuz-initrd-7260a0

openssl dgst -sha256 -verify test_pub.key -signature vmlinuz-initrd-7260a0.sign vmlinuz-initrd-7260a0


从私钥导出公钥:
openssl rsa -in key0_private.pem -outform PEM -pubout -out public.pem
openssl rsa -in priv.pem -outform PEM -pubout -out public.pem

将公钥转换格式:pem-->txt
openssl rsa -pubin -inform PEM -in key0_public.pem -text -out key0_public.txt

openssl rsa -pubin -inform PEM -in public.pem -text -out public_key.txt
openssl rsa -inform PEM -in priv.pem -text -out priv_key.txt

ttt:
openssl rsa -in key.pem -outform PEM -pubout -out public.pem
openssl rsa -pubin -inform PEM -in public.pem -text -out public.txt


openssl dgst -sha256 -out signature.bin.2 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 -sign key.pem raw_data_to_be_signed.bin
openssl rsautl -verify -in signature.bin.2 -pubin -inkey public.pem -raw -hexdump

openssl dgst -sha256 -verify public.pem -signature signature.bin.2 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 raw_data_to_be_signed.bin

openssl rsautl -verify -in signature.bin.2 -pubin -inkey public.pem -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 -raw -hexdump

=======================================================================================================================================================

方法一:直接利用dgst命令生成签名:
1,签名:
openssl dgst -sha256 -out signature.bin.2 -sign key.pem raw_data_to_be_signed.bin
2,验签:
openssl dgst -sha256 -verify public.pem -signature signature.bin.2 raw_data_to_be_signed.bin
3,打印
[lubo@localhost bl_crypto]$ openssl rsautl -in signature.bin.2 -pubin -inkey public.pem -verify -raw -hexdump
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0070 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0080 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0090 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00a0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00b0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00c0 - ff ff ff ff ff ff ff ff-ff ff ff ff 00 30 31 30 .............010
00d0 - 0d 06 09 60 86 48 01 65-03 04 02 01 05 00 04 20 ...`.H.e.......
00e0 - 6e 61 98 4b 65 e7 5f cf-ad 43 bb 74 1d 63 98 46 na.Ke._..C.t.c.F
00f0 - 71 8d cb c1 11 8f 7c 94-eb 55 9d 22 4f c7 c4 dd q.....|..U."O...

[lubo@localhost bl_crypto]$ openssl rsautl -in signature.bin.2 -pubin -inkey public.pem -verify -pkcs -hexdump
0000 - 30 31 30 0d 06 09 60 86-48 01 65 03 04 02 01 05 010...`.H.e.....
0010 - 00 04 20 6e 61 98 4b 65-e7 5f cf ad 43 bb 74 1d .. na.Ke._..C.t.
0020 - 63 98 46 71 8d cb c1 11-8f 7c 94 eb 55 9d 22 4f c.Fq.....|..U."O
0030 - c7 c4 dd ...



方法二:先用dgst命令生成sha256,然后用rsautl进行加解密的方式:
1,生成32字节的原始sha256(data.sha256):
openssl dgst -sha256 -binary -out data.sha256 raw_data_to_be_signed.bin
2,用私钥对 data.sha256 进行pkcs填充的加密:
openssl rsautl -in data.sha256 -out data.sha256.en -inkey key.pem -pkcs -sign
注意:每次生成的数据结果一样!
3,用公钥对 data.sha256.en 进行pkcs填充的解密:
openssl rsautl -in data.sha256.en -out data.sha256.en.dec -pubin -inkey public.pem -pkcs -verify
此时由于选择了pkcs填充,省成的 data.sha256.en.dec 是抛除填充字节的,也就是32字节的原始数据
如果使用-raw替换-pkcs选项:
openssl rsautl -in data.sha256.en -out data.sha256.en.dec -pubin -inkey public.pem -raw -verify
那么解密后的data.sha256.en.dec仍然是256字节,其中包括了解密后的填充字节。

[lubo@localhost bl_crypto]$ openssl rsautl -in data.sha256.en -pubin -inkey public.pem -verify -raw -hexdump
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0070 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0080 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0090 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00a0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00b0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00c0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
00d0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff 00 ................
00e0 - 6e 61 98 4b 65 e7 5f cf-ad 43 bb 74 1d 63 98 46 na.Ke._..C.t.c.F
00f0 - 71 8d cb c1 11 8f 7c 94-eb 55 9d 22 4f c7 c4 dd q.....|..U."O...

4,期望结果:如果解密时使用pkcs选项,那么data.sha256.en.dec 与 data.sha256 的数据一致
注意:rsautl命令中,
用公钥加密:-encrypt (每次生成的数据都不一样!)
用私钥解密:-decrypt
用私钥加密(签名):-sign (每次生成的数据完全一样!)
用公钥解密(验签):-verify


方法一和方法二的区别:
虽然都采用了PKCS5填充,但填充后的数据并不一样,dgst方式填充的并不全是0xFF,这导致用rsautl来解密用dgst生成的签名时,去掉填充后的数据并不完全是原始32字节数据,而是:
[lubo@localhost bl_crypto]$ openssl rsautl -in signature.bin.2 -pubin -inkey public.pem -verify -pkcs -hexdump
0000 - 30 31 30 0d 06 09 60 86-48 01 65 03 04 02 01 05 010...`.H.e.....
0010 - 00 04 20 6e 61 98 4b 65-e7 5f cf ad 43 bb 74 1d .. na.Ke._..C.t.
0020 - 63 98 46 71 8d cb c1 11-8f 7c 94 eb 55 9d 22 4f c.Fq.....|..U."O
0030 - c7 c4 dd




【*】对sha256数据的补充及扰乱:
原始的sha256数据只有32字节,当使用pkcs填充生成256字节的加密数据时,对其进行了0xFF的填充,为了对sha256数据进行进一步扰乱,可预先填充随机数,然后再加密:
生成随机数文件:
dd if=/dev/random of=rand.bin bs=128 count=1
将两个文件拼接成160字节大小的文件:
cat rand.bin data.sha256 > data.sha256.160
验证:
openssl rsautl -in data.sha256.160 -out data.sha256.160.en -inkey key.pem -pkcs -sign
openssl rsautl -in data.sha256.160.en -pubin -inkey public.pem -verify -pkcs -hexdump

【*】为了实现基于chipid的签名,还可以将chipid信息拼接到待加密数据中:
假设chipid共8字节:
[lubo@localhost bl_crypto]$ dd if=/dev/zero of=chipid.bin bs=8 count=1
拼接:
[lubo@localhost bl_crypto]$ cat rand.bin.128 chipid.bin data.sha256 > data.sha256.chipid
[lubo@localhost bl_crypto]$ hexdump -C data.sha256.chipid
00000000 43 62 af a6 ee c1 84 24 76 97 40 ca 02 a3 03 c1 |Cb.....$v.@.....|
00000010 f0 e1 64 31 1d b7 a5 af fa b6 ca 89 41 ec a3 5e |..d1........A..^|
00000020 c9 85 14 fe a0 c5 11 4c f1 1c 35 49 c0 e2 a5 bd |.......L..5I....|
00000030 f2 62 45 99 08 43 c2 9e ba 70 86 62 06 c3 b3 e0 |.bE..C...p.b....|
00000040 cd 6d 1c 35 cb d2 af 96 fc ac cd 51 e9 c1 e9 38 |.m.5.......Q...8|
00000050 93 e2 64 6f de c3 60 4d 36 9c a3 c7 82 99 17 b6 |..do..`M6.......|
00000060 25 80 0f 1d 9d fc 6b 3d e6 fc 8b 0a a2 5d 1a 6e |%.....k=.....].n|
00000070 60 77 1e de f4 06 b1 85 37 c0 3c 13 54 fe 50 f6 |`w......7.<.T.P.|
00000080 00 00 00 00 00 00 00 00 6e 61 98 4b 65 e7 5f cf |........na.Ke._.|
00000090 ad 43 bb 74 1d 63 98 46 71 8d cb c1 11 8f 7c 94 |.C.t.c.Fq.....|.|
000000a0 eb 55 9d 22 4f c7 c4 dd |.U."O...|

openssl rsautl -in data.sha256.chipid -out data.sha256.chipid.en -inkey key.pem -pkcs -sign
openssl rsautl -in data.sha256.chipid.en -pubin -inkey public.pem -verify -pkcs -hexdump




【*】关于加密数据的长度:
openssl rsautl -in test.sign.256 -out test.sign.256.en -inkey key.pem -pkcs -sign
error!
openssl rsautl -in test.sign.245 -out test.sign.245.en -inkey key.pem -pkcs -sign
OK!
openssl rsautl -in test.sign.246 -out test.sign.246.en -inkey key.pem -pkcs -sign
error!
结论:理论上,要求待加密数据必须不大于模数长度减11,也就是 size(data) <= size(modulus),经验证实际与理论相符。
当使用RSA2048的秘钥时,modulus长度是256字节,因此每次加密的数据block大小必须不大于(256-11=245)

[lubo@localhost bl_crypto]$ openssl rsautl -in test.sign.245.en -pubin -inkey public.pem -verify -raw -hexdump
0000 - 00 01 ff ff ff ff ff ff-ff ff 00 38 fd 44 0d fe ...........8.D..
0010 - c4 cd db 24 2a b7 59 cd-71 17 d5 44 0f d8 8c 20 ...$*.Y.q..D...
0020 - 07 bf ed f2 e5 c0 2c b7-12 eb c8 18 ec 8b 4c a7 ......,.......L.
0030 - 82 bb 03 4a 56 5f 85 68-bc c3 5b 42 b1 cd a2 c6 ...JV_.h..[B....
0040 - f3 66 d6 2a 3c 80 1e c2-15 24 0a 4e ca 84 0a 9b .f.*<....$.N....
0050 - 21 8c 97 60 27 87 20 27-b5 99 11 ae 6c 37 68 35 !..`'. '....l7h5
0060 - d0 21 51 ad 2d 4b 47 54-d2 fe 48 b8 8b 6d 44 40 .!Q.-KGT..H..mD@
0070 - 9c d2 d6 1d c0 91 98 55-3b f5 1c cf a8 cf 35 4b .......U;.....5K
0080 - d2 bf d4 6b 85 19 cf f1-73 90 94 36 7a 5a 75 e8 ...k....s..6zZu.
0090 - 93 94 c0 58 57 22 3f d5-d4 82 1b 70 2f f9 48 1b ...XW"?....p/.H.
00a0 - 0f 51 14 6d 6c d5 13 d2-41 e2 b3 45 23 9c d1 04 .Q.ml...A..E#...
00b0 - 41 7b b0 9d 25 a5 bb 08-da 26 da 26 0a 67 a1 34 A{..%....&.&.g.4
00c0 - 7f 3e 1b e9 a5 54 c1 91-5c f6 fd 92 df bd 0d 26 .>...T..\......&
00d0 - b3 8d a0 d9 c3 7c ca a7-60 5f 9d 37 11 53 85 53 .....|..`_.7.S.S
00e0 - e3 c8 23 c4 88 2f 23 1c-22 82 f5 d0 aa c0 11 82 ..#../#.".......
00f0 - 94 67 7a 01 fa a4 c3 47-c1 9c e3 ab e5 63 8a 11 .gz....G.....c..







Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324446611&siteId=291194637