zoukankan      html  css  js  c++  java
  • 加密解密

     共四种:

    1.base64(大小写英文字母、10个基本阿拉伯数字、+、/)

    2.MD5(任意长度的数据,算出的MD5值长度都是固定的,哪怕只修改1个字节,所得到的MD5值都有很大区别)

    3.对称密钥加密(加密解密的密钥一样)

    4.非对称加密(加密解密的密钥不一样,分为公钥和私钥)

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
            final DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem item) {
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    switch (item.getItemId()) {
                        case R.id.base64:
    //                        fragment = new Base64Fragment();
                            transaction.replace(R.id.content, new Base64Fragment());
                            break;
                        case R.id.md5:
                            transaction.replace(R.id.content, new MD5Fragment());
                            break;
                        case R.id.des:
                            transaction.replace(R.id.content, new DESFragment());
                            break;
                        case R.id.rsa:
                            transaction.replace(R.id.content, new RSAFragment());
                            break;
                    }
    //                transaction.replace(R.id.content, fragment).commit();
                    transaction.commit();
                    drawerLayout.closeDrawer(Gravity.LEFT);
                    return true;
                }
            });
        }
    }

    Base64加密解密

    public class Base64Fragment extends Fragment {
        @Bind(R.id.encode_et)
        EditText encodeEt;
        @Bind(R.id.decode_et)
        EditText decodeEt;
        @Bind(R.id.result)
        TextView result;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.base64_layout,null);
            ButterKnife.bind(this, view);
            return view;
        }
    
        @OnClick(R.id.encode)
        public void encode() {
            String srcStr = encodeEt.getText().toString();
            //编码
            String s = Base64.encodeToString(srcStr.getBytes(), Base64.DEFAULT);
            decodeEt.setText(s);
        }
    
        @OnClick(R.id.decode)
        public void decode() {
            String srcStr = decodeEt.getText().toString();
            byte[] decode = Base64.decode(srcStr.getBytes(), Base64.DEFAULT);
            String s = new String(decode, 0, decode.length);
            result.setText(s);
        }
    }

    MD5加密解密

    public class MD5Fragment extends Fragment {
        @Bind(R.id.encode_et)
        EditText encodeEt;
        @Bind(R.id.result)
        TextView result;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.md5_layout, null);
            ButterKnife.bind(this, view);
            return view;
        }
    
        @OnClick(R.id.encode)
        public void encode() {
            try {
                //获取一个消息摘要生成实例
                MessageDigest messageDigest = MessageDigest.getInstance("MD5");
                byte[] digest = messageDigest.digest(encodeEt.getText().toString().getBytes());
                StringBuffer stringBuffer = new StringBuffer();
                for (byte b : digest) {
                    //使用十六进制输出消息摘要,不足两位的用0补齐
                    stringBuffer.append(String.format("%02x", b));
                }
                result.setText(stringBuffer.toString());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
    }

    对称密钥加密

    public class DESFragment extends Fragment {
        @Bind(R.id.encode_et)
        EditText encodeEt;
        @Bind(R.id.decode_et)
        EditText decodeEt;
        @Bind(R.id.encode_et2)
        EditText encodeEt2;
        @Bind(R.id.decode_et2)
        EditText decodeEt2;
        @Bind(R.id.encode_et3)
        EditText encodeEt3;
        @Bind(R.id.decode_et3)
        EditText decodeEt3;
        @Bind(R.id.result)
        TextView result;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.des_layout, null);
            ButterKnife.bind(this, view);
            return view;
        }
    
        @OnClick(R.id.encode)
        public void encode() {
            String des = EncryptionHelper.des(encodeEt.getText().toString(), "789", EncryptionHelper.ENCODE);
            decodeEt.setText(des);
        }
    
        @OnClick(R.id.decode)
        public void decode() {
            String des = EncryptionHelper.des(decodeEt.getText().toString(), "789", EncryptionHelper.DECODE);
            result.setText(des);
        }
    
        @OnClick(R.id.encode2)
        public void encode2() {
            String s = EncryptionHelper.des3(encodeEt2.getText().toString(), "123", EncryptionHelper.ENCODE);
            decodeEt2.setText(s);
        }
    
        @OnClick(R.id.decode2)
        public void decode2() {
            String s = EncryptionHelper.des3(decodeEt2.getText().toString(), "123", EncryptionHelper.DECODE);
            result.setText(s);
        }
    
        @OnClick(R.id.encode3)
        public void encode3() {
            String s = EncryptionHelper.aes(encodeEt3.getText().toString(), "abcd", EncryptionHelper.ENCODE);
            decodeEt3.setText(s);
        }
    
        @OnClick(R.id.decode3)
        public void decode3() {
            String abcd = EncryptionHelper.aes(decodeEt3.getText().toString(), "abcd", EncryptionHelper.DECODE);
            result.setText(abcd);
        }
    }
    public class EncryptionHelper {
        public static final int ENCODE = 0;
        public static final int DECODE = 1;
    
        /**
         * 使用DES算法进行对称加/解密
         *
         * @param srcStr 明文
         * @param key    密钥
         * @param mode   模式(加密/解密)
         * @return
         */
        public static String des(String srcStr, String key, int mode) {
            String charsetName = "UTF-8";
            try {
                //获得key的byte数组
                byte[] keyBytes = key.getBytes(charsetName);
                //des算法中key的长度为8
                byte[] temp = new byte[8];
                //数组拷贝
                //1.源数组
                //2.开始复制的位置
                //3.目标数组
                //4.目标数组的位置
                //5.复制的长度
                System.arraycopy(keyBytes, 0, temp, 0, Math.min(keyBytes.length, temp.length));
                //生成密钥
                //1.密钥数组
                //2.生成密钥的算法名称
                SecretKey secretKey = new SecretKeySpec(temp, "des");
                //获取一个密文生成器
                Cipher cipher = Cipher.getInstance("des");
                //如果要进行加密
                if (mode == ENCODE) {
                    //初始化密文生成器
                    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
                    //执行加密
                    byte[] bytes = cipher.doFinal(srcStr.getBytes(charsetName));
                    //使用Base64对加密结果进行编码
                    String s = Base64.encodeToString(bytes, Base64.DEFAULT);
                    return s;
                    //如果要解密
                } else {
                    //初始化密文生成器
                    cipher.init(Cipher.DECRYPT_MODE, secretKey);
                    //由于传进来的srcStr是对密文进行加密后的字符串,所以在解密之前先要解码
                    byte[] bytes = cipher.doFinal(Base64.decode(srcStr, Base64.DEFAULT));
                    //返回明文
                    return new String(bytes, 0, bytes.length);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } 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 null;
        }
    
        public static String des3(String srcStr, String key, int mode) {
            String charsetName = "UTF-8";
            try {
                byte[] keyBytes = key.getBytes(charsetName);
                //注意和des算法key的长度不同
                byte[] temp = new byte[24];
                System.arraycopy(keyBytes, 0, temp, 0, Math.min(keyBytes.length, temp.length));
                SecretKey secretKey = new SecretKeySpec(temp, "desede");
                Cipher cipher = Cipher.getInstance("desede");
                if (mode == ENCODE) {
                    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
                    byte[] bytes = cipher.doFinal(srcStr.getBytes(charsetName));
                    return Base64.encodeToString(bytes, Base64.DEFAULT);
                } else {
                    cipher.init(Cipher.DECRYPT_MODE, secretKey);
                    byte[] bytes = cipher.doFinal(Base64.decode(srcStr, Base64.DEFAULT));
                    return new String(bytes, 0, bytes.length);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } 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 null;
        }
    
        public static String aes(String srcStr, String key, int mode) {
            String charsetName = "UTF-8";
            try {
                byte[] keyBytes = key.getBytes(charsetName);
                byte[] temp = new byte[32];
                System.arraycopy(keyBytes, 0, temp, 0, Math.min(keyBytes.length, temp.length));
                SecretKey secretKey = new SecretKeySpec(temp, "aes");
                Cipher cipher = Cipher.getInstance("aes");
                if (mode == ENCODE) {
                    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
                    byte[] bytes = cipher.doFinal(srcStr.getBytes(charsetName));
                    return Base64.encodeToString(bytes, Base64.DEFAULT);
                } else {
                    cipher.init(Cipher.DECRYPT_MODE, secretKey);
                    byte[] bytes = cipher.doFinal(Base64.decode(srcStr, Base64.DEFAULT));
                    return new String(bytes, 0, bytes.length);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } 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 null;
        }
    }

    非对称密钥加密

    public class RSAFragment extends Fragment {
        //两个大素数的乘积
        private static final String MODULUS = "100631058000714094813874361191853577129731636346684218206605779824931626830750623070803100189781211343851763275329364056640619755337779928985272486091431384128027213365372009648233171894708338213168824861061809490615593530405056055952622249066180336803996949444124622212096805545953751253607916170340397933039";
        //公钥
        private static final String PUB_KEY = "65537";
        //私钥
        private static final String PRI_KEY = "26900155715313643087786516528374548998821559381075740707715132776187148793016466508650068087107695523642202737697714709374658856733792614490943874205956727606674634563665154616758939576547663715234643273055658829482813503959459653708062875625210008961239643775661357655599312857249418610810177817213648575161";
    
        @Bind(R.id.encode_et)
        EditText encodeEt;
        @Bind(R.id.decode_et)
        EditText decodeEt;
        @Bind(R.id.result)
        TextView result;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.rsa_layout, null);
            ButterKnife.bind(this, view);
            return view;
        }
    
        @OnClick(R.id.encode)
        public void encode() {
            String srcStr = encodeEt.getText().toString();
            try {
                //获取一个公钥/私钥生成工厂
                KeyFactory keyFactory = KeyFactory.getInstance("rsa");
                //1.大素数的乘积
                //2.公钥
                RSAPublicKeySpec rsaPublicKey = new RSAPublicKeySpec(new BigInteger(MODULUS), new BigInteger(PUB_KEY));
                //生成公钥
                PublicKey publicKey = keyFactory.generatePublic(rsaPublicKey);
                //获取一个密码生成器
                Cipher cipher = Cipher.getInstance("rsa");
                //初始化密码生成器
                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
                //加密
                byte[] bytes = cipher.doFinal(srcStr.getBytes("UTF-8"));
                String s = Base64.encodeToString(bytes, Base64.DEFAULT);
                decodeEt.setText(s);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (InvalidKeySpecException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            }
        }
    
        @OnClick(R.id.decode)
        public void decode() {
            try {
                KeyFactory keyFactory = KeyFactory.getInstance("rsa");
                RSAPrivateKeySpec rsaPrivateKeySpec = new RSAPrivateKeySpec(new BigInteger(MODULUS), new BigInteger(PRI_KEY));
                PrivateKey privateKey = keyFactory.generatePrivate(rsaPrivateKeySpec);
                Cipher cipher = Cipher.getInstance("rsa");
                cipher.init(Cipher.DECRYPT_MODE, privateKey);
                byte[] bytes = cipher.doFinal(Base64.decode(decodeEt.getText().toString(), Base64.DEFAULT));
                String s = new String(bytes, 0, bytes.length);
                result.setText(s);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (InvalidKeySpecException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            }
        }
    }

     

  • 相关阅读:
    FastDFS分布式文件系统
    Nginx负载均衡
    Linux系统:第六章:Linux服务
    libphp5.so可能遇到的问题(转摘)
    apache和tomcat的关系
    linux有些sh文件,为什么要用 ./ 来执行
    Linux上安装apache
    解决centos6系统上python3—flask模块的安装问题
    常见的消息队列中间件介绍
    Linux上部署Tomcat+Nginx负载均衡
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5484624.html
Copyright © 2011-2022 走看看