MD5加密算法「建议收藏」

MD5加密算法「建议收藏」MD5的全称是Message-DigestAlgorithm5(信息-摘要算法),在90年代初由MITLaboratoryforComputerScience和RSADataSecurityInc的RonaldL.Rivest开发出来,经MD2、MD3和MD4发展而来。MD5加密算法:http://blog.csdn.net/huangxiaoguo1/artic

大家好,又见面了,我是你们的朋友全栈君。

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)=X^Y^Z 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加密,异或加密

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157277.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Nginx工作原理和优化总结。「建议收藏」

    NGINX以高性能的负载均衡器,缓存,和web服务器闻名,驱动了全球超过40%最繁忙的网站。在大多数场景下,默认的NGINX和Linux设置可以很好的工作,但要达到最佳性能,有些时候必须做些调整。首先我们先了解其工作原理。1.Nginx的模块与工作原理Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客…

    2022年4月13日
    88
  • 关于opencv报错:未定义标识符”CV_WINDOW_AUTOSIZE”[通俗易懂]

    关于opencv报错:未定义标识符”CV_WINDOW_AUTOSIZE”[通俗易懂]报错:未定义标识符”CV_WINDOW_AUTOSIZE”解决方案:在代码开头加入头文件#include<opencv2/highgui/highgui_c.h>

    2022年6月6日
    117
  • java.lang.verifyerror_java.lang.reflect.undeclared

    java.lang.verifyerror_java.lang.reflect.undeclared以前写代码,总免不了编写登陆部分。在获取user的时候,只可能返回一个user实例,或者为null。以前使用以下方法实现。publicUserget(Stringid){Sessionsession=HibernateUtil.getSessionFactory().openSession();Stringhql=”fromUseruwhereu.id=?”;Listlis…

    2022年9月25日
    3
  • mysql 字符串转数字并排序

    mysql 字符串转数字并排序使用二级查询首先将字符串的列转成数字,然后排序select*from (selectCONVERT(k.key,SIGNED)askid,pathfromkpvk)tORDERBYt.kidasc;

    2022年5月30日
    47
  • 启动mysql报错10038_解决navicat远程连接mysql报错10038的问题

    navicat远程连接mysql报错10038一般由以下两个原因:一:本地防火墙问题在本地安装了mysql、navicat并打开了mysql服务的情况下,来设置防火墙。首先右击或者点击入站规则,找到新建规则,点击。点击端口。在特定本地端口中填入3306.一直点击下一步。这里可以给一个好分别的名称即可。之前再尝试连接即可,若仍然不可以,可能是服务器方面的问题。二:服务器3306端口未打开首先需要在安…

    2022年4月11日
    109
  • 软件管理和电脑管家打不开怎么办_电脑管家下载软件连接错误

    软件管理和电脑管家打不开怎么办_电脑管家下载软件连接错误错误:应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具”问题的处理方法。方法一:开始-运行(输入services.msc)-确定或回车,打开:服务(本地);我们在服务(本地)窗口找到:WindowsModulesInstaller服务,查看是否被禁用;3…如果WindowsModulesInstaller服务被禁用,我们必须把它更改为启用-手动,重启计算机,再安装应用程序。转载至https://blo

    2022年8月13日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号