常见编码加密解密Base64,URL ,GZIP,DES,RSA等

常见编码加密解密的基础用法

  • 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 代表编码的结果没有任何换行
            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压缩,并输出结果
                gzipout.finish();//必须调用生成实际的压缩数据
                gzipout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            byte[] bytes = bout.toByteArray();
            mTxtResult.setText("内容长度:" + 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();
    
    
                    // 私钥的数据格式
                    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编码,保存到文件中,下一次启动时,需要先加载,没有才创建
    
                    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 原始数据
         * @param key  密码,必须是8个字节
         * @return byte[] 经过加密之后的内容
         */
        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引擎,来初始化加密,并且设置密码
                    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.加密数据
                        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 原始数据
         * @param key  密码,必须是8个字节
         * @return byte[] 经过解密之后的内容
         */
        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引擎,来初始化解密,并且设置密码
                    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.解密数据
                        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 使用两套密码
        ///////////////////////////////////////////////////////////////////////////
    
        /**
         * 使用两套密码的加密,强度更高
         *
         * @param data   数据
         * @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");
                        //准备第一套
                        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                        //准备第二套密码
                        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");
                        //准备第一套
                        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                        //准备第二套密码
                        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  位数必须在 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;
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,848评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,529评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,824评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,329评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,227评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,879评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,218评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,877评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,159评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,155评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,987评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,736评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,273评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,407评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,663评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,158评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,517评论 2 339

推荐阅读更多精彩内容

  • 关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜...
    时间已静止阅读 4,944评论 12 95
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 2,894评论 0 7
  • 元祐元年初 霓凰郡主奉今上诏命赴金陵,事出突然。梅长苏得半夏飞鸽传书时霓凰已近金陵。 “金陵...”梅长苏立在廊下...
    潇清涵阅读 313评论 0 0
  • 一、你的围墙高不可攀 现实中有许多人长得貌美如花、英俊潇洒,为人善良。渴望爱情,却久久不可得!虽然围墙里花团锦簇,...
    一盏灯火一座城阅读 325评论 0 0
  • vim的分屏功能: 中括号表示可有可无 打开文件并且分屏vim -o[n] file1 [file2 ...]vi...
    卿卿木子七阅读 18,960评论 2 14