AES加味抖、解密

Android端

public class EncryptUtil {
    static Boolean b = true;

    // 注意: 這里的password(秘鑰必須是16位的)
    public static final String keyBytes = "3epj7jhny345mwe2";
    //    public static final String keyBytes = "test7jhny345mwe2";

    static final String algorithmStr = "AES/ECB/PKCS5Padding";

    private static final Object TAG = "AES";

    static private KeyGenerator keyGen;

    static private Cipher cipher;

    static boolean isInited = false;

    private static void init() {
        try {
            /**
             * 為指定算法生成一個(gè) KeyGenerator 對(duì)象。 此類提供(對(duì)稱)密鑰生成器的功能豫柬。 密鑰生成器是使用此類的某個(gè)
             * getInstance 類方法構(gòu)造的八堡。 KeyGenerator 對(duì)象可重復(fù)使用陨闹,也就是說楞捂,在生成密鑰后, 可以重復(fù)使用同一
             * KeyGenerator 對(duì)象來生成進(jìn)一步的密鑰趋厉。 生成密鑰的方式有兩種:與算法無關(guān)的方式寨闹,以及特定于算法的方式。
             * 兩者之間的惟一不同是對(duì)象的初始化: 與算法無關(guān)的初始化 所有密鑰生成器都具有密鑰長度 和隨機(jī)源 的概念君账。 此
             * KeyGenerator 類中有一個(gè) init 方法繁堡,它可采用這兩個(gè)通用概念的參數(shù)。 還有一個(gè)只帶 keysize 參數(shù)的
             * init 方法乡数, 它使用具有最高優(yōu)先級(jí)的提供程序的 SecureRandom 實(shí)現(xiàn)作為隨機(jī)源 (如果安裝的提供程序都不提供
             * SecureRandom 實(shí)現(xiàn)椭蹄,則使用系統(tǒng)提供的隨機(jī)源)。 此 KeyGenerator 類還提供一個(gè)只帶隨機(jī)源參數(shù)的 inti
             * 方法瞳脓。 因?yàn)檎{(diào)用上述與算法無關(guān)的 init 方法時(shí)未指定其他參數(shù)塑娇,
             * 所以由提供程序決定如何處理將與每個(gè)密鑰相關(guān)的特定于算法的參數(shù)(如果有)。 特定于算法的初始化
             * 在已經(jīng)存在特定于算法的參數(shù)集的情況下劫侧, 有兩個(gè)具有 AlgorithmParameterSpec 參數(shù)的 init 方法。
             * 其中一個(gè)方法還有一個(gè) SecureRandom 參數(shù)哨啃, 而另一個(gè)方法將已安裝的高優(yōu)先級(jí)提供程序的 SecureRandom
             * 實(shí)現(xiàn)用作隨機(jī)源 (或者作為系統(tǒng)提供的隨機(jī)源烧栋,如果安裝的提供程序都不提供 SecureRandom 實(shí)現(xiàn))。
             * 如果客戶端沒有顯式地初始化 KeyGenerator(通過調(diào)用 init 方法)拳球, 每個(gè)提供程序必須提供(和記錄)默認(rèn)初始化审姓。
             */
            keyGen = KeyGenerator.getInstance("AES");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 初始化此密鑰生成器,使其具有確定的密鑰長度祝峻。
        keyGen.init(128); // 128位的AES加密
        try {
            // 生成一個(gè)實(shí)現(xiàn)指定轉(zhuǎn)換的 Cipher 對(duì)象魔吐。
            cipher = Cipher.getInstance(algorithmStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }
        // 標(biāo)識(shí)已經(jīng)初始化過了的字段
        isInited = true;
    }

    private static byte[] genKey() {
        if (!isInited) {
            init();
        }
        // 首先 生成一個(gè)密鑰(SecretKey),
        // 然后,通過這個(gè)秘鑰,返回基本編碼格式的密鑰扎筒,如果此密鑰不支持編碼,則返回 null酬姆。
        return keyGen.generateKey().getEncoded();
    }

    private static byte[] encrypt(byte[] content, byte[] keyBytes) {
        byte[] encryptedText = null;
        if (!isInited) {
            init();
        }
        /**
         * 類 SecretKeySpec 可以使用此類來根據(jù)一個(gè)字節(jié)數(shù)組構(gòu)造一個(gè) SecretKey嗜桌, 而無須通過一個(gè)(基于 provider
         * 的)SecretKeyFactory。 此類僅對(duì)能表示為一個(gè)字節(jié)數(shù)組并且沒有任何與之相關(guān)聯(lián)的鑰參數(shù)的原始密鑰有用
         * 構(gòu)造方法根據(jù)給定的字節(jié)數(shù)組構(gòu)造一個(gè)密鑰辞色。 此構(gòu)造方法不檢查給定的字節(jié)數(shù)組是否指定了一個(gè)算法的密鑰骨宠。
         */
        Key key = new SecretKeySpec(keyBytes, "AES");
        try {
            // 用密鑰初始化此 cipher。
            cipher.init(Cipher.ENCRYPT_MODE, key);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        try {
            // 按單部分操作加密或解密數(shù)據(jù)相满,或者結(jié)束一個(gè)多部分操作层亿。(不知道神馬意思)
            encryptedText = cipher.doFinal(content);
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return encryptedText;
    }

    private static byte[] encrypt(String content, String password) {
        try {
            byte[] keyStr = getKey(password);
            SecretKeySpec key = new SecretKeySpec(keyStr, "AES");
            Cipher cipher = Cipher.getInstance(algorithmStr);// algorithmStr
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// ?
            byte[] result = cipher.doFinal(byteContent);
            return result; //
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] decrypt(byte[] content, String password) {
        try {
            byte[] keyStr = getKey(password);
            SecretKeySpec key = new SecretKeySpec(keyStr, "AES");
            Cipher cipher = Cipher.getInstance(algorithmStr);// algorithmStr
            cipher.init(Cipher.DECRYPT_MODE, key);// ?
            byte[] result = cipher.doFinal(content);
            return result; //
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] getKey(String password) {
        byte[] rByte = null;
        if (password != null) {
            rByte = password.getBytes();
        } else {
            rByte = new byte[24];
        }
        return rByte;
    }

    /**
     * 將二進(jìn)制轉(zhuǎn)換成16進(jìn)制
     *
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 將16進(jìn)制轉(zhuǎn)換為二進(jìn)制
     *
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    /**
     * 加密
     */
    public static String encode(String content) {
        // 加密之后的字節(jié)數(shù)組,轉(zhuǎn)成16進(jìn)制的字符串形式輸出
        if (!b) {
            return content;
        }
        return parseByte2HexStr(encrypt(content, keyBytes));
    /*    String str=parseByte2HexStr(encrypt(content, keyBytes));
        try {
            return MD5.MD5_16bit(str)+parseByte2HexStr(encrypt(content, keyBytes));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }*/
        //  return null;
    }

    /**
     * 解密
     */
    public static String decode(String content) {
        if (!b) {
            return content;
        }
        // 解密之前,先將輸入的字符串按照16進(jìn)制轉(zhuǎn)成二進(jìn)制的字節(jié)數(shù)組,作為待解密的內(nèi)容輸入
        byte[] b = decrypt(parseHexStr2Byte(content), keyBytes);
        return new String(b);
    }

    // 測試用例
    public static void test1() {
        String content = "hello abcdefggsdfasdfasdf";
        String pStr = encode(content);
        System.out.println("加密前:" + content);
        System.out.println("加密后:" + pStr);

        String postStr = decode(pStr);
        System.out.println("解密后:" + postStr);
    }

    public static void main(String[] args) {
        test1();
    }
}

JAVA端

public class A {

    // private static final Log log = LogFactory.getLog(HttpClientUtil.class);
    // private static final Propertie pe=new Propertie();
    /*private static String aeskey=pe.getAeskey();
    private static String edswitch=pe.getEdswitch();*/
    
    static final String algorithmStr = "AES/ECB/PKCS5Padding";

    private static final Object TAG = "AES";

    static private KeyGenerator keyGen;

    static private Cipher cipher;

    static boolean isInited = false;
    
    // 注意: 這里的password(秘鑰必須是16位的)
    private static final String keyBytes = "1234567890abcdef";

    private static void init() {
        try {
            /**
             * 為指定算法生成一個(gè) KeyGenerator 對(duì)象。 此類提供(對(duì)稱)密鑰生成器的功能立美。 密鑰生成器是使用此類的某個(gè)
             * getInstance 類方法構(gòu)造的匿又。 KeyGenerator 對(duì)象可重復(fù)使用,也就是說建蹄,在生成密鑰后琳省, 可以重復(fù)使用同一
             * KeyGenerator 對(duì)象來生成進(jìn)一步的密鑰。 生成密鑰的方式有兩種:與算法無關(guān)的方式躲撰,以及特定于算法的方式针贬。
             * 兩者之間的惟一不同是對(duì)象的初始化: 與算法無關(guān)的初始化 所有密鑰生成器都具有密鑰長度 和隨機(jī)源 的概念。 此
             * KeyGenerator 類中有一個(gè) init 方法拢蛋,它可采用這兩個(gè)通用概念的參數(shù)桦他。 還有一個(gè)只帶 keysize 參數(shù)的
             * init 方法, 它使用具有最高優(yōu)先級(jí)的提供程序的 SecureRandom 實(shí)現(xiàn)作為隨機(jī)源 (如果安裝的提供程序都不提供
             * SecureRandom 實(shí)現(xiàn)谆棱,則使用系統(tǒng)提供的隨機(jī)源)快压。 此 KeyGenerator 類還提供一個(gè)只帶隨機(jī)源參數(shù)的 inti
             * 方法。 因?yàn)檎{(diào)用上述與算法無關(guān)的 init 方法時(shí)未指定其他參數(shù)垃瞧,
             * 所以由提供程序決定如何處理將與每個(gè)密鑰相關(guān)的特定于算法的參數(shù)(如果有)蔫劣。 特定于算法的初始化
             * 在已經(jīng)存在特定于算法的參數(shù)集的情況下, 有兩個(gè)具有 AlgorithmParameterSpec 參數(shù)的 init 方法个从。
             * 其中一個(gè)方法還有一個(gè) SecureRandom 參數(shù)脉幢, 而另一個(gè)方法將已安裝的高優(yōu)先級(jí)提供程序的 SecureRandom
             * 實(shí)現(xiàn)用作隨機(jī)源 (或者作為系統(tǒng)提供的隨機(jī)源,如果安裝的提供程序都不提供 SecureRandom 實(shí)現(xiàn))嗦锐。
             * 如果客戶端沒有顯式地初始化 KeyGenerator(通過調(diào)用 init 方法)嫌松, 每個(gè)提供程序必須提供(和記錄)默認(rèn)初始化。
             */
            keyGen = KeyGenerator.getInstance("AES");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 初始化此密鑰生成器奕污,使其具有確定的密鑰長度萎羔。
        keyGen.init(128); // 128位的AES加密
        try {
            // 生成一個(gè)實(shí)現(xiàn)指定轉(zhuǎn)換的 Cipher 對(duì)象。
            cipher = Cipher.getInstance(algorithmStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }
        // 標(biāo)識(shí)已經(jīng)初始化過了的字段
        isInited = true;
    }

    private static byte[] genKey() {
        if (!isInited) {
            init();
        }
        // 首先 生成一個(gè)密鑰(SecretKey),
        // 然后,通過這個(gè)秘鑰,返回基本編碼格式的密鑰碳默,如果此密鑰不支持編碼贾陷,則返回 null缘眶。
        return keyGen.generateKey().getEncoded();
    }

    private static byte[] encrypt(byte[] content, byte[] keyBytes) {
        byte[] encryptedText = null;
        if (!isInited) {
            init();
        }
        /**
         * 類 SecretKeySpec 可以使用此類來根據(jù)一個(gè)字節(jié)數(shù)組構(gòu)造一個(gè) SecretKey, 而無須通過一個(gè)(基于 provider
         * 的)SecretKeyFactory髓废。 此類僅對(duì)能表示為一個(gè)字節(jié)數(shù)組并且沒有任何與之相關(guān)聯(lián)的鑰參數(shù)的原始密鑰有用
         * 構(gòu)造方法根據(jù)給定的字節(jié)數(shù)組構(gòu)造一個(gè)密鑰巷懈。 此構(gòu)造方法不檢查給定的字節(jié)數(shù)組是否指定了一個(gè)算法的密鑰。
         */
        Key key = new SecretKeySpec(keyBytes, "AES");
        try {
            // 用密鑰初始化此 cipher瓦哎。
            cipher.init(Cipher.ENCRYPT_MODE, key);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        try {
            // 按單部分操作加密或解密數(shù)據(jù)砸喻,或者結(jié)束一個(gè)多部分操作。(不知道神馬意思)
            encryptedText = cipher.doFinal(content);
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return encryptedText;
    }

    private static byte[] encrypt(String content, String password) {
        try {
            byte[] keyStr = getKey(password);
            SecretKeySpec key = new SecretKeySpec(keyStr, "AES");
            Cipher cipher = Cipher.getInstance(algorithmStr);// algorithmStr
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// ?
            byte[] result = cipher.doFinal(byteContent);
            return result; //
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] decrypt(byte[] content, String password) {
        try {
            byte[] keyStr = getKey(password);
            SecretKeySpec key = new SecretKeySpec(keyStr, "AES");
            Cipher cipher = Cipher.getInstance(algorithmStr);// algorithmStr
            cipher.init(Cipher.DECRYPT_MODE, key);// ?
            byte[] result = cipher.doFinal(content);
            return result; //
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] getKey(String password) {
        byte[] rByte = null;
        if (password != null) {
            rByte = password.getBytes();
        } else {
            rByte = new byte[24];
        }
        return rByte;
    }

    /**
     * 將二進(jìn)制轉(zhuǎn)換成16進(jìn)制
     * 
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 將16進(jìn)制轉(zhuǎn)換為二進(jìn)制
     * 
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    

    /**
     * 加密
     */
    public static String encode(String content) {
        // 加密之后的字節(jié)數(shù)組,轉(zhuǎn)成16進(jìn)制的字符串形式輸出
        return parseByte2HexStr(encrypt(content, keyBytes));
    }

    /**
     * 解密
     */
    public static String decode(String content) {
        // 解密之前,先將輸入的字符串按照16進(jìn)制轉(zhuǎn)成二進(jìn)制的字節(jié)數(shù)組,作為待解密的內(nèi)容輸入
        byte[] b = decrypt(parseHexStr2Byte(content), keyBytes);
        return new String(b);
    }

    // 測試用例
    public static void test1() {
        String content = "hengks和人們";
    
        String pStr = encode(content);
        System.out.println("加密前:" + content);
        System.out.println("加密后:" + pStr);

        String postStr = decode(pStr);
        System.out.println("解密后:" + postStr);
    }

    public static void main(String[] args) {
        test1();
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒋譬,一起剝皮案震驚了整個(gè)濱河市割岛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犯助,老刑警劉巖癣漆,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剂买,居然都是意外死亡惠爽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門瞬哼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婚肆,“玉大人,你說我怎么就攤上這事坐慰〗闲裕” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵结胀,是天一觀的道長赞咙。 經(jīng)常有香客問我,道長糟港,這世上最難降的妖魔是什么谋逻? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任终惑,我火速辦了婚禮失驶,結(jié)果婚禮上廊散,老公的妹妹穿的比我還像新娘。我一直安慰自己耸别,他們只是感情好健芭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秀姐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪若贮。 梳的紋絲不亂的頭發(fā)上省有,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天痒留,我揣著相機(jī)與錄音,去河邊找鬼蠢沿。 笑死伸头,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舷蟀。 我是一名探鬼主播恤磷,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼野宜!你這毒婦竟也來了扫步?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤匈子,失蹤者是張志新(化名)和其女友劉穎河胎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虎敦,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡游岳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了其徙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胚迫。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唾那,靈堂內(nèi)的尸體忽然破棺而出访锻,到底是詐尸還是另有隱情,我是刑警寧澤通贞,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布朗若,位于F島的核電站,受9級(jí)特大地震影響昌罩,放射性物質(zhì)發(fā)生泄漏哭懈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一茎用、第九天 我趴在偏房一處隱蔽的房頂上張望遣总。 院中可真熱鬧,春花似錦轨功、人聲如沸旭斥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垂券。三九已至,卻和暖如春羡滑,著一層夾襖步出監(jiān)牢的瞬間菇爪,已是汗流浹背算芯。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凳宙,地道東北人熙揍。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像氏涩,于是被迫代替她去往敵國和親届囚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 安全加密C語言庫OpenSSL是尖,在Android中服務(wù)器和客戶端之間的簽名驗(yàn)證和數(shù)據(jù)加密通信等意系。 OpenSSL系...
    AJoyce_閱讀 4,803評(píng)論 7 7
  • AES是一種對(duì)稱的加密算法,可基于相同的密鑰進(jìn)行加密和解密析砸。Java采用AES算法進(jìn)行加解密的邏輯大致如下: 生成...
    那誰319閱讀 415評(píng)論 0 0
  • 1.AES 密鑰+偏移進(jìn)行加密解密 結(jié)合 base64對(duì)加密之后的字節(jié)數(shù)組進(jìn)行編碼解碼(代碼如下) 最近項(xiàng)目上需要...
    一葉楓飄閱讀 7,819評(píng)論 1 4
  • 生活里首繁, 有很多轉(zhuǎn)瞬即逝作郭,像在車站的告別, 剛剛還相互擁抱弦疮,轉(zhuǎn)眼已各自天涯夹攒。 很多時(shí)候, 你不懂胁塞,我也不懂咏尝, 就這...
    ABoom閱讀 349評(píng)論 0 1