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

首頁 > 系統 > Android > 正文

Android 登錄密碼信息進行RSA加密示例

2019-10-23 19:45:14
字體:
來源:轉載
供稿:網友

首先 有服務端生產一對公鑰和私鑰 我們在進行加密之前,先從服務器獲取公鑰,獲取到公鑰串之后,在對密碼進行加密。

 

復制代碼 代碼如下:

map.put("password", new String(Hex.encodeHex(RSAUtils.encryptByPublicKey(password,rsastr))));

 

此處,就是在登陸之前,對密碼進行加密

password:登錄密碼 rsastr:從服務器獲取的公鑰串

Hex.encodeHex:對加密后的密碼串進行編碼,項目中需要集成相應的jar。

下面給出 RSAUtils的代碼

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 * @version 1.0 * @date 2012-4-26 */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 = Base64Utils.decode(privateKey);    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 Base64Utils.encode(signature.sign());  }  /**   * <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 = Base64Utils.decode(publicKey);    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(Base64Utils.decode(sign));  }  /**   * <P>   * 私鑰解密   * </p>   *   * @param encryptedData 已加密數據   * @param privateKey  私鑰(BASE64編碼)   * @return   * @throws Exception   */  public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)      throws Exception {    byte[] keyBytes = Base64Utils.decode(privateKey);    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);//    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    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 = Base64Utils.decode(publicKey);    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key publicK = keyFactory.generatePublic(x509KeySpec);//    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");    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 sourcedata   源數據   * @param publicKey 公鑰(BASE64編碼)   * @return   * @throws Exception   */  public static byte[] encryptByPublicKey(String sourcedata, String publicKey)      throws Exception {    byte[] data = sourcedata.getBytes();    byte[] keyBytes = Base64Utils.decode(publicKey);    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key publicK = keyFactory.generatePublic(x509KeySpec);    // 對數據加密//    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");    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 = Base64Utils.decode(privateKey);    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);//    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");    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 Base64Utils.encode(key.getEncoded());  }  /**   * <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 Base64Utils.encode(key.getEncoded());  }  //  把byte[]元素之間添加空格,并轉化成字符串返回,  public static String byteToString(byte[] resouce){    StringBuffer sb = new StringBuffer();    for (int i = 0; i < resouce.length; i++) {      if (i == resouce.length-1) {        sb.append(Byte.toString(resouce[i]));      }else{        sb.append(Byte.toString(resouce[i]));        sb.append(" ");      }    }    return sb.toString();  }  //  把字符串按照空格進行拆分成數組,然后轉化成byte[],返回  public static byte[] stringToByte(String resouce){    String[] strArr = resouce.split(" ");    int len = strArr.length;    byte[] clone = new byte[len];    for (int i = 0; i < len; i++) {      clone[i] = Byte.parseByte(strArr[i]);    }    return clone;  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 菏泽市| 巩留县| 湖北省| 上杭县| 囊谦县| 全椒县| 筠连县| 犍为县| 咸宁市| 五华县| 五常市| 页游| 台中市| 红桥区| 南投县| 怀宁县| 门头沟区| 蒙山县| 综艺| 远安县| 北川| 垦利县| 齐齐哈尔市| 城步| 晋城| 彰化市| 雷波县| 通江县| 临漳县| 朝阳区| 毕节市| 大连市| 横山县| 南昌县| 巨鹿县| 施秉县| 冕宁县| 汉寿县| 万宁市| 苏尼特左旗| 金门县|