Android 端 Rsa加密數據

1.android 端加密方式

  • 非對稱加密 (RSA)
  • 對稱加密 (DES,AES,3DES)
  • MD5加密
  • BASE64編碼

ps:這篇主要介紹android rsa加密前端

2.Rsa加密原理

1.隨機選擇兩個大質數p和q,p不等於q,計算N=pq;java

2.選擇一個大於1小於N的天然數e,e必須與(p-1)(q-1)互素。android

3.用公式計算出d:d×e = 1 (mod (p-1)(q-1)) 。算法

4.銷燬p和q。後端

最終獲得的N和e就是「公鑰」,d就是「私鑰」,發送方使用N去加密數據,接收方只有使用d才能解開數據內容。安全

3.Rsa相比對稱加密算法優缺點

優勢:bash

  • 對稱加密比對稱加密算法更安全

缺點:服務器

  • 加密速度更慢,適用於加密少許數據

4.示例 (公鑰加密,私鑰解密)

經過公鑰字符串 獲取PublicKey對象編碼

byte[] buffer = Base64Utils.decode(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            RSAPublicKey publicKey =  (RSAPublicKey) RSAPublicKey.generatePublic(keySpec);
複製代碼

使用publickey加密數據加密

Cipher cipher = Cipher.getInstance("轉換");
            // 編碼前設定編碼方式及密鑰
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            // 傳入編碼數據並返回編碼結果
            byte[] encrptData = cipher.doFinal(data);
複製代碼

幾個關鍵參數介紹:

1.轉換 是一個字符串,它描述爲產生某種輸出而在給定的輸入上執行的操做(或一組操做); 形式能夠是 算法/模式/填充算法; 常見的模式以下:

RSA (若是你的明文不夠128字節加密的時候會在你的明文前面,前向的填充零。解密後的明文也會包括前面填充的零,這是服務器須要注意把解密後的字段前向填充的零去掉,纔是真正以前加密的明文。)

RSA/ECB/PKCS1Padding (加密的時候會在你的明文中隨機填充一些數據,因此會致使對一樣的明文每次加密後的結果都不同)

RSA/None/PKCS1Padding

第一個 RSA 等價於 RSA/None/NoPadding .使用此模式加密後 同一個明文、同一個公鑰每次生成同一個密文.攻擊者可以據此識別到同一個信息都是什麼時候被髮送。 因此通常使用第二個 RSA/ECB/PKCS1Padding .

2.編碼方式設定

cipher.init(MODE, publicKey);

常見編碼方式 (MODE):

ENCRYPT_MODE: Cipher 初始化爲加密模式的常量 (經常使用)

DECRYPT_MODE: Cipher 初始化爲解密模式的常量 (經常使用)

WRAP_MODE :Cipher 初始化爲密鑰包裝模式的常量

UNWRAP_MODE :Cipher 初始化爲密鑰解包模式的常量

PUBLIC_KEY :解包的密鑰爲「公鑰」的常量

PRIVATE_KEY : 解包的密鑰爲「私鑰」的常量

SECRET_KEY :解包的密鑰爲「祕密密鑰」的常量

5.開發過程當中容易遇到的坑

1.客戶端須要與後端確認好使用同一轉換模式 作到一一對應. 若是後端(java使用 RSA),則前端 須要使用(RSA/ECB/PKCS1Padding) 而不是 RSA.

2.前端請求下來的公鑰字符串若是 包含 "-----BEGIN PUBLIC KEY-----" 和 "-----END PUBLIC KEY-----",須要將其切掉,若是直接使用 會報 InvalidKeySpecException .

相關文章
相關標籤/搜索