真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android客戶端中怎么實(shí)現(xiàn)RSA加密功能

Android客戶端中怎么實(shí)現(xiàn)RSA加密功能,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)專業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站制作(企業(yè)站、自適應(yīng)網(wǎng)站建設(shè)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

Android 客戶端RSA加密的實(shí)現(xiàn)方法

針對(duì)java后端進(jìn)行的RSA加密,android客戶端進(jìn)行解密,結(jié)果是部分亂碼的問題:

注意兩點(diǎn),編碼問題和客戶端使用的算法問題

即:都使用UTF-8編碼,Base64使用一致,另外,使用下面的代碼在后端和移動(dòng)端解密只有一點(diǎn)不同:

移動(dòng)端使用

 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

后端使用

 Cipher cipher = Cipher.getInstance("RSA");

其他地方都不需要改動(dòng)

package rsa;

import android.util.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

//import org.apache.commons.codec.binary.Base64;

/** *//**
 * 

 * BASE64編碼解碼工具包  * 

 * @author IceWee  * @date 2012-5-19  * @version 1.0  */ public class Base64Utils {   /** *//**    * 文件讀取緩沖區(qū)大小    */   private static final int CACHE_SIZE = 1024;   /** *//**    * 

   * BASE64字符串解碼為二進(jìn)制數(shù)據(jù)    * 

   *    * @param base64    * @return    * @throws Exception    */   public static byte[] decode(String base64) throws Exception {     return Base64.decode(base64.getBytes(), Base64.DEFAULT);   }   /** *//**    * 

   * 二進(jìn)制數(shù)據(jù)編碼為BASE64字符串    * 

   *    * @param bytes    * @return    * @throws Exception    */   public static String encode(byte[] bytes) throws Exception {     return new String(Base64.encode(bytes, Base64.DEFAULT));   }   /**    *    * @param str    * @return    * @throws Exception    */   public static String encode(String str) throws Exception {     byte[] bytes = str.getBytes("utf-8");     return encode(bytes);   }   /** *//**    * 

   * 將文件編碼為BASE64字符串    * 

   * 

   * 大文件慎用,可能會(huì)導(dǎo)致內(nèi)存溢出    * 

   *    * @param filePath 文件絕對(duì)路徑    * @return    * @throws Exception    */   public static String encodeFile(String filePath) throws Exception {     byte[] bytes = fileToByte(filePath);     return encode(bytes);   }   /** *//**    * 

   * BASE64字符串轉(zhuǎn)回文件    * 

   *    * @param filePath 文件絕對(duì)路徑    * @param base64 編碼字符串    * @throws Exception    */   public static void decodeToFile(String filePath, String base64) throws Exception {     byte[] bytes = decode(base64);     byteArrayToFile(bytes, filePath);   }   /** *//**    * 

   * 文件轉(zhuǎn)換為二進(jìn)制數(shù)組    * 

   *    * @param filePath 文件路徑    * @return    * @throws Exception    */   public static byte[] fileToByte(String filePath) throws Exception {     byte[] data = new byte[0];     File file = new File(filePath);     if (file.exists()) {       FileInputStream in = new FileInputStream(file);       ByteArrayOutputStream out = new ByteArrayOutputStream(2048);       byte[] cache = new byte[CACHE_SIZE];       int nRead = 0;       while ((nRead = in.read(cache)) != -1) {         out.write(cache, 0, nRead);         out.flush();       }       out.close();       in.close();       data = out.toByteArray();     }     return data;   }   /** *//**    * 

   * 二進(jìn)制數(shù)據(jù)寫文件    * 

   *    * @param bytes 二進(jìn)制數(shù)據(jù)    * @param filePath 文件生成目錄    */   public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {     InputStream in = new ByteArrayInputStream(bytes);     File destFile = new File(filePath);     if (!destFile.getParentFile().exists()) {       destFile.getParentFile().mkdirs();     }     destFile.createNewFile();     OutputStream out = new FileOutputStream(destFile);     byte[] cache = new byte[CACHE_SIZE];     int nRead = 0;     while ((nRead = in.read(cache)) != -1) {       out.write(cache, 0, nRead);       out.flush();     }     out.close();     in.close();   } }
package rsa;

import android.util.Base64;

import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

/**
 * 

 * RSA公鑰/私鑰/簽名工具包  * 

 * 

 * 羅納德·李維斯特(Ron [R]ivest)、阿迪·薩莫爾(Adi [S]hamir)和倫納德·阿德曼(Leonard [A]dleman)  * 

 * 

 * 字符串格式的密鑰在未在特殊說明情況下都為BASE64編碼格式
 * 由于非對(duì)稱加密速度極其緩慢,一般文件不使用它來加密而是使用對(duì)稱加密,
 * 非對(duì)稱加密算法可以用來對(duì)對(duì)稱加密的密鑰加密,這樣保證密鑰的安全也就保證了數(shù)據(jù)的安全  * 

 *  * @author IceWee  * @date 2012-4-26  * @version 1.0  */ public class RSAUtils {   /**    * 加密算法RSA    */   public static final String KEY_ALGORITHM = "RSA";   /**    * 簽名算法    */   public static final String SIGNATURE_ALGORITHM = "MD5withRSA";   /**    * 獲取公鑰的key    */   private static final String PUBLIC_KEY = "RSAPublicKey";   /**    * 獲取私鑰的key    */   private static final String PRIVATE_KEY = "RSAPrivateKey";   /**    * RSA最大加密明文大小    */   private static final int MAX_ENCRYPT_BLOCK = 117;   /**    * RSA最大解密密文大小    */   private static final int MAX_DECRYPT_BLOCK = 128;   /**    * 

   * 生成密鑰對(duì)(公鑰和私鑰)    * 

   *    * @return    * @throws Exception    */   public static Map genKeyPair() throws Exception {     KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);     keyPairGen.initialize(1024);     KeyPair keyPair = keyPairGen.generateKeyPair();     RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();     RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();     Map keyMap = new HashMap(2);     keyMap.put(PUBLIC_KEY, publicKey);     keyMap.put(PRIVATE_KEY, privateKey);     return keyMap;   }   /**    * 

   * 用私鑰對(duì)信息生成數(shù)字簽名    * 

   *    * @param data 已加密數(shù)據(jù)    * @param privateKey 私鑰(BASE64編碼)    *    * @return    * @throws Exception    */   public static String sign(byte[] data, String privateKey) throws Exception {     byte[] keyBytes = Base64.decode(privateKey,0);     PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);     Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);     signature.initSign(privateK);     signature.update(data);     return Base64.encodeToString(signature.sign(), 0);   }   /**    * 

   * 校驗(yàn)數(shù)字簽名    * 

   *    * @param data 已加密數(shù)據(jù)    * @param publicKey 公鑰(BASE64編碼)    * @param sign 數(shù)字簽名    *    * @return    * @throws Exception    *    */   public static boolean verify(byte[] data, String publicKey, String sign)       throws Exception {     byte[] keyBytes = Base64.decode(publicKey,0);     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     PublicKey publicK = keyFactory.generatePublic(keySpec);     Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);     signature.initVerify(publicK);     signature.update(data);     return signature.verify(Base64.decode(sign,0));   }   /**    * 

   * 私鑰解密    * 

   *    * @param encryptedData 已加密數(shù)據(jù)    * @param privateKey 私鑰(BASE64編碼)    * @return    * @throws Exception    */   public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)       throws Exception {     byte[] keyBytes = Base64.decode(privateKey, 0);     PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");     cipher.init(Cipher.DECRYPT_MODE, privateK);     int inputLen = encryptedData.length;     ByteArrayOutputStream out = new ByteArrayOutputStream();     int offSet = 0;     byte[] cache;     int i = 0;     // 對(duì)數(shù)據(jù)分段解密     while (inputLen - offSet > 0) {       if (inputLen - offSet > MAX_DECRYPT_BLOCK) {         cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);       } else {         cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);       }       out.write(cache, 0, cache.length);       i++;       offSet = i * MAX_DECRYPT_BLOCK;     }     byte[] decryptedData = out.toByteArray();     out.close();     return decryptedData;   }   /**    * 

   * 公鑰解密    * 

   *    * @param encryptedData 已加密數(shù)據(jù)    * @param publicKey 公鑰(BASE64編碼)    * @return    * @throws Exception    */   public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)       throws Exception {     byte[] keyBytes = Base64.decode(publicKey,0);     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     Key publicK = keyFactory.generatePublic(x509KeySpec);     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.DECRYPT_MODE, publicK);     int inputLen = encryptedData.length;     ByteArrayOutputStream out = new ByteArrayOutputStream();     int offSet = 0;     byte[] cache;     int i = 0;     // 對(duì)數(shù)據(jù)分段解密     while (inputLen - offSet > 0) {       if (inputLen - offSet > MAX_DECRYPT_BLOCK) {         cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);       } else {         cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);       }       out.write(cache, 0, cache.length);       i++;       offSet = i * MAX_DECRYPT_BLOCK;     }     byte[] decryptedData = out.toByteArray();     out.close();     return decryptedData;   }   /**    * 

   * 公鑰加密    * 

   *    * @param data 源數(shù)據(jù)    * @param publicKey 公鑰(BASE64編碼)    * @return    * @throws Exception    */   public static byte[] encryptByPublicKey(byte[] data, String publicKey)       throws Exception {     byte[] keyBytes = Base64.decode(publicKey,0);     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     Key publicK = keyFactory.generatePublic(x509KeySpec);     // 對(duì)數(shù)據(jù)加密     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.ENCRYPT_MODE, publicK);     int inputLen = data.length;     ByteArrayOutputStream out = new ByteArrayOutputStream();     int offSet = 0;     byte[] cache;     int i = 0;     // 對(duì)數(shù)據(jù)分段加密     while (inputLen - offSet > 0) {       if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {         cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);       } else {         cache = cipher.doFinal(data, offSet, inputLen - offSet);       }       out.write(cache, 0, cache.length);       i++;       offSet = i * MAX_ENCRYPT_BLOCK;     }     byte[] encryptedData = out.toByteArray();     out.close();     return encryptedData;   }   /**    * 

   * 私鑰加密    * 

   *    * @param data 源數(shù)據(jù)    * @param privateKey 私鑰(BASE64編碼)    * @return    * @throws Exception    */   public static byte[] encryptByPrivateKey(byte[] data, String privateKey)       throws Exception {     byte[] keyBytes = Base64.decode(privateKey,0);     PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.ENCRYPT_MODE, privateK);     int inputLen = data.length;     ByteArrayOutputStream out = new ByteArrayOutputStream();     int offSet = 0;     byte[] cache;     int i = 0;     // 對(duì)數(shù)據(jù)分段加密     while (inputLen - offSet > 0) {       if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {         cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);       } else {         cache = cipher.doFinal(data, offSet, inputLen - offSet);       }       out.write(cache, 0, cache.length);       i++;       offSet = i * MAX_ENCRYPT_BLOCK;     }     byte[] encryptedData = out.toByteArray();     out.close();     return encryptedData;   }   /**    * 

   * 獲取私鑰    * 

   *    * @param keyMap 密鑰對(duì)    * @return    * @throws Exception    */   public static String getPrivateKey(Map keyMap)       throws Exception {     Key key = (Key) keyMap.get(PRIVATE_KEY);     return Base64.encodeToString(key.getEncoded(),0);   }   /**    * 

   * 獲取公鑰    * 

   *    * @param keyMap 密鑰對(duì)    * @return    * @throws Exception    */   public static String getPublicKey(Map keyMap)       throws Exception {     Key key = (Key) keyMap.get(PUBLIC_KEY);     return Base64.encodeToString(key.getEncoded(), 0);   } }

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


當(dāng)前文章:Android客戶端中怎么實(shí)現(xiàn)RSA加密功能
文章路徑:http://weahome.cn/article/pisosp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部