美文网首页Android
MD5加密算法

MD5加密算法

作者: 黄晓果 | 来源:发表于2017-09-20 21:32 被阅读139次

    MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for
    Computer Science和RSA Data Security Inc的Ronald L.
    Rivest开发出来,经MD2、MD3和MD4发展而来。

    MD5加密算法:http://blog.csdn.net/huangxiaoguo1/article/details/78042596

    Base64加密解密:http://blog.csdn.net/huangxiaoguo1/article/details/78042715

    异或加密解密:http://blog.csdn.net/huangxiaoguo1/article/details/78042802

    DES加密解密:http://blog.csdn.net/huangxiaoguo1/article/details/78042908

    AES自动生成base64密钥加密解密:http://blog.csdn.net/huangxiaoguo1/article/details/78043000

    AES加密解密(ECB模式):http://blog.csdn.net/huangxiaoguo1/article/details/78043098

    AES加密解密(CBC模式):http://blog.csdn.net/huangxiaoguo1/article/details/78043169

    非对称RSA加密解密:http://blog.csdn.net/huangxiaoguo1/article/details/78043354

    作用

    是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和C语言源代码在Internet
    RFCs 1321中有详细的描述,这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。

    函数设计

    以下是每次操作中用到的四个非线性函数(每轮一个)。 F(X,Y,Z)=(X&Y)|((~X)&Z)
    G(X,Y,Z)=(X&Z)|(Y&(~Z)) H(X,Y,Z)=XYZ I(X,Y,Z)=Y^(X|(~Z))
    (&是与,|是或,~是非,^是异或) 这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
    函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

    效果

    这里写图片描述

    代码:

    MD5Activity

    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import tsou.com.encryption.R;
    import tsou.com.encryption.md5.MD5Utils;
    
    /**
     * 一、什么是MD5加密?
     * <p>
     * MD5英文全称“Message-Digest Algorithm 5”,
     * 翻译过来是“消息摘要算法5”,
     * 由MD2、MD3、MD4演变过来的,
     * 是一种单向加密算法,是不可逆的一种的加密方式。
     * <p>
     * 二、MD5加密有哪些特点?
     * <p>
     * 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
     * <p>
     * 容易计算:从原数据计算出MD5值很容易。
     * <p>
     * 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
     * <p>
     * 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
     * <p>
     * 三、MD5应用场景:
     * <p>
     * 一致性验证
     * <p>
     * 数字签名
     * <p>
     * 安全访问认证
     */
    public class MD5Activity extends AppCompatActivity implements View.OnClickListener {
    
        private EditText encryptionContext;
        private Button encryption;
        private TextView tvEncryption;
        private Button decode;
        private TextView tvDecode;
        private Activity mActivity;
        private Context mContext;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_aes);
            mActivity = this;
            mContext = this;
            encryptionContext = (EditText) findViewById(R.id.et_encryption_context);
            encryption = (Button) findViewById(R.id.btn_encryption);
            tvEncryption = (TextView) findViewById(R.id.tv_encryption);
            decode = (Button) findViewById(R.id.btn_decode);
            tvDecode = (TextView) findViewById(R.id.tv_decode);
            initListener();
        }
    
        private void initListener() {
            encryption.setOnClickListener(this);
            decode.setVisibility(View.GONE);
            tvDecode.setVisibility(View.GONE);
        }
    
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.btn_encryption://加密
                    String encryptionString = encryptionContext.getText().toString().trim();
    
                    if (TextUtils.isEmpty(encryptionString)) {
                        Toast.makeText(mContext, "请输入加密内容", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    String encode = MD5Utils.md5(encryptionString);
                    tvEncryption.setText(encode);
    
                    break;
            }
        }
    }
    
    

    MD5Utils

    
    
    import android.text.TextUtils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.nio.MappedByteBuffer;
    import java.nio.channels.FileChannel;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * Created by Administrator on 2017/9/20 0020.
     */
    
    public class MD5Utils {
    
        /**
         * 计算字符串MD5值
         *
         * @param string
         * @return
         */
        public static String md5(String string) {
            if (TextUtils.isEmpty(string)) {
                return "";
            }
            MessageDigest md5 = null;
            try {
                md5 = MessageDigest.getInstance("MD5");
                byte[] bytes = md5.digest(string.getBytes());
                String result = "";
                for (byte b : bytes) {
                    String temp = Integer.toHexString(b & 0xff);
                    if (temp.length() == 1) {
                        temp = "0" + temp;
                    }
                    result += temp;
                }
                return result;
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return "";
        }
    
    
        /**
         * 计算文件的 MD5 值
         *
         * @param file
         * @return
         */
        public static String md5(File file) {
            if (file == null || !file.isFile() || !file.exists()) {
                return "";
            }
            FileInputStream in = null;
            String result = "";
            byte buffer[] = new byte[8192];
            int len;
            try {
                MessageDigest md5 = MessageDigest.getInstance("MD5");
                in = new FileInputStream(file);
                while ((len = in.read(buffer)) != -1) {
                    md5.update(buffer, 0, len);
                }
                byte[] bytes = md5.digest();
    
                for (byte b : bytes) {
                    String temp = Integer.toHexString(b & 0xff);
                    if (temp.length() == 1) {
                        temp = "0" + temp;
                    }
                    result += temp;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != in) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return result;
        }
    
        /**
         * 采用nio的方式,计算文件的 MD5 值
         *
         * @param file
         * @return
         */
        public static String md5Nio(File file) {
            String result = "";
            FileInputStream in = null;
            try {
                in = new FileInputStream(file);
                MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
                MessageDigest md5 = MessageDigest.getInstance("MD5");
                md5.update(byteBuffer);
                byte[] bytes = md5.digest();
                for (byte b : bytes) {
                    String temp = Integer.toHexString(b & 0xff);
                    if (temp.length() == 1) {
                        temp = "0" + temp;
                    }
                    result += temp;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != in) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return result;
        }
    
        /**
         * 对字符串多次MD5加密
         *
         * @param string
         * @param times
         * @return
         */
        public static String md5(String string, int times) {
            if (TextUtils.isEmpty(string)) {
                return "";
            }
            String md5 = md5(string);
            for (int i = 0; i < times - 1; i++) {
                md5 = md5(md5);
            }
            return md5(md5);
        }
    
        /**
         * MD5加盐
         * <p>
         * 加盐的方式也是多种多样
         * <p>
         * string+key(盐值key)然后进行MD5加密
         * <p>
         * 用string明文的hashcode作为盐,然后进行MD5加密
         * 随机生成一串字符串作为盐,然后进行MD5加密
         *
         * @param string
         * @param slat
         * @return
         */
        public static String md5(String string, String slat) {
            if (TextUtils.isEmpty(string)) {
                return "";
            }
            MessageDigest md5 = null;
            try {
                md5 = MessageDigest.getInstance("MD5");
                byte[] bytes = md5.digest((string + slat).getBytes());
                String result = "";
                for (byte b : bytes) {
                    String temp = Integer.toHexString(b & 0xff);
                    if (temp.length() == 1) {
                        temp = "0" + temp;
                    }
                    result += temp;
                }
                return result;
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return "";
        }
    }
    
    

    Demo下载地址:java-android:AES加密,RAS加密,DES加密,MD5加密,Base64加密,异或加密

    相关文章

      网友评论

        本文标题:MD5加密算法

        本文链接:https://www.haomeiwen.com/subject/nhkasxtx.html