1. 程式人生 > >RSA 私鑰和公鑰的一些理解

RSA 私鑰和公鑰的一些理解

RSA 是非對稱加密演算法

對稱的加密演算法,加密和解密都是使用的一套金鑰,而非對稱使用的是兩套金鑰。

例如我要傳的是18,然後我加密的時候是3*6,然後能我解密的時候,可能是(3*3)*(6/3)=9*2=18 來得到這個18.
我加密的時候是一種金鑰,
解密的時候又是一種金鑰。


1:加密的金鑰與解密的金鑰不相同 
2:   使用私鑰加密的內容,只能通過公鑰來解密
      使用公鑰加密的內容,只能通過私鑰來解密
3:公鑰,可以對外給任何人的加密和解密密碼,公開的,可以任何人訪問

4:私鑰,私鑰是一定要嚴格保護的,通過私鑰可以生成公鑰,但是從公鑰可以認為是永遠無法推匯出私鑰的。

問題:私鑰可以生成公鑰,但是公鑰不能生成私鑰。那麼支付寶裡面放了私鑰合理嗎?

 

-------------------------------------------------------------------------------------------------------------------------

 

1: 基於公開金鑰的加密過程

-------------------------------------------------------------------------------------------------------------------------

  比如有兩個使用者CEO和財務,CEO想把一段明文通過雙鑰加密的技術傳送給財務,財務有一對公鑰和私鑰,那麼加密解密的過程如下:

  1. 財務將他的公開金鑰傳送給Alice。(或者CEO從公司的伺服器獲取公開金鑰)
  2. CEO用財務的公開金鑰加密她的訊息,然後傳送給財務。
  3. 財務用他的私人金鑰解密CEO的訊息。

  上面的過程可以用下圖表示,CEO使用財務的公鑰進行加密,財務用自己的私鑰進行解密。

------------------------------------------------------------------------------------------------------------------------- 

2:基於公開金鑰的認證過程

-------------------------------------------------------------------------------------------------------------------------

  身份認證和加密就不同了,主要使用者鑑別使用者的真偽。這裡我們只要能夠鑑別一個使用者的私鑰是正確的,就可以鑑別這個使用者的真偽。

   還是CEO和財務這兩個使用者,CEO想讓財務知道自己是真實的CEO,而不是假冒的,因此CEO只要使用私鑰公鑰密碼對檔案簽名傳送 給財務,財務使用CEO的公鑰對檔案進行解密,如果可以解密成功,則證明財務的私鑰是正確的,因而就完成了對財務的身份鑑別。整個身 份認證的過程如下:

  1. CEO用她的私人金鑰對檔案加密,從而對檔案簽名。
  2. CEO將簽名的檔案傳送給財務。
  3. 財務用CEO的公鑰解密檔案,從而驗證簽名。

 

 

----------------------------------------

公鑰可以分享給任何人的,例如github 上面就是需要我們上傳公鑰的。

專案中使用到金鑰的案例:
案例一:

GitHub的公鑰的生成:

--------------------------------------------------------------------------------------------------------------------------------------

http://bbs.csdn.net/topics/390599148

剛接觸Git有很多困惑
1.為什麼要公鑰和私鑰呢,到底有啥用呢(詳細點)
2.為什麼要把我的公鑰加到Git專案之中儲存起來
3.比如,某路人甲 想給我的專案提供一些程式碼,他沒有我的公鑰可以push給我嗎?


2. GIT伺服器上儲存的是公鑰,你本地儲存的是私鑰,當你push原生代碼庫到遠端程式碼庫,伺服器會要求你出示私鑰,並且用你出示的私鑰和它的公鑰配對來完成認證。由於使用的是不對稱加密,所以公鑰可以公開,只要保管好私鑰就可以。
3. 路人甲只要沒有私鑰,所以無法push。這樣才能保證開源專案的完整性,否則阿貓阿狗都去push程式碼,那專案不就亂套了?如果路人甲想對你的專案做出貢獻,那麼以GITHUB為例,他會發送一個pull request給你,然後由你來稽核他作出的改變,如果稽核通過,那麼你就可以將他的pull request合併到你工程的某一分支中。這裡只以GITHUB為例,私有的GIT伺服器可能沒有類似功能,比如GITLAB就沒有pull request。

--------------------------------------------------------------------------------------------------------------------------------------


-------------------------------------

案例二:

 

支付寶有兩種模式:
一種就是demo裡面(demo 只是給我們看怎麼弄的),本地支付,但是不安全,
客戶端生成Order -> 使用私鑰進行簽名-》payInfo-》支付寶伺服器使用商戶的公鑰進行校驗
一種是通過自己的伺服器進行簽名:
客戶端生成order -》提交給伺服器-》伺服器計算金額,orderInfo-》通過私鑰生成簽名sign-》pageInfo-》回來給客戶端客戶端再將這個資訊給支付寶

 

支付寶也需要用到公鑰,私鑰,我們的專案裡面填寫私鑰就好了,支付寶那邊已經有了公鑰了

 

 



公鑰,上傳給伺服器,伺服器就認可這臺電腦私鑰加密的東西。
在PayDemoActivity:裡面有。下面的幾個是公司給的或者是你幫公司申請的。

// 商戶PID
public static final String PARTNER = "2088601082136243";
// 商戶收款賬號
public static final String SELLER = "[email protected]";
// 商戶私鑰,pkcs8格式
// 客戶端使用的私鑰,對於請求進行數字簽名,傳給伺服器,伺服器使用公鑰進行驗證
public static final String RSA_PRIVATE = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM62H9NVaAFL54uyqjNv11J7eeOsh/xRQ2c31zUXGmFvuq5iUVxahQBNKa5O3w4qoOdzCt6yw+Fcl9hN/9NV9pWiCUBzNBluUMyqTb2Qs+bULisevBk810Uevo/Cct+gu+6e2tTal2dXszAXK7tYjJqd5Rzmc/qJRzFPNn4j3W2NAgMBAAECgYEAwEDBHtPrNHF9O/+Cru5RLGSs++SmYTTPZLuZy8XeAkthK/lDRIrn8lzR7E1sxYc+OaVUscU/y2VL0KDS06K6/8gVCcJe4UiCjIBXyhmwNBKBHf4jlKKAlaWZkPwJSxpfE1O16epBvTHZdyEY0ALfMnvQlUZ8RAAXo5DHGutHscECQQD++08BYfWDhYVpDzlEcPM+9fyecen8vGiX/T0+LB88kREIldjiQmqJyBvKECRBUJYg+2mqHGQjQMfBHfaaUsC9AkEAz4l27Qps5e93EmNlDn3RsMH+JVzMu0442nA8SbpRJOtmuqYDZAH7W2uj3J3J1gIbZg5zCxQc9rLDYcq2wo21EQJBAK1x/ZgPLpa8qLeCZ44q1wwpACI3ktccwnlBBfvYv5bPhyqz48hlLVt0B5M3z7GuQ7FD0+inT2a7liXDYBAx4nECQD8SSsc9LN0wSmKXPGYMDMcIHcGjE0E1Q4f3JgtOCU0MEVtWCp/BDm+5JcJtXaKhX0xDxeivAyJiL4ivv50ezdECQHptoOYG0tMCHL0oOXrZXsdpAFL/c8vX25Oq/uaYaR+Zgv02ipt+81YQ+8nYTwD55TZytt0TcifqUQhDf0y7XyQ=";
// 支付寶公鑰
public static final String RSA_PUBLIC = "";