Android中的各種加密和MD5摘要
阿新 • • 發佈:2019-02-10
簡單總結了下android中用到的加密方式和MD5摘要演算法。不完整,還會繼續追加的。
/
** * Created by zhoukai on 2016/3/25. */ public class DigestUtils { //base64編碼 其中兩個引數第一個為要編碼的內容,第二個為編碼的格式 public static String base64_Encode(String val){ byte[] input_byte = val.getBytes(); byte[] encode_byte = Base64.encode(input_byte, Base64.NO_WRAP); String result_base64Encode= new String(encode_byte); return result_base64Encode; } //base64解碼 public static String base64_Decode(String val){ byte[] decode_byte = Base64.decode(val.getBytes(), Base64.NO_WRAP); String result_base64Decode= new String(decode_byte); returnresult_base64Decode; } //aes加密 只需要一套密碼即可 密碼長度64bit也就是必須是8位 public byte[] desEncode(String desEncode_data,String password){ byte desEncode_result[] = null; try { //建立加密引擎 Cipher cipher = Cipher.getInstance("DES"); //根據引數生成key SecretKey key = new SecretKeySpec(password.getBytes(),"DES"); //對Cipher進行初始化設定為加密模式 cipher.init(Cipher.ENCRYPT_MODE,key); //加密資料 desEncode_result = cipher.doFinal(desEncode_data.getBytes()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } return desEncode_result; } //des解密 public static byte[] desDecode(String desDecode_data, String password) { byte[] desDecode_result = null; try { Cipher cipher = Cipher.getInstance("DES"); SecretKeySpec key = new SecretKeySpec(password.getBytes(),"DES"); //解密時只需將引擎初始化模式設定為DECRYPT_MODE即可 cipher.init(Cipher.DECRYPT_MODE,key); desDecode_result = cipher.doFinal(desDecode_data.getBytes()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } return desDecode_result; } /* aes加密有兩種方式,其中一種和des相同 區別在於初始化引擎的時候呼叫 Cipher cipher = Cipher.getInstance("AES"); aes的第二種加密方式如下 */ public static byte[] aes2Encode(byte[] data, byte[] password, byte[] ivParams) { byte[] ret = null; //首先對資料和密碼進行判讀 try { //CBC指定加密的工作模式,PKCS5Padding就相當於第二個密碼,要不要攜帶引數 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec key = new SecretKeySpec(password,"AES"); //IvParameterSpec就相當於第二個密碼 IvParameterSpec params = new IvParameterSpec(ivParams); //Cipher初始化,引數中就多了一個IvParameterSpec; //在對Cipher進行初始化時,必須要給它在傳遞一個引數IvParameterSpec,就相當於第二個密碼 cipher.init(Cipher.ENCRYPT_MODE,key,params); //將資料返回了 ret = cipher.doFinal(data); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } return ret; } public static byte[] aes2Decode(byte[] data, byte[] password, byte[] ivParams) { byte[] ret = null; //首先對資料和密碼進行判讀 try { //CBC指定加密的工作模式,PKCS5Padding就相當於第二個密碼,要不要攜帶引數 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec key = new SecretKeySpec(password,"AES"); //IvParameterSpec就相當於第二個密碼 IvParameterSpec params = new IvParameterSpec(ivParams); //Cipher初始化,引數中就多了一個IvParameterSpec; //在對Cipher進行初始化時,必須要給它在傳遞一個引數IvParameterSpec,就相當於第二個密碼 cipher.init(Cipher.DECRYPT_MODE,key,params); //將資料返回了 ret = cipher.doFinal(data); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } return ret; } //MD5摘要 public static String md5Digest(String val) { //建立指定演算法名稱的MessageDigest 例項物件。 MessageDigest md5 = null; String md5_result=null; try { md5 = MessageDigest.getInstance("MD5"); // 使用指定的位元組陣列對摘要進行最後更新,然後完成摘要計算。 byte[] md5_byte= md5.digest( val.getBytes("UTF-8")); //將位元組陣列轉化為字串 md5_result = new String(md5_byte); return md5_result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return md5_result; }
/*補充:android中的RSA加密,在開發過程中有些地方還是用到的,例如當我們在專案中整合支付寶的時候,支付寶要求的第一步就是商戶註冊,然後緊接著就是獲取私鑰和公鑰。公鑰我們要上傳給支付寶,對於我們沒什麼用,但是私鑰。我們就需要用於訂單的RSA簽名,因為一個完整的訂單資訊包括的內容為
String payInfo = "商品資訊"+ "&sign=\"" + "rsa簽過名的資訊" + "\"&"
+"sign_type=\"RSA\"";
通過我們上傳的公鑰支付寶對商品資訊就行解密,因此rsa是一種非對稱加密演算法,下面附上rsa加密和解密的方法
*/
/** * RAS密碼通過KeyPareGenerator創建出來 * 將私鑰存放到檔案中,公鑰存放到shareprefrence中*/ public void generateRSA() { try { //1、獲取建立私鑰和公鑰的生成這KeyPairGenerator KeyPairGenerator keyPairGenerator =KeyPairGenerator.getInstance("RSA"); //2、初始化,1024bit=128byte,相當於128個英文字母 keyPairGenerator.initialize(1024); //3、獲取公鑰和私鑰 KeyPair keyPair = keyPairGenerator.generateKeyPair(); //獲取公鑰 aPublic = keyPair.getPublic(); SharedPreferences sp = getSharedPreferences("RSA", MODE_PRIVATE); //1、通過公鑰的getEncoded()方法獲取公鑰的內容,內部資料 byte[] aPublicEncoded = aPublic.getEncoded(); //2、對獲取的位元組資料,進行Base64轉換 byte[] encode = Base64.encode(aPublicEncoded, Base64.DEFAULT); //3、轉後的資料存到SharePreferrences SharedPreferences.Editor editor = sp.edit(); editor.putString("aPublic",new String(encode)); editor.commit(); //*************************************************************************************888 //獲取私鑰 aPrivate = keyPair.getPrivate(); //將私鑰存入檔案中 file = new File(this.getCacheDir()+File.separator+"rsa"); if(!file.exists()){ //建立這個file try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } //1、獲取資料 byte[] encoded = aPrivate.getEncoded(); //2、對資料進行Base64編碼 byte[] encode1 = Base64.encode(encoded, Base64.DEFAULT); //將資料存入到檔案 try { FileOutputStream fos = new FileOutputStream(file); //將私鑰的資料寫入到檔案中 fos.write(encode1); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } }
//以下就是rsa的加密和解密方式,只需要將私鑰和公鑰傳入即可
public static byte[] rsaEncode(byte[] data, PrivateKey aPrivate) { byte[] ret = null; if(data!=null&&data.length>0){ byte[] encoded = aPrivate.getEncoded(); if(encoded!=null&&encoded.length>0){ try { //1、建立RSA的加密引擎 Cipher cipher = Cipher.getInstance("RSA"); //2、對加密引擎進行初始化 cipher.init(Cipher.ENCRYPT_MODE,aPrivate); //3、對資料進行加密 ret= cipher.doFinal(data); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } } } return ret; }
public static byte[] rsaDecode(byte[] decode, PublicKey aPublic) { byte[] ret = null; if (decode!=null&&decode.length>0){ byte[] aPublicEncoded = aPublic.getEncoded(); if(aPublicEncoded!=null&&aPublicEncoded.length>0){ //進行解密 try { //1 Cipher cipher = Cipher.getInstance("RSA"); //2 cipher.init(Cipher.DECRYPT_MODE,aPublic); //3 ret = cipher.doFinal(decode); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } } } return ret; }
}