1. 程式人生 > >android 端RSA加密過程中遇到的坑

android 端RSA加密過程中遇到的坑

做過android 端 rsa 加密的朋友估計都會遇到一些問題。本人這個問題苦惱了我2天的時間最終搞定。

大體說下遇到的問題吧:

客戶端生成的祕鑰對於同一個字串而言,一直是相同的比如我用  隨機串 “123456” 生成兩次 ,得到的結果都是一個值。

客戶端生成的祕鑰服務端沒法解密。(提示祕鑰損壞、字串過程、字元非法等等)

客戶端生成的祕鑰沒法放到標頭檔案 (裡面有好多空格)

解決的方案:

對於第一個問題: 服務端對於這個物件的建立是這樣的

Cipher cipher = Cipher.getInstance("RSA")
接下來android 客戶端也是這樣的Cipher加密方式 但是裡面的加密方式不可以這樣寫,要改成如下的樣式
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
具體什麼原因自己可以去百度下。
 第二個問題:客戶端生成的祕鑰服務端沒法解密,這個我們要先檢查下 自己生成的加密字串和服務端加密的字串長度
是否一樣,儘量裡面不能有空格。java裡面對字串進行Base64規範傳輸的時候是要的java.util包下的
Base64或者 BASE64Encoder()這個檔案 ,在這裡建議大家不要去用這兩個包,因為andorid裡面是沒有這兩個包的
即使你的jdk版本里面是帶有的你也拿不到。也不要想著去下載一個jar包。
在這裡大家就用android.util.Base64下的包。
  第三個問題是重點:Base64.encode()的構造方法中是需要串flag引數的。對於Base64.DEFAULT
他對你的格式不改變只是做個規範傳輸。針對第二步我們可以列印下生成出來的加密字串,雖然有時
你看不出來有空格或者換行,但是實際拷貝到檔案中的時候是能看出來的。所以這時候我們就不能用Base64
.DEFAULT這個flag  我們要選用 Base64.NO_WRAP 這個可以幫你把所有格式清除掉。
到這裡基本上問題就不到了。我們來看下實際的程式碼吧。這裡給大家提供一個祕鑰值
private static final String PUCLIC_KEY ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD/jU7MtLJxDdA+hWv5wxyOHw4I
\n" + "YhULJMdpj4aoEKPtHVzfZkrdoHPj0JYPzBZmpChb3Eut63pryBq+rZHideSDfI56\n" + "ETpxZ6P6euRzDVRPjGS+5HoZf5pB3cmQok4SYLkhYy2f1v6tWpEpA6tOBVKcUD1q\n" + "VMm2Bva9sf7zFSJzCwIDAQBC" ;
   //我這邊直接把公鑰key拿出來了。實際專案中你們可以放到assets中,其他地方能獲取到的都行
  //放在檔案中你可以直接用Object流讀取
   // ObjectInputStream o = new ObjectInputStream("帶上你的assets流");
   // RSAPublicKey publicKey=(RSAPublicKey)o.readObject();

   byte[] buffer = Base64.decode(PUCLIC_KEY, Base64.NO_WRAP);
   KeyFactory keyFactory = null;
   try {
    keyFactory = KeyFactory.getInstance("RSA");
    //這個地方一定要和和服務端的保持一致 這是個行標。用它來生成一個RSAPublicKey
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);    //這邊也是重點 
    "RSA/ECB/PKCS1Padding" 這個地方客戶端必須要這樣寫
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    //此處如果寫成"RSA"加密出來的資訊JAVA伺服器無法解析
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] output = cipher.doFinal("123456".getBytes("utf-8"));
miwen = Base64.encodeToString(output, Base64.NO_WRAP);
} catch (Exception e) {
    e.printStackTrace();
}
好了都這裡基本都解決了。還有個AES加密 估計還有問題有問題的話下一章就是寫它了。不明白的或者
需要給建議的可以發  油件 吧  [email protected]

相關推薦

android RSA加密過程遇到的

做過android 端 rsa 加密的朋友估計都會遇到一些問題。本人這個問題苦惱了我2天的時間最終搞定。大體說下遇到的問題吧:客戶端生成的祕鑰對於同一個字串而言,一直是相同的比如我用  隨機串 “123456” 生成兩次 ,得到的結果都是一個值。客戶端生成的祕鑰服務端沒

Django+Vue+微信登入授權前後分離實現過程問題階段性總結

我要說明的是另外以下幾點: 跨域問題 關於跨域問題是指在開發前端頁面使用前端熱更新除錯過程中與Django進行的資料請求產生的跨域問題. 例如你在本地 http://localhost:8080/#/ 除錯介面請求Django本地伺服器 http://l

Android開發過程及解決方法收錄(四)

1.某個控制元件要放在Linearlayout佈局的底部(底部導航條) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.

Android開發過程及解決方法收錄

  1.某個控制元件要放在Linearlayout佈局的底部(底部導航條)      <LinearLayout      android:layout_width="match_parent"      android:orientation="vertical"      android:layou

Android 圖片剪下 UCrop 使用過程

UCrop 的GitHub地址 https://github.com/Yalantis/uCrop/ UCrop 的屬性和使用方式 地址http://blog.csdn.net/liutaoblog/article/details/52452410 我的專案要求是從本地拿到

Android客戶與伺服器RSA加密通訊加密字元不一致相關問題

RSA非對稱加密演算法 ,適用於資料量較小的情況,比如一般的用法: 1、生成RSA金鑰對,公鑰發給客戶端使用,私鑰由伺服器使用; 2、客戶端用公鑰加密所有發出的資料,也用公鑰解密所有收到的資料; 3、伺服器用私鑰加密所有發出的資料,也用私鑰解密所有收到的資料; 但Andro

android RSA和Java RSA加密不一致的

最近專案採用RSA進行加密,遇到了坑,記錄一下 1、BASE64Decoder在Android中是不存在的,需用Base64替換, BASE64Decoder base64Decoder= new B

Android開發過程及解決方法收錄(五)

版本號 如果 出現 過程 androi 分享圖片 onf blog end 1. 導入依賴庫出現錯誤 因為使用的sdk版本不同,使用下列代碼強制使用最低版本,25.3.1就是我當前使用的版本號,根據自己的情況修改 configurations.all {

Android小部件Widget開發過程和總結

@[toc] # 概述 ### 官方參考 [Build an App Widget](https://developer.android.com/guide/topics/appwidgets/index.html#implementing_collections) ### 效果圖 放張效果圖,這是我玩

菜鳥幫你跳過openstack配置過程

如果 working ack 大坑 nbsp 模式 con ror centos 一:前言 對於一個以前做java全棧工程師而言,而且沒學過Linux,很少用虛擬機(還是在大學的時候簡單的用過),去配置openstack我想我入的坑肯定比有基礎的一

Android APP 調試過程遇到的問題。

state 答案 sta 問題 net rep www 原因 啟動 調試過過程中APP安裝完啟動後有的時候會異常退出,報這個錯誤。有的時候可以直接啟動。查找不到原因。網上說把commit方法替換成commitAllowingStateLoss() 也無效。

關於android studio 出現Error:Execution failed for task ':app:preDebugAndroidTestBuild'. 的解決辦法 前段時間開啟Android studio 在build過程總會出現以下錯誤

前段時間開啟Android studio 在build過程中總會出現以下錯誤 Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict with dependency 'co

selenium學習過程:message: no such element: Unable to locate element:

selenium使用過程中的坑 使用class標籤定位時報錯: message: no such element: Unable to locate element: {"method":"class name" 在測試過程中,定位一個驗證碼圖片時,由於執行速度過快,瀏

Android頁面跳轉過程值的傳遞

MainActivity.java部分程式碼 Intent intent = new Intent(MainActivity.this,ScowlViewActivity.class);//實現MainActivity向ScowlViewActivity跳轉 Bundle bundle

Tensorflow 實踐過程

1. dynamic-run函式的sequence_length引數 這個引數很重要的,尤其是當填充後的序列特別長,超過30後,一定要指定這個sequence_length告訴網路序列的真實有效長度,否則rnn在處理長序列的時候一定會出現梯度爆炸或消失的問題。 參考資料:https:

elasticsearch使用總結以及使用過程

who:誰發明了它 就是下面這位大哥 Shay Banon What:elasticsearch是什麼 elasticsearch開源並且免費(很關鍵)的全文檢索和分析的引擎,可以快速儲存,搜尋資料,還可以科學的分析資料 然額,elasticsearch本質上就是

阿里雲Centos7 安裝 k8s 叢集(使用過程

個人備忘 下面這個地址能滿足大部分需求 : 上文:5.2 的配置三臺伺服器都要修改 ,5.3 的命令 [[email protected] ~]# etcdctl mk /atomic.io/network/config '{ "Network": "1

Android 手機適配過程遇到的一些問題

手機適配,看到這幾個字,無論作為android 新手還是有幾年開發經驗的你,相信內心都會有稍微的一絲悸動。是的,相容性問題一直是困擾著我們開發者的一個世紀星難題,即使一個有豐富開發經驗的開發者,遇到這個問題相信也是先眉頭一緊,安卓手機不僅螢幕型別多,作業系統多,關鍵不同作業

Android外掛化開發過程遇到的問題總結

最近接手的一個專案,是在外掛分支裡開發一個功能。但是寫過demo之後,發現同樣的程式碼在專案中執行不起來。在此過程中遇到的問題總結一下,以便以後遇到同樣的問題直到問題出在哪。 一、四大元件的註冊 四大元件的使用是一定要宣告的,尤其是要在主站中宣告。並且在外掛化開發的過程中

agentmain 使用過程,看看你有沒有遇到

com.sun.tools.attach.AttachNotSupportedException: no providers installed 我出現這個報錯,是因為我引的包有問題,本地裝了jdk的話,可以這樣引用tools.jar <dependency> <gr