国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 客戶端RSA加密的實現方法

2019-10-22 18:29:19
字體:
來源:轉載
供稿:網友

Android 客戶端RSA加密的實現方法

針對java后端進行的RSA加密,android客戶端進行解密,結果是部分亂碼的問題:

注意兩點,編碼問題和客戶端使用的算法問題

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

移動端使用

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

后端使用

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

其他地方都不需要改動

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;/** *//** * <p> * BASE64編碼解碼工具包 * </p> * @author IceWee * @date 2012-5-19 * @version 1.0 */public class Base64Utils {  /** *//**   * 文件讀取緩沖區大小   */  private static final int CACHE_SIZE = 1024;  /** *//**   * <p>   * BASE64字符串解碼為二進制數據   * </p>   *   * @param base64   * @return   * @throws Exception   */  public static byte[] decode(String base64) throws Exception {    return Base64.decode(base64.getBytes(), Base64.DEFAULT);  }  /** *//**   * <p>   * 二進制數據編碼為BASE64字符串   * </p>   *   * @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);  }  /** *//**   * <p>   * 將文件編碼為BASE64字符串   * </p>   * <p>   * 大文件慎用,可能會導致內存溢出   * </p>   *   * @param filePath 文件絕對路徑   * @return   * @throws Exception   */  public static String encodeFile(String filePath) throws Exception {    byte[] bytes = fileToByte(filePath);    return encode(bytes);  }  /** *//**   * <p>   * BASE64字符串轉回文件   * </p>   *   * @param filePath 文件絕對路徑   * @param base64 編碼字符串   * @throws Exception   */  public static void decodeToFile(String filePath, String base64) throws Exception {    byte[] bytes = decode(base64);    byteArrayToFile(bytes, filePath);  }  /** *//**   * <p>   * 文件轉換為二進制數組   * </p>   *   * @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;  }  /** *//**   * <p>   * 二進制數據寫文件   * </p>   *   * @param bytes 二進制數據   * @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;/** * <p> * RSA公鑰/私鑰/簽名工具包 * </p> * <p> * 羅納德·李維斯特(Ron [R]ivest)、阿迪·薩莫爾(Adi [S]hamir)和倫納德·阿德曼(Leonard [A]dleman) * </p> * <p> * 字符串格式的密鑰在未在特殊說明情況下都為BASE64編碼格式<br/> * 由于非對稱加密速度極其緩慢,一般文件不使用它來加密而是使用對稱加密,<br/> * 非對稱加密算法可以用來對對稱加密的密鑰加密,這樣保證密鑰的安全也就保證了數據的安全 * </p> * * @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;  /**   * <p>   * 生成密鑰對(公鑰和私鑰)   * </p>   *   * @return   * @throws Exception   */  public static Map<String, Object> 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<String, Object> keyMap = new HashMap<String, Object>(2);    keyMap.put(PUBLIC_KEY, publicKey);    keyMap.put(PRIVATE_KEY, privateKey);    return keyMap;  }  /**   * <p>   * 用私鑰對信息生成數字簽名   * </p>   *   * @param data 已加密數據   * @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);  }  /**   * <p>   * 校驗數字簽名   * </p>   *   * @param data 已加密數據   * @param publicKey 公鑰(BASE64編碼)   * @param sign 數字簽名   *   * @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));  }  /**   * <P>   * 私鑰解密   * </p>   *   * @param encryptedData 已加密數據   * @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;    // 對數據分段解密    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;  }  /**   * <p>   * 公鑰解密   * </p>   *   * @param encryptedData 已加密數據   * @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;    // 對數據分段解密    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;  }  /**   * <p>   * 公鑰加密   * </p>   *   * @param data 源數據   * @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);    // 對數據加密    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;    // 對數據分段加密    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;  }  /**   * <p>   * 私鑰加密   * </p>   *   * @param data 源數據   * @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;    // 對數據分段加密    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;  }  /**   * <p>   * 獲取私鑰   * </p>   *   * @param keyMap 密鑰對   * @return   * @throws Exception   */  public static String getPrivateKey(Map<String, Object> keyMap)      throws Exception {    Key key = (Key) keyMap.get(PRIVATE_KEY);    return Base64.encodeToString(key.getEncoded(),0);  }  /**   * <p>   * 獲取公鑰   * </p>   *   * @param keyMap 密鑰對   * @return   * @throws Exception   */  public static String getPublicKey(Map<String, Object> keyMap)      throws Exception {    Key key = (Key) keyMap.get(PUBLIC_KEY);    return Base64.encodeToString(key.getEncoded(), 0);  }}

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庐江县| 宁津县| 苏尼特右旗| 福泉市| 临朐县| 海口市| 陵川县| 石渠县| 博兴县| 景宁| 珠海市| 潮州市| 平陆县| 台南市| 开封县| 屯昌县| 雷山县| 高安市| 雷州市| 昌乐县| 高雄市| 高尔夫| 报价| 饶平县| 抚远县| 肥城市| 莎车县| 韶山市| 洪雅县| 娄烦县| 拜泉县| 江山市| 中阳县| 册亨县| 丰原市| 康定县| 禄丰县| 松溪县| 思南县| 靖远县| 海城市|