原文地址: http://blog.csdn.net/rodulf/article/details/50689079
RSA 是非對稱加密算法
對稱的加密算法,加密和解密都是使用的一套密鑰,而非對稱使用的是兩套密鑰。例如我要傳的是18,然後我加密的時候是3*6,然後能我解密的時候,可能是(3*3)*(6/3)=9*2=18 來得到這個18.
我加密的時候是一種密鑰,
解密的時候又是一種密鑰。
1:加密的密鑰與解密的密鑰不相同
2: 使用私鑰加密的內容,只能通過公鑰來解密
使用公鑰加密的內容,只能通過私鑰來解密
3:公鑰,可以對外給任何人的加密和解密密碼,公開的,可以任何人訪問
4:私鑰,私鑰是一定要嚴格保護的,通過私鑰可以生成公鑰,但是從公鑰可以認爲是永遠無法推導出私鑰的。
問題:私鑰可以生成公鑰,但是公鑰不能生成私鑰。那麼支付寶裏面放了私鑰合理嗎?
-------------------------------------------------------------------------------------------------------------------------
1: 基於公開密鑰的加密過程
-------------------------------------------------------------------------------------------------------------------------
比如有兩個用戶CEO和財務,CEO想把一段明文通過雙鑰加密的技術發送給財務,財務有一對公鑰和私鑰,那麼加密解密的過程如下:
- 財務將他的公開密鑰傳送給Alice。(或者CEO從公司的服務器獲取公開密鑰)
- CEO用財務的公開密鑰加密她的消息,然後傳送給財務。
- 財務用他的私人密鑰解密CEO的消息。
上面的過程可以用下圖表示,CEO使用財務的公鑰進行加密,財務用自己的私鑰進行解密。
-------------------------------------------------------------------------------------------------------------------------
2:基於公開密鑰的認證過程
-------------------------------------------------------------------------------------------------------------------------
身份認證和加密就不同了,主要用戶鑑別用戶的真僞。這裏我們只要能夠鑑別一個用戶的私鑰是正確的,就可以鑑別這個用戶的真僞。
還是CEO和財務這兩個用戶,CEO想讓財務知道自己是真實的CEO,而不是假冒的,因此CEO只要使用私鑰公鑰密碼對文件簽名發送
給財務,財務使用CEO的公鑰對文件進行解密,如果可以解密成功,則證明財務的私鑰是正確的,因而就完成了對財務的身份鑑別。整個身
份認證的過程如下:
- CEO用她的私人密鑰對文件加密,從而對文件簽名。
- CEO將簽名的文件傳送給財務。
- 財務用CEO的公鑰解密文件,從而驗證簽名。
公鑰可以分享給任何人的,例如github 上面就是需要我們上傳公鑰的。
項目中使用到密鑰的案例:
案例一:
GitHub的公鑰的生成:
--------------------------------------------------------------------------------------------------------------------------------------
http://bbs.csdn.net/topics/390599148
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 = "";