常見編碼加密解密Base64,URL 蹋盆,GZIP费薄,DES硝全,RSA等

常見編碼加密解密的基礎(chǔ)用法

  • Base64編碼
  • URL編碼
  • GZIP
  • AES加密
  • DES加密
  • RSA加密
public class MainActivity extends AppCompatActivity {

private EditText mTextContent;
private TextView mTxtResult;
private TextView mTxtPass;
private byte [] mDecode;
private byte [] mPriDecode;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextContent = (EditText) findViewById (R.id.txt_content);
    mTxtResult = (TextView) findViewById (R.id.txt_result);
    mTxtPass = (TextView) findViewById (R.id.txt_password);
}

編碼

        public void btnBase64Encode(View view) {
            String str = mTextContent.getText().toString().trim();
            // Base64編碼 no_wrap 代表編碼的結(jié)果沒有任何換行
            String encoded = Base64.encodeToString(str.getBytes(), Base64.NO_WRAP);
            mTxtResult.setText(encoded);
    
            //Base64 解碼,
            byte[] decode = Base64.decode(encoded, Base64.NO_WRAP);
            String ss = new String(decode);
            Log.d("Base64 ", "ss = " + ss);
        }
    
        public void btnURLEncode(View view) {
            String str = "%E5%8F%98%E5%BD%A2%E9%87%91%E5%88%9A";
            try {
                String decode = URLDecoder.decode(str, "utf-8");
                Log.d("UE", "URLENCODING: " + decode);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            //URLEncoder
            try {
                String encode = URLEncoder.encode("BY帥", "utf-8");
                Log.d("UE", "URLENCODING: edncode: " + encode);
    
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * GZIP壓縮楞抡,解壓縮
         *
         * @param view
         */
        public void btnGzipTest(View view) {
            String str = mTextContent.getText().toString().trim();
            // 1.壓縮GZIP,GZIPOutPutStream
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            try {
                GZIPOutputStream gzipout = new GZIPOutputStream(bout);
                gzipout.write(str.getBytes());//利用GZIPOutPutStream壓縮伟众,并輸出結(jié)果
                gzipout.finish();//必須調(diào)用生成實際的壓縮數(shù)據(jù)
                gzipout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            byte[] bytes = bout.toByteArray();
            mTxtResult.setText("內(nèi)容長度:" + str.length() + "\n壓縮大小:" + bytes.length);
    
            String s = Arrays.toString(bytes);
            Log.d("GZIP", s);
    
            //解壓縮 GZIPInputStream
            ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
            try {
                GZIPInputStream gzipIn = new GZIPInputStream(bin);
                ByteArrayOutputStream bo = new ByteArrayOutputStream();
                byte[] buf = new byte[128];
                int len;
                while (true) {
                    len = gzipIn.read(buf);
                    if (len == -1) {
                        break;
                    }
    
                    bo.write(buf, 0, len);
                }
                byte[] bytes1 = bo.toByteArray();
                String s1 = new String(bytes1);
                Log.d("GZIP", s1);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        public void btnDesTest(View view) {
            //DES TEST
            String str = mTextContent.getText().toString().trim();
            String pwd = mTxtPass.getText().toString().trim();
    
    //        byte[] encrypt = CryptUtil.desEncrypt(str.getBytes(), pwd.getBytes());
            byte[] iv = {23, 12, 3, 2, 4, 5, 7, 3, 4, 3, 34, 66, 6, 7, 93, 12};
            byte[] encrypt = CryptUtil.aesEncryptWithIv(str.getBytes(), pwd.getBytes(), iv);
    
    
            String s = Base64.encodeToString(encrypt, Base64.NO_WRAP);
            mTxtResult.setText(s);
    
            //解密召廷,把Base64還原凳厢,并且解密
            byte[] ed = Base64.decode(s, Base64.NO_WRAP);
            byte[] data = CryptUtil.aesDecryptWithIv(ed, pwd.getBytes(), iv);
            String ss = new String(data);
            Log.d("DES", "btnDesTest : " + ss);
    
        }
    
        public void btnRsaTest(View view) {
            String state = Environment.getExternalStorageState();
            File dir = getFilesDir();
            if (state.equals(Environment.MEDIA_MOUNTED)) {
                dir = Environment.getExternalStorageDirectory();
            }
    
            if (!dir.exists()) {
                dir.mkdirs();
            }
            Log.d("KEY", "dir : " + dir.getAbsolutePath());
            File target = new File(dir, "secret.txt");
    
            try {
                if (!target.exists()) {
                    // 1.加載或者生成密鑰對
                    KeyPair keyPair = CryptUtil.generateRsaKey(1024);
                    // 私鑰
                    PrivateKey aPrivate = keyPair.getPrivate();
                    // 公鑰
                    PublicKey aPublic = keyPair.getPublic();
    
    
                    // 私鑰的數(shù)據(jù)格式
                    byte[] privEncoded = aPrivate.getEncoded();
                    byte[] pubEncoded = aPublic.getEncoded();
    
    //        String publicstr = aPublic.toString();
    
                    String pubkeyEncode = Base64.encodeToString(pubEncoded, Base64.NO_WRAP);
                    String priKeyEncode = Base64.encodeToString(privEncoded, Base64.NO_WRAP);
    //        Log.d("Key", publicstr);
    
                    //TODO:把公鑰,私鑰使用BASE64編碼竞慢,保存到文件中先紫,下一次啟動時,需要先加載筹煮,沒有才創(chuàng)建
    
                    target.createNewFile();
                    BufferedWriter bw = new BufferedWriter(new FileWriter(target, true));
    
                    bw.write(pubkeyEncode);
                    bw.newLine();
                    bw.write(priKeyEncode);
    
                    bw.close();
                    BufferedReader bufferedReader = new BufferedReader(new FileReader(target));
                    String Pub = bufferedReader.readLine();
                    mDecode = Base64.decode(Pub, Base64.NO_WRAP);
                    String Pri = bufferedReader.readLine();
                    mPriDecode = Base64.decode(Pri, Base64.NO_WRAP);
                    bufferedReader.close();
    
    //                FileOutputStream fos = new FileOutputStream(target);
    //                fos.write(pubencode);
    //                fos.close();
                }else if (target.exists()){
                    BufferedReader bufferedReader = new BufferedReader(new FileReader(target));
                    String Pub = bufferedReader.readLine();
                    mDecode = Base64.decode(Pub, Base64.NO_WRAP);
                    String Pri = bufferedReader.readLine();
                    mPriDecode = Base64.decode(Pri, Base64.NO_WRAP);
                    Log.d("key","public: " + Pub);
                    Log.d("key","private: " + Pri);
                    bufferedReader.close();
    
    
                }
            } catch (IOException e) {
                e.printStackTrace();
    
            }
    
    
    
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(mDecode);
            PKCS8EncodedKeySpec pkeySpec = new PKCS8EncodedKeySpec(mPriDecode);
            RSAPrivateKey privateKey = null;
            RSAPublicKey rsap = null;
            KeyFactory keyFactory;
            try {
                keyFactory = KeyFactory.getInstance("RSA");
    
                rsap = (RSAPublicKey) keyFactory.generatePublic(keySpec);
                privateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkeySpec);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (InvalidKeySpecException e) {
                e.printStackTrace();
            }
    
    
            String str = mTextContent.getText().toString().trim();
            byte[] encrypt = CryptUtil.rsaEncrypt(str.getBytes(), rsap);
    
    
            String es = Base64.encodeToString(encrypt, Base64.NO_WRAP);
            mTxtResult.setText(es);
    
            byte[] dd = Base64.decode(es, Base64.NO_WRAP);
            byte[] data = CryptUtil.rsaDecrypt(dd, privateKey);
            String s1 = new String(data);
            Log.d("RSA", "RSACry : " + s1);
    
        }
    }

加密工具類

    public class CryptUtil {
        private CryptUtil() {
    
        }
    
        /**
         * DES 加密算法
         *
         * @param data 原始數(shù)據(jù)
         * @param key  密碼遮精,必須是8個字節(jié)
         * @return byte[] 經(jīng)過加密之后的內(nèi)容
         */
        public static byte[] desEncrypt(byte[] data, byte[] key) {
            byte[] ret = null;
            if (data != null && key != null) {
                if (data.length > 0 && key.length == 8) {
                    // 1.使用 Cipher引擎,來初始化加密败潦,并且設(shè)置密碼
                    try {
                        Cipher cipher = Cipher.getInstance("DES");
                        // 1.1 DESKEYSPEC用于描述 的事的密碼
                        DESKeySpec spec = new DESKeySpec(key);
                        // 1.2使用SecretKeyFactory生成Key對象
                        SecretKeyFactory des = SecretKeyFactory.getInstance("DES");
                        SecretKey sk = des.generateSecret(spec);
    
                        // 1.3初始化Cipper 為加密I操作本冲,并且制定密鑰
                        cipher.init(Cipher.ENCRYPT_MODE, sk);
    
                        // 2.加密數(shù)據(jù)
                        ret = cipher.doFinal(data);
    
                    } catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) {
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {
                        e.printStackTrace();
                    } catch (InvalidKeySpecException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }
                }
    
            }
            return ret;
        }
    
        /**
         * DES 解密算法
         *
         * @param data 原始數(shù)據(jù)
         * @param key  密碼,必須是8個字節(jié)
         * @return byte[] 經(jīng)過解密之后的內(nèi)容
         */
        public static byte[] desDecrypt(byte[] data, byte[] key) {
            byte[] ret = null;
            if (data != null && key != null) {
                if (data.length > 0 && key.length == 8) {
                    // 1.使用 Cipher引擎劫扒,來初始化解密檬洞,并且設(shè)置密碼
                    try {
                        Cipher cipher = Cipher.getInstance("DES");
                        // 1.1 DESKEYSPEC用于描述 的事的密碼
                        DESKeySpec spec = new DESKeySpec(key);
                        // 1.2使用SecretKeyFactory生成Key對象
                        SecretKeyFactory des = SecretKeyFactory.getInstance("DES");
                        SecretKey sk = des.generateSecret(spec);
    
                        // 1.3初始化Cipper 為解密操作,并且制定密鑰
                        cipher.init(Cipher.DECRYPT_MODE, sk);
    
                        // 2.解密數(shù)據(jù)
                        ret = cipher.doFinal(data);
    
                    } catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                    } catch (NoSuchPaddingException e) {
                        e.printStackTrace();
                    } catch (InvalidKeyException e) {
                        e.printStackTrace();
                    } catch (InvalidKeySpecException e) {
                        e.printStackTrace();
                    } catch (BadPaddingException e) {
                        e.printStackTrace();
                    } catch (IllegalBlockSizeException e) {
                        e.printStackTrace();
                    }
                }
    
            }
            return ret;
        }
    
    
        ///////////////////////////////////////////////////////////////////////////
        // AES方式
        ///////////////////////////////////////////////////////////////////////////
    
        public static byte[] aesEncrySimple(byte[] data, byte[] key) {
            byte[] ret = null;
            if (data != null && key != null) {
                if (data.length > 0 && key.length == 16) {
                    // AES 128bit = 16nytes
                    try {
                        Cipher cipher = Cipher.getInstance("AES");
                        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
                        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[] aesDecrySimple(byte[] data, byte[] key) {
            byte[] ret = null;
            if (data != null && key != null) {
                if (data.length > 0 && key.length == 16) {
                    // AES 128bit = 16nytes
                    try {
                        Cipher cipher = Cipher.getInstance("AES");
                        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                        cipher.init(Cipher.DECRYPT_MODE, keySpec);
                        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;
        }
    
        ///////////////////////////////////////////////////////////////////////////
        // AES 方式2 使用兩套密碼
        ///////////////////////////////////////////////////////////////////////////
    
        /**
         * 使用兩套密碼的加密沟饥,強(qiáng)度更高
         *
         * @param data   數(shù)據(jù)
         * @param key    第一個密碼
         * @param ivData 第二個密碼
         * @return
         */
        public static byte[] aesEncryptWithIv(byte[] data, byte[] key, byte[] ivData) {
            byte[] ret = null;
            if (data != null && key != null && ivData != null) {
                if (data.length > 0 && key.length == 16 && ivData.length == 16) {
                    //使用兩套密碼的添怔,算法需要寫成AES/算法模式/填充模式
                    try {
                        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                        //準(zhǔn)備第一套
                        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                        //準(zhǔn)備第二套密碼
                        IvParameterSpec iv = new IvParameterSpec(ivData);
    
                        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
    //                    ret = cipher.doFinal(data);
                        cipher.update(data);
                        ret = cipher.doFinal();
    
                    } 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[] aesDecryptWithIv(byte[] data, byte[] key, byte[] ivData) {
            byte[] ret = null;
            if (data != null && key != null && ivData != null) {
                if (data.length > 0 && key.length == 16 && ivData.length == 16) {
                    //使用兩套密碼的,算法需要寫成AES/算法模式/填充模式
                    try {
                        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                        //準(zhǔn)備第一套
                        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                        //準(zhǔn)備第二套密碼
                        IvParameterSpec iv = new IvParameterSpec(ivData);
    
                        cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
    //                    ret = cipher.doFinal(data);
                        cipher.update(data);
                        ret = cipher.doFinal();
    
                    } 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;
        }
    
        ///////////////////////////////////////////////////////////////////////////
        // RSA
        ///////////////////////////////////////////////////////////////////////////
    
        // 1.生成密鑰對贤旷, 公鑰和私鑰
    
        /**
         * bits  位數(shù)必須在 1024 和 2048 之間
         *
         * @param bits
         * @return
         */
        public static KeyPair generateRsaKey(int bits) {
            KeyPair ret = null;
            try {
                KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
                kpg.initialize(bits);
                ret = kpg.generateKeyPair();
    
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return ret;
        }
    
    
        /**
         *  RSA 加密澎灸,使用公鑰加密,那么必須使用私鑰解密
         *          使用私鑰加密遮晚,必須使用公鑰解密
         *
         * @param data
         * @param key
         * @return
         */
        public static byte[] rsaEncrypt(byte[] data, Key key) {
            byte[] ret = null;
            if (data != null && data.length > 0 && key != null) {
                try {
                    Cipher cipher = Cipher.getInstance("RSA");
                    cipher.init(Cipher.ENCRYPT_MODE, key);
                    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[] rsaDecrypt(byte[] data, Key key) {
            byte[] ret = null;
            if (data != null && data.length > 0 && key != null) {
                try {
                    Cipher cipher = Cipher.getInstance("RSA");
                    cipher.init(Cipher.DECRYPT_MODE, key);
                    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;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末性昭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子县遣,更是在濱河造成了極大的恐慌糜颠,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萧求,死亡現(xiàn)場離奇詭異其兴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夸政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門元旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事匀归】幼剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵穆端,是天一觀的道長袱贮。 經(jīng)常有香客問我,道長体啰,這世上最難降的妖魔是什么攒巍? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮荒勇,結(jié)果婚禮上柒莉,老公的妹妹穿的比我還像新娘。我一直安慰自己沽翔,他們只是感情好兢孝,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搀擂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卷玉。 梳的紋絲不亂的頭發(fā)上哨颂,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音相种,去河邊找鬼威恼。 笑死,一個胖子當(dāng)著我的面吹牛寝并,可吹牛的內(nèi)容都是我干的箫措。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼衬潦,長吁一口氣:“原來是場噩夢啊……” “哼斤蔓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镀岛,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤弦牡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漂羊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驾锰,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年走越,在試婚紗的時候發(fā)現(xiàn)自己被綠了椭豫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赏酥,靈堂內(nèi)的尸體忽然破棺而出喳整,到底是詐尸還是另有隱情,我是刑警寧澤今缚,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布算柳,位于F島的核電站,受9級特大地震影響姓言,放射性物質(zhì)發(fā)生泄漏瞬项。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一何荚、第九天 我趴在偏房一處隱蔽的房頂上張望囱淋。 院中可真熱鬧,春花似錦餐塘、人聲如沸妥衣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽税手。三九已至,卻和暖如春需纳,著一層夾襖步出監(jiān)牢的瞬間芦倒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工不翩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留兵扬,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓口蝠,卻偏偏與公主長得像器钟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妙蔗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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