1. 程式人生 > >RSA加解密你會了嗎?

RSA加解密你會了嗎?

美食廣場匯  美食

一、當做到RSA加密這塊時,遇到了問題,我自己加密的自己解密可以,Android端他自己加密自己解密,但是相互加密的都解不開;

然後我就想問題所在:1、是不是私鑰公鑰沒對呢?2、安卓和PHP伺服器端  加密方式機密方式對應關係有問題;

二、實現整個思路:1、去支付寶中找 http://pan.baidu.com/s/1hrskICs  openssl-RSA  公私鑰生成工具中;(注意同時將 dll檔案copy到Windows/system32下);

     2、生成的公私鑰給移動端一份,互相加解密所用此公私鑰;

三、實現對接方式:Android 公鑰加密--->PHP私鑰解密;PHP私鑰加密--->Android公鑰解密;

然後找到了如下文章: 

轉至:http://blog.csdn.net/xyxjn/article/details/17225809

最近做手機專案,伺服器端使用的是php,客戶端分別有android版及ios版,在部分通訊環節需要對內容進行加密,RSA加密演演算法是一種非對稱加密演演算法,能夠較好達到要求,不過如果伺服器架設https服務,較為麻煩,系統效率也不高,我們只需要在部分重要介面上使用RSA加密解密就行。

首先,準備工作

下載RSA金鑰生成工具openssl,點選下載,解壓縮至獨立的資料夾,進入其中的bin目錄,執行以下命令:
  1. openssl genrsa -out rsa_private_key
    .pem1024
  2. openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
  3. openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一條命令生成原始 RSA私鑰檔案 rsa_private_key.pem,第二條命令將原始 RSA私鑰轉換為 pkcs8格式,第三條生成RSA公鑰 rsa_public_key.pem
從上面看出通過私鑰能生成對應的公鑰,因此我們將私鑰private_key.pem用在伺服器端,公鑰發放給android跟ios等前端

第二步,php伺服器端,使用openssl方法來進行加密解密類,程式碼如下:

  1. <?php  
  2. /** 
  3.  * @author alun (http://alunblog.duapp.com) 
  4.  * @version 1.0 
  5.  * @created 2013-5-17 
  6.  */
  7. class Rsa  
  8. {  
  9. privatestatic $PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----  
  10. MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM9nUm7rPNhSgvsd  
  11. jMuCd5E7IMJB/80A1YY7jYV9fBCKdhVKmqea26QYuw6FW7B00fppEUTSazduSmn9
  12. Yvhx9UOCcI75b0nq9FWm5O4P+Kp8l31M1pwsJ3cm+DceGOrFsl47vh9idiqj+abI  
  13. lJ4sTmJmDghmbks9YFlZSndQsIBlAgMBAAECgYAasa6vbgF3yi7niScc7l7bR2Pw  
  14. /LOivA+/ZhzR6JO2QUvvc5myJsFMPo6c0Nc7P93iv/EkDX0VNlHHkIBTf79URHXM  
  15. gXwMad4pHAeOiqxk5A9w/szDCBoETngtoqQGJq+QINxwPVvDEO4i224Uj3MKg2fo  
  16. 4SDy3P1GCAAj1ahNoQJBAP4FV9vLWdLOOwOLnBpXt6vru4HT5VIf9fCeBIemuQ4C  
  17. /yRtgU38zXWgZ8AAmS6EjBEUDnN/tWid6UBKfgPDwAkCQQDRBP+Y9wIYIaSxeL7B  
  18. nHhPT25yAJCGK+l6r2qeaHVQr81O9YjusEi8E2M5OxCRolKxC3L7hrLJX8z1oyOV  
  19. dNx9AkBqYGhzpgv+qNiz2mJL8dH8ECMc8lTFeJbw5eu1tw8mHAEnCyisNSMBkGQC  
  20. Vv3PKjjR6hlHKwMYRZDpmIh/IRmpAkEAr1soLGaeZSxkhVetgbUJ4k/bct0yYr4Y  
  21. ZQshwcAVHBpBforT1JwkiVUim3MIFYY/JbVbQ9XfzL4Ir9OsGMkv6QJAPaQnyNY5
  22. /D0PhXqODOM6jtAHHRfaSi4gve6AZ0iRz6YlB8beJ1ywZaJZWD9Cuw3zy4dDpCOn  
  23. A4tBsIdpMMoT+w==  
  24. -----END PRIVATE KEY-----';  
  25.     /** 
  26.     *返回對應的私鑰 
  27.     */
  28.     privatestatic function getPrivateKey(){  
  29.         $privKey = self::$PRIVATE_KEY;  
  30.         return openssl_pkey_get_private($privKey);        
  31.     }  
  32.     /** 
  33.      * 私鑰加密 
  34.      */
  35.     publicstatic function privEncrypt($data)  
  36.     {  
  37.         if(!is_string($data)){  
  38.                 return null;  
  39.         }             
  40.         return openssl_private_encrypt($data,$encrypted,self::getPrivateKey())? base64_encode($encrypted) : null;  
  41.     }  
  42.     /** 
  43.      * 私鑰解密 
  44.      */
  45.     publicstatic function privDecrypt($encrypted)  
  46.     {  
  47.         if(!is_string($encrypted)){  
  48.                 return null;  
  49.         }  
  50.         return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey()))? $decrypted : null;  
  51.     }  
  52. }  
  53. ?>  

開啟private_key.pem,將上面的$PRIVATE_KEY,替換成private_key.pem的內容即可,伺服器端我們只需要使用私鑰來加密解密。

第三步,android前端,使用java的Cipher類來實現加密解密類,程式碼如下:

  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.InputStream;  
  4. import java.security.KeyFactory;  
  5. import java.security.NoSuchAlgorithmException;  
  6. import java.security.PublicKey;  
  7. import java.security.spec.X509EncodedKeySpec;  
  8. 相關推薦

    RSA解密

    美食廣場匯  美食 一、當做到RSA加密這塊時,遇到了問題,我自己加密的自己解密可以,Android端他自己加密自己解密,但是相互加密的都解不開; 然後我就想問題所在:1、是不是私鑰公鑰沒對呢?2、安卓和PHP伺服器端  加密方式機密方式對應關係有問題

    懂大資料?這幾種常用的幾種大資料架構剖析

    資料分析工作雖然隱藏在業務系統背後,但是具有非常重要的作用,資料分析的結果對決策、業務發展有著舉足輕重的作用。隨著大資料技術的發展,資料探勘、資料探索等專有名詞曝光度越來越高,但是在類似於Hadoop系列的大資料分析系統大行其道之前,資料分析工作已經經歷了長足的發展,尤其是以BI系統為主的資

    電阻,電容,電感這些知識

    1.6.1電阻元件的識別與應用 1.電阻元件的識別 (1)電阻的分類、特點及用途 電阻的種類較多,按製作的材料不同,可分為繞線電阻和非繞線電阻兩大類。非繞線電阻因製造材料的不同,有碳膜電阻、金屬膜電阻、金屬氧化膜電阻、實心碳質電阻等。另外還有一類特殊用途的電

    #Java基礎知識之面試題總結,快來看看

    什麼是Java程式的主類?應用程式和小程式的主類有何不同? 一個程式中可以有多個類,但只能有一個類是主類。在Java應用程式中,這個主類是指包含main()方法的類。而在Java小程式中,這個主類是一個繼承自系統類JApplet或Applet的子類。應用程式的主

    Java環境的正確配置

    在很多新手入門學習Java的小夥伴都會面臨到Java環境的配置,今天小編帶大家來配置Java的環境配置,首先到官網下載Jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    Python分散式爬蟲!以為看看這篇教程!萬字長文!

    背景一、前沿1.1 爬蟲是什麼?網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動的抓取全球資訊網資訊的程式或者指令碼。1.2 為什麼是Python?簡單易學:簡單到沒有學習過任何程式語言的人稍微看下資料就能編寫出

    python經典面試題:想找工作?這些面試題

    輸出結果 classes readline 應用 all 就是 last 如果 合數 ? 前言 什麽?你要去找工作?先別急著找工作,先把下面的python面試題先給看了吧,不然你就只是去面試而不是找工作。話說不打沒準備的仗,下面這些基本的面試題都不會你怎麽可能找到工作呢

    刪除的U盤文件如何恢復?這兩個妙招

    恢復 第三方 選項 所在 掃描 鼠標 安全衛士 下載 安全 現在的人們都很喜歡用U盤來存儲一些我們比較重要的數據,這是因為U盤的比較安全便於攜帶,但有時候我們還是會出現一些失誤的操作,致使我們的U盤文件被刪除,但是我們的U盤不像電腦有回收站可以找回,我們刪除之後,該如何恢復

    Linux面試必問題,想從事Linux工作這些

    mysq network 默認 實現 ip route 應用 統計數據 linux操作系統 default 筆者其實沒有想到去面試,只是在智聯上更新了一下簡歷,就陸陸續續接到很多獵頭的郵件和電話,閑話少說,下面就分享給大家Linuxer的面試經歷,下面這份是獵頭發給我的崗位

    Redis系列總結--這幾點

    文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。 前面幾篇已經對Redis中幾個關鍵知識點做了介紹,本篇主要對Redis系列做一下總結以及對Redis中常見面試題簡單進行介紹一下。首先我們對前面幾篇談到的Redis知識點進行總結。 第1篇:Redis系列開篇文章可以

    【Spring註解驅動開發】使用@Autowired@Qualifier@Primary三大註解自動裝配元件,

    ## 寫在前面 > 【Spring專題】停更一個多月,期間在更新其他專題的內容,不少小夥伴紛紛留言說:冰河,你【Spring專題】是不是停更了啊!其實並沒有停更,只是中途有很多小夥伴留言說急需學習一些知識技能,以便於跳槽,哈哈,大家都懂得!所以,中途停更了一段時間,寫了一些其他專題的文章。現在,繼續更

    MyBatis 延遲載的三種載方式深入,get

    ble 必須 關聯 數據 之前 默認值 種類型 加載 節點 延遲加載   延遲加載對主對象都是直接加載,只有對關聯對象是延遲加載。   延遲加載可以減輕數據庫的壓力,   延遲加載不可是一條SQL查詢多表信息,這樣構不成延遲加載,會形成直接加載。   延遲加載分為三種類型:

    系統地自學 好Python,真的?自學python步驟和知識點

    自的同學的是非常想學好 Python的,想在有一技能生活或著興趣。一方面被七七八八的瑣事糾纏,一直沒能動手,另一方面,擔心學習的費用高,心裡默默敲著退堂鼓? 那恭喜您有幸的看到了這篇文章,Python 是一門對初學者程式語言,想要完全掌握它,你不要花上太多的時間和精力。甚至短時間內就能學會,

    冠希老師看流淚,分散式儲存愛我

    本文由微信公眾號DappVision原創首發,轉載請聯絡授權 如今全球資料儲存量呈現爆炸式增長,企業及網際網路資料以每年50%的速率在增長,據預測,到2020年,全球資料量將達到35ZB,等於80億塊4TB硬碟。資料結構變化給儲存系統帶來新的挑戰。非結構化資料在儲存系統中所

    float,double,decimal彼此轉換出現的精度問題(今天Bug?)

    在一開始先說明下,此處的精度問題並不包含數字過大、強轉溢位之類導致的問題,主要說明三者之間比較或計算時容易產生的精度問題,以避免開發中莫名其妙的資料問題。 大學時學的是C語言,雖然就沒學會過,但對於float和double的描述還是記的很清楚,float和double因為採

    單例模式真的(上篇)?

    >單例模式相信是很多程式設計師接觸最多的了,也是面試過程中考察最頻繁的一個了,不知道你有沒有被問過這道面試題?歡迎留言討論。 今天我們來重點討論一下單例的幾個問題,及如何正確的實現一個單例,然後你再來回顧一下,你之前的回答或者使用方式是否正確。 ## 為何要使用單例 單例非常簡單,一個類只允許建立一個

    Myabtis動態SQL,真的

    ### 目錄 - 前言 - 什麼是動態SQL? - 常用的標籤 - if - choose、when、otherwise - where - foreach - set - sql - include - 總結 - 拓展一下 - Mybatis中如何避免魔數? - 如何

    爛大街的 Spring 迴圈依賴問題,覺得自己

    > 文章已收錄在 GitHub [JavaKeeper](https://github.com/Jstarfish/JavaKeeper) ,N 線網際網路開發、面試必備技能兵器譜,筆記自取。 > > 微信搜「 **JavaKeeper** 」程式設計師成長充電站,網際網路技術武道場。無套路

    java rsa解密算法的實現

    binary 0x03 object sat ear exc triple turn create RSAUtils:RSA加解密的實現 package com.rsa.test; import java.io.ByteArrayOutputStream; import

    CentOS7防火墻(Firewalld),

    targe ref net blank aliyun 官方 wal http edge 阿裏雲官方教程: https://help.aliyun.com/knowledge_detail/41317.html 百度參考的牛人教程(推薦): http://www.111c