MD5加密讲解,附上代码(基本每句都有注释)

1、MD5加密实现代码

package com.atguigu.utils.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public final class MD5 {

    public static String encrypt(String strSrc) {
        try {
            char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', 'a', 'b', 'c', 'd', 'e', 'f' };            // 用于输出编码的类型
            byte[] bytes = strSrc.getBytes();               // 字符串转化为 byte类型,一个字符转化为一个byte,比如 0为48,1为49,ascll码
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);        // 用指定的 byte 数组更新摘要
            bytes = md.digest();     // 通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置,得到固定长度为16的 bytes数组
            int len = bytes.length;  // 得到长度
            char[] chars = new char[len * 2];       //初始化字符数组容量,chars用于存储加密的内容,乘二是因为下面的处理,一个
            int k = 0;
            for (int i = 0; i < bytes.length; i++) {
                byte b = bytes[i];                          // byte类型表示-128~127的整数
                chars[k++] = hexChars[b >>> 4 & 0xf];       // >>>表示无符号右移,oxf表示1111,hexChars为上面写的数组,hexChars的长度为16,经过 & 0xf 运算取最低4位得出下标位置取出字符串
                chars[k++] = hexChars[b & 0xf];
            }
            return new String(chars);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("MD5加密出错!!+" + e);
        }
    }

    public static void main(String[] args) {
        System.out.println(MD5.encrypt("111111"));
        System.out.println(MD5.encrypt("1111"));      
    }
}
  • 上面整个代码的执行流程就是,通过MessageDigest工具得到16位bytes的密文,再把每个密文经过两种运算方式,运算出来的结果当做数组下标从自己设定的hexChars字符数组中取出字符,得出最后加密的密文。
  • 一个密文经过两次运算,每次运算出来的结果当作数组下标取值,所以一个密文,取两次,这就是为什么16长度的bytes数组最后会得到32长度的字符串
  • MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
  • java中MessageDigest已经定义了MD5的计算,得到的结果是128位整数(一个byte是8个整数,所以程序中为16位byte)。然后将得到的128位整数转换成16进制(两个16进制等于1个byte),用字符串的形式输出。

2、MD5加密特性

  • 固定长度,任意数据得到的密文长度都相同
  • md5是单向加密的加密算法
  • 相同的明文在任意时间加密,得到的加密结果是相同的
  • MD5消息摘要算法,属Hash算法一类。

其他

  1. 什么是hash算法
    哈希算法,即 hash,又叫散列算法,是一类把任意数据转换为定长(或限制长度)数据的算法统称。例如我叫张三,你叫李四,那么「人 -> 人名」的算法就叫属于一种哈希算法。哈希算法通常用于制作数字指纹,数字指纹的意思就是「你看到这个东西就像看到原数据一样」,例如我们在一些网站下载大文件的时候,网站提供给我们验证文件完整性的 MD5 或者 SHA1 码,就是原文件的哈希值。哈希算法有很多种,MD5 是其中的一种,这就是 MD5。所以,优秀的哈希算法通常需要具有低碰撞概率(即不同数据的哈希值通常也不一样)。

参考文档:

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个使用C语言和OpenSSL库编写RSA加密算法的示例代码,并且每句代码都有注释说明: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main(void) { RSA *rsa = NULL; // RSA结构体指针 BIO *bio = NULL; // BIO结构体指针 char *pubkey = "-----BEGIN PUBLIC KEY-----\n\ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3SHxX3Qv3RrXn7WUuqE2\n\ 6fL6Nz7mTfjTgJZv5j4Jl9QyJZzJF9eQ3oLJHJG3cBfXWw1XH+df/g8pB3xhVJb7\n\ 4xTmTnGpQ5FezX8Wjh7ACs1xuMfDLG7/JJWvI1D4Y5mB9GZc82XbYJZ2vYBDCs0i\n\ fK8rlnP1n7k1Y0myY9tQ3rKv7lW9HJkLw3O7Xo0lJL1+3dCjJf8z7QaQ8SjvD7XZ\n\ 8ia5S2TJLmNi2bGKmRzGZnKJmQOqoe9sJZlUyOJyv/8fLmJQvZc9OJ5yv5BHJm3D\n\ bXAyNzdZ9QF4JW6ZzvRn9t+JQ1uXw8yCQ7KEv8kX8hxXg3Zj8o1sP3Vn7ZiEIN6V\n\ n2U5zvLZ0rN7tXrW1U3j4C8e3YJ0Df2KXyRqZDrm0ZlZz4L3h3JF7qWx3eQwVMtU\n\ fWV1PvoqJ2OQzILU1FJ3oVJ5d5PpRhXeKlD4Z0JvL8F2DY7Kjy+4mL3g1jX9W1JJ\n\ 2+8eW4w8z6Y+3WpL3n8kBuRRkS5hRv1Cw6dRQ9Q4dM7xKlJjU7W9C5H4K6c+YwCJ\n\ 9YApdJqR1Pz3YfJ2c5bM67Jc0n9zGdH5JZyyqoI6bKzqjpfC3ZcR5I7Q9pFJmzWu\n\ k5A0yy/4yxPnDw5txrNZtL1DemyKv4XUrC9VZl98y3KZyYK+7UgZb3Z6QZQu3IjL\n\ 3xj2tJz6GtDfX7J7H+2c4jECAwEAAQ==\n\ -----END PUBLIC KEY-----"; char *plaintext = "Hello, world!"; // 明文 char *ciphertext = NULL; // 密文 int len = 0; // 密文长度 // 从公钥字符串中读取RSA公钥 bio = BIO_new_mem_buf(pubkey, -1); if (!bio) { printf("BIO_new_mem_buf error.\n"); return 1; } rsa = PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL); if (!rsa) { printf("PEM_read_bio_RSA_PUBKEY error.\n"); return 1; } // 加密操作 len = RSA_size(rsa); ciphertext = (char *)malloc(len); memset(ciphertext, 0, len); len = RSA_public_encrypt(strlen(plaintext), (unsigned char *)plaintext, (unsigned char *)ciphertext, rsa, RSA_PKCS1_PADDING); if (len == -1) { printf("RSA_public_encrypt error.\n"); return 1; } // 输出加密结果 printf("Ciphertext: "); for (int i = 0; i < len; i++) { printf("%02x", (unsigned char)ciphertext[i]); } printf("\n"); // 释放资源 RSA_free(rsa); BIO_free_all(bio); free(ciphertext); return 0; } ``` 此代码实现了从字符串中读取公钥,对明文进行RSA加密,并输出加密结果。需要注意的是,此代码中使用的是RSA_PKCS1_PADDING填充模式,其他填充模式的使用方法类似。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值