Android通信加密

来源:互联网 发布:矩阵相乘的共轭转置 编辑:程序博客网 时间:2024/06/05 05:23

最近项目中需要和服务器端通信进行加密,无奈只好上咯。以下为本次加密所用到的一些类,和用法,

1:RSA加密

package com.shcc.microcredit.utils;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.security.KeyFactory;import java.security.PrivateKey;import java.security.PublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;public class RSAUtil {   public static String ALGORITHM = "RSA/ECB/PKCS1Padding";   public static String SIGN_ALGORITHMS = "SHA1WithRSA";// 摘要加密算饭   private static String log = "RSAUtil";   public static String CHAR_SET = "UTF-8";   /**    * 数据签名    *     * @param content    *            签名内容    * @param privateKey    *            私钥    * @return 返回签名数据    */   public static String sign(String content, String privateKey) {      try {         PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(               Base64Utils.decode(privateKey));         KeyFactory keyf = KeyFactory.getInstance("RSA");         PrivateKey priKey = keyf.generatePrivate(priPKCS8);         java.security.Signature signature = java.security.Signature               .getInstance(SIGN_ALGORITHMS);         signature.initSign(priKey);         signature.update(content.getBytes(CHAR_SET));         byte[] signed = signature.sign();         return Base64Utils.encode(signed);      } catch (Exception e) {         e.printStackTrace();      }      return null;   }   /**    * 签名验证    *     * @param content    * @param sign    * @param public_key    * @return    */   public static boolean verify(String content, String sign,                         String publicKey) {      try {         KeyFactory keyFactory = KeyFactory.getInstance("RSA");         byte[] encodedKey = Base64Utils.decode(publicKey);         PublicKey pubKey = keyFactory               .generatePublic(new X509EncodedKeySpec(encodedKey));         java.security.Signature signature = java.security.Signature               .getInstance(SIGN_ALGORITHMS);         signature.initVerify(pubKey);         signature.update(content.getBytes(CHAR_SET));         boolean bverify = signature.verify(Base64Utils.decode(sign));         return bverify;      } catch (Exception e) {         e.printStackTrace();      }      return false;   }   /**    * 通过公钥解密    *     * @param content待解密数据    * @param pk公钥    * @return 返回 解密后的数据    */   protected static byte[] decryptByPublicKey(String content, PublicKey pk) {      try {         Cipher ch = Cipher.getInstance(ALGORITHM);         ch.init(Cipher.DECRYPT_MODE, pk);         InputStream ins = new ByteArrayInputStream(Base64Utils.decode(content));         ByteArrayOutputStream writer = new ByteArrayOutputStream();         // rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开解密         byte[] buf = new byte[128];         int bufl;         while ((bufl = ins.read(buf)) != -1) {            byte[] block = null;            if (buf.length == bufl) {               block = buf;            } else {               block = new byte[bufl];               for (int i = 0; i < bufl; i++) {                  block[i] = buf[i];               }            }            writer.write(ch.doFinal(block));         }         return writer.toByteArray();      } catch (Exception e) {         // TODO Auto-generated catch block         e.printStackTrace();      }      return null;   }      /**    * 通过私钥解密    *     * @param content待解密数据    * @param pk公钥    * @return 返回 解密后的数据    */   protected static byte[] decryptByPrivateKey(String content, PrivateKey pk) {      try {         Cipher ch = Cipher.getInstance(ALGORITHM);         ch.init(Cipher.DECRYPT_MODE, pk);         InputStream ins = new ByteArrayInputStream(Base64Utils.decode(content));         ByteArrayOutputStream writer = new ByteArrayOutputStream();         // rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开解密         byte[] buf = new byte[128];         int bufl;         while ((bufl = ins.read(buf)) != -1) {            byte[] block = null;            if (buf.length == bufl) {               block = buf;            } else {               block = new byte[bufl];               for (int i = 0; i < bufl; i++) {                  block[i] = buf[i];               }            }            writer.write(ch.doFinal(block));         }         return writer.toByteArray();      } catch (Exception e) {         // TODO Auto-generated catch block         e.printStackTrace();      }      return null;   }   /**    * 通过私钥加密    *     * @param content    * @param pk    * @return,加密数据,未进行Base64Utils进行加密    */   protected static byte[] encryptByPrivateKey(String content, PrivateKey pk) {      try {         Cipher ch = Cipher.getInstance(ALGORITHM);         ch.init(Cipher.ENCRYPT_MODE, pk);         return ch.doFinal(content.getBytes(CHAR_SET));      } catch (Exception e) {         e.printStackTrace();         System.out.println("通过私钥加密出错");      }      return null;   }   /**    * 通过公钥加密    *     * @param content    * @param pk    * @return,加密数据,未进行Base64Utils进行加密    */   protected static byte[] encryptByPublicKey(String content, PublicKey pk) {      try {         Cipher ch = Cipher.getInstance(ALGORITHM);         ch.init(Cipher.ENCRYPT_MODE, pk);         return ch.doFinal(content.getBytes(CHAR_SET));      } catch (Exception e) {         e.printStackTrace();         System.out.println("通过公钥加密出错");      }      return null;   }   /**    * 解密数据,接收端接收到数据直接解密    *     * @param content    * @param key    * @return    */   public static String decryptByPublicKey(String content, String key) {      System.out.println(log + "decrypt方法中key=" + key);      if (null == key || "".equals(key)) {         System.out.println(log + "decrypt方法中key=" + key);         return null;      }      PublicKey pk = SignConfig.getPublicKey(key);      byte[] data = decryptByPublicKey(content, pk);      String res = null;      try {         res = new String(data, CHAR_SET);      } catch (UnsupportedEncodingException e) {         // TODO Auto-generated catch block         e.printStackTrace();      }      return res;   }   /**    * 解密数据,接收端接收到数据直接解密,解密内容    *     * @param content    * @param key    * @return    */   public static String decryptByPrivateKey(String content, String key) {      System.out.println(log + "decrypt方法中key=" + key);      if (null == key || "".equals(key)) {         System.out.println(log + "decrypt方法中key=" + key);         return null;      }      PrivateKey pk = SignConfig.getPrivateKey(key);      byte[] data = decryptByPrivateKey(content, pk);      String res = null;      try {         res = new String(data, CHAR_SET);      } catch (UnsupportedEncodingException e) {         // TODO Auto-generated catch block         e.printStackTrace();      }      return res;   }   /**    * 对内容进行加密    *     * @param content    * @param key私钥    * @return    */   public static String encryptByPrivateKey(String content, String key) {      PrivateKey pk = SignConfig.getPrivateKey(key);      byte[] data = encryptByPrivateKey(content, pk);      String res = null;      try {         res = Base64Utils.encode(data);      } catch (Exception e) {         // TODO Auto-generated catch block         e.printStackTrace();      }      return res;   }   /**    * 对内容进行加密    *     * @param content    * @param key公钥    * @return    */   public static String encryptByPublicKey(String content, String key) {      PublicKey pk = SignConfig.getPublicKey(key);      byte[] data = encryptByPublicKey(content, pk);      String res = null;      try {         res = Base64Utils.encode(data);      } catch (Exception e) {         // TODO Auto-generated catch block         e.printStackTrace();      }      return res;   }}
2:数据之间的HASH算法加密

package com.shcc.microcredit.utils;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class StringEncrypt {     /**     * 对字符串加密,加密算法使用MD5,SHA-1,SHA-256,默认使用SHA-256     *      * @param strSrc     *            要加密的字符串     * @param encName     *            加密类型     * @return     */    public static String Encrypt(String strSrc, String encName) {        MessageDigest md = null;        String strDes = null;        byte[] bt = strSrc.getBytes();        try {            if (encName == null || encName.equals("")) {                encName = "SHA-256";            }            md = MessageDigest.getInstance(encName);            md.update(bt);            strDes = bytes2Hex(md.digest()); // to HexString        } catch (NoSuchAlgorithmException e) {            return null;        }        return strDes;    }    public static String bytes2Hex(byte[] bts) {        String des = "";        String tmp = null;        for (int i = 0; i < bts.length; i++) {            tmp = (Integer.toHexString(bts[i] & 0xFF));            if (tmp.length() == 1) {                des += "0";            }            des += tmp;        }        return des;    }}
3:dese加密

package com.shcc.microcredit.utils;import java.io.UnsupportedEncodingException;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;/** * Created by liwenjie on 2015/11/9. */public class EncryptUtils {    private static final String Algorithm = "DESede";    /**     * ���ܷ���     *     * @param src     *            Դ���ݵ��ֽ�����     * @return     */    public static byte[] encryptMode(byte[] src,String PASSWORD_CRYPT_KEY) {        try {            // ������Կ            SecretKey deskey = new SecretKeySpec(                    build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);            // ʵ����Cipher            Cipher cipher = Cipher.getInstance(Algorithm);            cipher.init(Cipher.ENCRYPT_MODE, deskey);            return cipher.doFinal(src);        } catch (java.security.NoSuchAlgorithmException e1) {            e1.printStackTrace();        } catch (javax.crypto.NoSuchPaddingException e2) {            e2.printStackTrace();        } catch (java.lang.Exception e3) {            e3.printStackTrace();        }        return null;    }    /**     * ���ܺ���     *     * @param src     *            ���ĵ��ֽ�����     * @return     */    public static byte[] decryptMode(byte[] src,String PASSWORD_CRYPT_KEY) {        try {            SecretKey deskey = new SecretKeySpec(                    build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);            Cipher c1 = Cipher.getInstance(Algorithm);            c1.init(Cipher.DECRYPT_MODE, deskey);            return c1.doFinal(src);        } catch (java.security.NoSuchAlgorithmException e1) {            e1.printStackTrace();        } catch (javax.crypto.NoSuchPaddingException e2) {            e2.printStackTrace();        } catch (java.lang.Exception e3) {            e3.printStackTrace();        }        return null;    }    /**     * �����ַ���������Կ24λ���ֽ�����     *     * @param keyStr     * @return     * @throws UnsupportedEncodingException     */    public static byte[] build3DesKey(String keyStr)            throws UnsupportedEncodingException {        byte[] key = new byte[24];        byte[] temp = keyStr.getBytes("UTF-8");        if (key.length > temp.length) {            System.arraycopy(temp, 0, key, 0, temp.length);        } else {            System.arraycopy(temp, 0, key, 0, key.length);        }        return key;    }    public static void main(String[] args) {    }}
4:base64

package com.shcc.microcredit.utils;/* * Copyright (C) 2010 The MobileSecurePay Project * All right reserved. * author: shiqun.shi@Lakala.com */public final class Base64Utils {    static private final int     BASELENGTH           = 128;    static private final int     LOOKUPLENGTH         = 64;    static private final int     TWENTYFOURBITGROUP   = 24;    static private final int     EIGHTBIT             = 8;    static private final int     SIXTEENBIT           = 16;    static private final int     FOURBYTE             = 4;    static private final int     SIGN                 = -128;    static private final char    PAD                  = '=';    static private final boolean fDebug               = false;    static final private byte[]  base64Alphabet       = new byte[BASELENGTH];    static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];    static {        for (int i = 0; i < BASELENGTH; ++i) {            base64Alphabet[i] = -1;        }        for (int i = 'Z'; i >= 'A'; i--) {            base64Alphabet[i] = (byte) (i - 'A');        }        for (int i = 'z'; i >= 'a'; i--) {            base64Alphabet[i] = (byte) (i - 'a' + 26);        }        for (int i = '9'; i >= '0'; i--) {            base64Alphabet[i] = (byte) (i - '0' + 52);        }        base64Alphabet['+'] = 62;        base64Alphabet['/'] = 63;        for (int i = 0; i <= 25; i++) {            lookUpBase64Alphabet[i] = (char) ('A' + i);        }        for (int i = 26, j = 0; i <= 51; i++, j++) {            lookUpBase64Alphabet[i] = (char) ('a' + j);        }        for (int i = 52, j = 0; i <= 61; i++, j++) {            lookUpBase64Alphabet[i] = (char) ('0' + j);        }        lookUpBase64Alphabet[62] = (char) '+';        lookUpBase64Alphabet[63] = (char) '/';    }    private static boolean isWhiteSpace(char octect) {        return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);    }    private static boolean isPad(char octect) {        return (octect == PAD);    }    private static boolean isData(char octect) {        return (octect < BASELENGTH && base64Alphabet[octect] != -1);    }    /**     * Encodes hex octects into Base64     *     * @param binaryData Array containing binaryData     * @return Encoded Base64 array     */    public static String encode(byte[] binaryData) {        if (binaryData == null) {            return null;        }        int lengthDataBits = binaryData.length * EIGHTBIT;        if (lengthDataBits == 0) {            return "";        }        int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;        int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;        int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;        char encodedData[] = null;        encodedData = new char[numberQuartet * 4];        byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;        int encodedIndex = 0;        int dataIndex = 0;        if (fDebug) {            System.out.println("number of triplets = " + numberTriplets);        }        for (int i = 0; i < numberTriplets; i++) {            b1 = binaryData[dataIndex++];            b2 = binaryData[dataIndex++];            b3 = binaryData[dataIndex++];            if (fDebug) {                System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);            }            l = (byte) (b2 & 0x0f);            k = (byte) (b1 & 0x03);            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);            byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);            if (fDebug) {                System.out.println("val2 = " + val2);                System.out.println("k4   = " + (k << 4));                System.out.println("vak  = " + (val2 | (k << 4)));            }            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];            encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];            encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];        }        // form integral number of 6-bit groups        if (fewerThan24bits == EIGHTBIT) {            b1 = binaryData[dataIndex];            k = (byte) (b1 & 0x03);            if (fDebug) {                System.out.println("b1=" + b1);                System.out.println("b1<<2 = " + (b1 >> 2));            }            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];            encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];            encodedData[encodedIndex++] = PAD;            encodedData[encodedIndex++] = PAD;        } else if (fewerThan24bits == SIXTEENBIT) {            b1 = binaryData[dataIndex];            b2 = binaryData[dataIndex + 1];            l = (byte) (b2 & 0x0f);            k = (byte) (b1 & 0x03);            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];            encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];            encodedData[encodedIndex++] = PAD;        }        return new String(encodedData);    }    /**     * Decodes Base64 data into octects     *     * @param encoded string containing Base64 data     * @return Array containind decoded data.     */    public static byte[] decode(String encoded) {        if (encoded == null) {            return null;        }        char[] base64Data = encoded.toCharArray();        // remove white spaces        int len = removeWhiteSpace(base64Data);        if (len % FOURBYTE != 0) {            return null;//should be divisible by four        }        int numberQuadruple = (len / FOURBYTE);        if (numberQuadruple == 0) {            return new byte[0];        }        byte decodedData[] = null;        byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;        char d1 = 0, d2 = 0, d3 = 0, d4 = 0;        int i = 0;        int encodedIndex = 0;        int dataIndex = 0;        decodedData = new byte[(numberQuadruple) * 3];        for (; i < numberQuadruple - 1; i++) {            if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))                || !isData((d3 = base64Data[dataIndex++]))                || !isData((d4 = base64Data[dataIndex++]))) {                return null;            }//if found "no data" just return null            b1 = base64Alphabet[d1];            b2 = base64Alphabet[d2];            b3 = base64Alphabet[d3];            b4 = base64Alphabet[d4];            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);        }        if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {            return null;//if found "no data" just return null        }        b1 = base64Alphabet[d1];        b2 = base64Alphabet[d2];        d3 = base64Data[dataIndex++];        d4 = base64Data[dataIndex++];        if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters            if (isPad(d3) && isPad(d4)) {                if ((b2 & 0xf) != 0)//last 4 bits should be zero                {                    return null;                }                byte[] tmp = new byte[i * 3 + 1];                System.arraycopy(decodedData, 0, tmp, 0, i * 3);                tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);                return tmp;            } else if (!isPad(d3) && isPad(d4)) {                b3 = base64Alphabet[d3];                if ((b3 & 0x3) != 0)//last 2 bits should be zero                {                    return null;                }                byte[] tmp = new byte[i * 3 + 2];                System.arraycopy(decodedData, 0, tmp, 0, i * 3);                tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);                tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));                return tmp;            } else {                return null;            }        } else { //No PAD e.g 3cQl            b3 = base64Alphabet[d3];            b4 = base64Alphabet[d4];            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);        }        return decodedData;    }    /**     * remove WhiteSpace from MIME containing encoded Base64 data.     *     * @param data  the byte array of base64 data (with WS)     * @return      the new length     */    private static int removeWhiteSpace(char[] data) {        if (data == null) {            return 0;        }        // count characters that's not whitespace        int newSize = 0;        int len = data.length;        for (int i = 0; i < len; i++) {            if (!isWhiteSpace(data[i])) {                data[newSize++] = data[i];            }        }        return newSize;    }}
以上九尾全部的加密程序代码了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 健身房有个教练想撩我怎么办 学车跟校长投诉了教练怎么办 打架把眼睛打肿怎么办属于什么伤 罗马椅有点高做不了山羊挺身怎么办 节食一周后暴食肚子胀的难受怎么办 健身教练和会员聊天说错肌肉怎么办 两个月宝宝吃奶老是呛到怎么办 怀孕六个月体重一天增加两斤怎么办 备孕同房后一直乳头立起来怎么办 夏天出汉内衣老是湿的怎么办 大腿旁边长了红色的癣怎么办 跑步膝盖疼怎么办能不能再跑了 两周宝宝剧烈运动后咳嗽怎么办 bra的M有点紧L有点宽怎么办 穿吊带总是会露出来左胸罩杯怎么办 生小孩后腰部有一圈黑色勒痕怎么办 新买的饮水机热水口出水小怎么办 新买的饮水机热水口不出水怎么办 平胸没有适合自己的内衣怎么办 售楼小姐穿坏的丝袜都怎么办了 蛋白粉一天喝十克补不起来怎么办 跑步时没有卸妆毛孔堵塞了怎么办 自己做的葡萄酒太甜了怎么办 健身馆碰到一个帅的健身教练怎么办 随着年龄的增长脖子越来越短怎么办 安装软件时解析包出现问题怎么办 鼻子吸进去的气往嘴巴里怎么办 做完瑜伽之后大腿后侧特别紧怎么办 刚下生小狗腿后腿站不起来怎么办 脚被凳子压到了流血了怎么办还很痛 小狗脚被凳子压出血了怎么办 怀孕8个月脐带绕颈一周怎么办 练完瑜伽大腿两侧肌肉麻木怎么办 突然吃了辣火锅肚子烫怎么办 副鼻窦炎鼻头顶痛鼻子臭怎么办 一岁宝宝夜里睡觉不踏实怎么办 分手一个月了还是放不下前任怎么办 当晚上遇到烦心事睡不着该怎么办 为什么白天太累晚上就睡不着怎么办 白天走累的脚痛晚上睡不着怎么办 1岁宝宝感冒咳嗽流泪流鼻涕怎么办