1. 程式人生 > >Android中的各種加密和MD5摘要

Android中的各種加密和MD5摘要

簡單總結了下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); return
result_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;
}


}