日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenSSL 之 RSA 相关命令学习笔记

發(fā)布時(shí)間:2024/9/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenSSL 之 RSA 相关命令学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

作者: Angus.Fenying <i.am.x.fenying@gmail.com>

日期: 2016-11-10 10:35 PM

本文介紹 OpenSSL 命令行進(jìn)行 RSA 加密、解密、簽名、驗(yàn)證的操作,但不涉及 RSA 算法原理解析,如有興趣,可以閱讀阮一峰的《RSA算法原理》。如果你只想知道 RSA 是什么,那么你只要記住:RSA 是一種加密算法,使用兩個(gè)密鑰,一個(gè)叫公鑰,一個(gè) 叫私鑰,使用公鑰加密的密文只有使用私鑰才可以解密,反之亦然。

Section 0: 生成隨機(jī)文件

由于 OpenSSL 創(chuàng)建密鑰文件是隨機(jī)生成的,因此有必要為之提供一份隨機(jī)數(shù)據(jù)源。

可以用 openssl 的 rand 命令創(chuàng)建一個(gè) 64MB 的隨機(jī)文件,保存為文件 randSrc.bin。

openssl rand -out ./randSrc.bin 67108864

還可以使用 -base64 或者 -hex 兩個(gè)參數(shù)之一指定輸出格式為 BASE64 或者 HEX。

Section 1: 生成一個(gè)密鑰文件

小貼士:

  • 根據(jù)目前的普遍需求,應(yīng)當(dāng)使用 AES256 為加密標(biāo)準(zhǔn)。
  • 通常 RSA 私鑰文件命名為 name.pem,公鑰文件名為 name_pub.pem。
  • OpenSSL 生成的密鑰文件默認(rèn)是 PEM 格式的。
  • openssl genrsa \-rand randSrc.bin \-aes256 \-out rsa.pem 2048

    這個(gè)命令的意思是:

    • genrsa: 生成 RSA 密鑰文件。
    • -aes256: 使用 AES256 算法加密生成的密鑰文件, 因此你需要輸入加密用的密碼(并記住)。
    • -rand randSrc.bin 使用文件 randSrc.bin 作為隨機(jī)數(shù)來源。
    • -out rsa.pem: 將生成的密鑰文件保存為 rsa.pem。
    • 2048: 生成 2048 Bits 的 RSA 密鑰文件。

    2048 Bits 是指 RSA 算法里 N 的長度,而不是說公鑰和私鑰都是 2048 Bits。

    生成文件樣例:

    -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,A6F8DD9D1D994363907C278CDF9B644CMfsPjXK6izOmmzMseG3M2aBKque20ao13+oFg/JdJtlCK0Vb11hLqq8h/ICnY3lI z1xuBKiXVykl521YumeTS6C+WtSkb71cy1u6lHBwdO44tWxklEqcl1sLYIWKyNaB VgKmS4BhfuUq8XlSt3LnuQT/BJWPP7+GUUaZG6/stMWAx+XBg9mMahxGCqo7aRcz ............... nLGRE27iklwGgSagaK40FDiSe69HcIBkHCUQYaYtXQzHNgjoQRkcotzo+vxM7XcL 5y5DHwA8IFwt9c5f14lxZ2cXF9p54JA3UMy+T7XggINDgBFuOPR/U3eBS2x6hHW6 eoGX+khw+s5atpNJaF4s6n2ViDseQsW+b8NfSdlX0j5f5xSasFcYgFsDZtBy/FqZ -----END RSA PRIVATE KEY-----

    這是一個(gè)密鑰文件,而不是一個(gè)純粹的私鑰文件,它包含了完整的密鑰信息,即是說,里面 既有公鑰也有私鑰。但是只能把它當(dāng)成私鑰使用,公鑰部分請(qǐng)參考 Section 3。

    Section 2: 去除密鑰文件的密碼

    從 Section 1 生成的密鑰文件中提取沒有密碼的密鑰文件,以便給 Nginx 等服務(wù)器使用。

    openssl rsa -in rsa.pem -out rsa_pri.pem

    Section 3: 根據(jù)私鑰生成公鑰

    從 Section 1 生成的私鑰文件中提取公鑰文件。

    openssl rsa -in rsa.pem -pubout -out rsa_pub.pem

    Section 4: 使用公鑰加密

    RSA 加密和解密都是使用 openssl 的 rsautl 命令。

    在 Section 3 里面生成了公鑰文件 rsa_pub.pem,下面使用它進(jìn)行加密。 (先生成個(gè)數(shù)據(jù)文件)

    echo 1234567890 > test.txt md5sum test.txt openssl rsautl \-encrypt \-in test.txt \-out test.secret \-pubin \-inkey rsa_pub.pem

    可以看到源文件 test.txt 的 MD5 值為 7c12772809c1c0c3deda6103b10fdfa0。

    源文件 test.txt 只有 10 個(gè)字節(jié)大小,但是加密結(jié)果文件 test.secret* 居然有 256 字節(jié)(2048 位長),這是因?yàn)?RSA 密鑰是 2048 位長度的,而 RSA 加解密算法的操作 單位必須和密鑰長度一致。所以加密結(jié)果的大小一定和密鑰長度的一致。所以加密長度必須小于 密鑰長度 - 填充長度。

    關(guān)于填充數(shù)據(jù),默認(rèn)使用 PKCS#1 v1.5 填充格式。

    Section 5: 使用私鑰解密

    在 Section 1 里面生成了密鑰文件 rsa.pem,下面使用它進(jìn)行加密。

    openssl rsautl -decrypt -in test.secret -out test.raw -inkey rsa.pem md5sum test.raw

    這里使用的是帶密碼的密鑰文件,因此需要輸入 AES 密碼先把密鑰文件解密出來。如果使用的是 Section 2 中生成的無密碼密鑰文件,那么則不需要輸入密碼了。

    可以看到解密出來的文件 test.raw 的 MD5 值為 7c12772809c1c0c3deda6103b10fdfa0。

    Section 6: 使用私鑰簽名

    加解密是使用公鑰加密,私鑰解密,因?yàn)楣€是公開的,私鑰是保密的。簽名和校驗(yàn)則反過來, 私鑰簽名,公鑰校驗(yàn)。

    這里假設(shè)你要發(fā)送消息給你朋友,消息存在文件 test.txt 中,你已經(jīng)擁有了你朋友的 公鑰文件 fr_pub.pem

    那么先用他的公鑰對(duì)文件進(jìn)行加密:

    openssl rsautl -encrypt -in test.txt -out test.msg -pubin -inkey fr_pub.pem

    得到了加密后的文件 test.msg,下面使用你自己的私鑰進(jìn)行簽名。

    先用 SHA256 算法生成文件的哈希校驗(yàn)碼:

    openssl sha256 -out test.hash test.msg

    得到了哈希校驗(yàn)文件 test.hash,內(nèi)容如下:

    SHA256(test.msg)= ************************

    下面使用 RSA 私鑰對(duì)其進(jìn)行簽名:

    openssl pkeyutl \-sign \-in test.hash \-out test.sign \-inkey rsa_raw.pem

    或者

    openssl rsautl \-sign \-in test.hash \-out test.sign \-inkey rsa_raw.pem

    RSA 私鑰簽名的實(shí)質(zhì)是:使用 RSA 私鑰對(duì)數(shù)據(jù)的哈希校驗(yàn)碼進(jìn)行加密,這樣就可以用 對(duì)應(yīng)的 RSA 公鑰解密得到數(shù)據(jù)的哈希校驗(yàn)碼。

    得到了簽名后的文件 test.sign,將它和 test.msg、rsa_pub.pem 一起發(fā)給你的朋友。

    Section 7: 使用公鑰校驗(yàn)

    現(xiàn)在你的朋友收到了你發(fā)給他的三個(gè)文件,分別是:公鑰、簽名、消息?,F(xiàn)在他怎么確定 消息是發(fā)給他的呢?當(dāng)然是使用公鑰校驗(yàn)啦。

    首先,他同樣使用 openssl 生成文件 test.msg 的哈希校驗(yàn)碼。

    openssl sha256 -out test.hash test.msg

    然后使用你的公鑰文件對(duì)其進(jìn)行校驗(yàn):

    openssl pkeyutl \-verify \-in test.hash \-sigfile test.sign \-pubin \-inkey rsa_pub.pem

    如果校驗(yàn)通過,則會(huì)看到提示:Signature Verified Successfully。

    然后他再使用他的私鑰解密 test.msg 文件即可得到你發(fā)給他的消息了。

    這里不使用 openssl rsautl -verify 命令,因?yàn)?rsautl 的 -verify 指令 僅僅是將輸入的文件用公鑰解密,但不與計(jì)算出來的哈希校驗(yàn)碼進(jìn)行比較,不如 pkeyutl 的 -verify 方便:

    openssl rsautl \-verify \-in test.sign \-pubin \-inkey rsa_pub.pem

    前面說了,rsa.pem 里面既包含私鑰又包含公鑰,這里可以小小地證明一下。 直接使用 rsa_raw.pem 文件進(jìn)行簽名校驗(yàn)。

    openssl pkeyutl \-verify \-in test.hash \-sigfile test.sign \-pubin \-inkey rsa_raw.pem

    如何,結(jié)果是不是一樣呢?

    那么,問題來了。如果傳輸過程被人攔截了怎么辦?這就是下一篇文章的內(nèi)容了。

    轉(zhuǎn)載于:https://my.oschina.net/fenying/blog/786238

    總結(jié)

    以上是生活随笔為你收集整理的OpenSSL 之 RSA 相关命令学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。