当前位置: 首页 > news >正文

Base64编码、AES加密、RSA加密、MD5加密

一、Base64编码

1.1、base64编码的概念

        Base64 是一种编码方式,而不是加密手段。它的主要目的是将数据转换成特定格式,以便在网络传输或存储时使用。其核心原理是将二进制数据按 6 位一组进行切分然后映射为可打印字符,从而生成安全、可读的字符串。

1.2、base64编码过程

        我们拿helloword进行base64编码为例

1.2.1、将helloword通过ASCII表找到对应的十进制数

        我们通过ASCII表可以找到helloword对应的十进制数分别是104,101,108,108,111,119,111,114,100

1.2.2、将helloword对应的十进制数转换成二进制数

        二进制只有 0 和 1 两个数字。转换方法就是不断除以 2 取余数,然后把余数倒过来排列。通常为 8 位,也就是1个字节,不够补 0。

我们拿104为例,

104 ÷ 2 = 52,余数 0
52 ÷ 2 = 26,余数 0
26 ÷ 2 = 13,余数 0
13 ÷ 2 = 6,余数 1
6 ÷ 2 = 3,余数 0
3 ÷ 2 = 1,余数 1
1 ÷ 2 = 0,余数 1

把余数倒过来写:104 → 01101000

        按照上面的计算方法,104,101,108,108,111,119,111,114,100转化成二进制数后分别为

01101000,01100101,01101100,01101100,01101111,01110111,01101111,01110010,01100100

1.2.3、将上面的二进制流每6位切分

        Base64 中的“6”表示每个输出字符对应 6 位二进制,所以将上面的二进制流每6位切分:

 011010 000110 010101 101100 011011 000110 111101 110111 011011 110111 001001 100100

1.2.4、将每组 6 位二进制转换为十进制

        将上面的每6位二进制数转化成对应的十进制数:

26 6 21 44 27 6 61 55 27 55 9 36

1.2.5、查 Base64 码表

        通过查上面的base64码表我们可以得到26 6 21 44 27 6 61 55 27 55 9 36这几个十进制数对应的字符:aGVsbG93b3Jk

        以上就是helloword通过base64编码的全过程

1.3、使用java代码实现编码和解码

package cn.itcast.base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class Test3 {private static final String UTF8=StandardCharsets.UTF_8.name();public static void main(String[] args) throws Exception {String str="赚大钱,拿高薪";//使用jdk8自带的方法进行编码String encodeStr = Base64.getEncoder().encodeToString(str.getBytes(UTF8));System.out.println("encodeStr = " + encodeStr);//使用jdk8自带的方法进行解码byte[] decode = Base64.getDecoder().decode(encodeStr.getBytes(UTF8));System.out.println("decodeStr = " + new String(decode,UTF8));}}

1.4、总结:

1、原始数据 → 字节流

        字符串每个字符先转成 ASCII(或 UTF-8)对应的字节

2、字节流 → 二进制流

        每个字节 8 位,拼成一条连续的二进制串。

3、二进制流 → 每 6 位切分

        按 6 位一组切分,得到 0~63 的二进制块。

4、6 位二进制 → 十进制索引

        每 6 位二进制转十进制,得到 0~63 的索引值。

        例如:011010 → 26

5、查 Base64 码表 → 对应字符

        用步骤 4 得到的十进制索引去查 Base64 表

6、Base64编码名字的由来:由Base64码表中64个字符构成的字符串

二、MD5加密、SHA-256加密、SHA-512加密

2.1、MD5加密、SHA-256加密、SHA-512加密的特点

        在信息安全中,常见的三种哈希算法分别是 MD5SHA-256SHA-512,他们都是不可逆的,即不能通过加密后的结果反推出原始值,哈希算法又称为摘要算法,他们三个的特点如下:

MD5:

生成的字符串长度:128 位(32 位十六进制字符串)

特点:速度快,但已被证明存在漏洞

适用:文件校验,不适合安全加密

SHA-256:

生成的字符串长度:256 位(64 位十六进制字符串)

特点:安全性高,性能与安全性平衡

适用:区块链、数字签名、密码存储

SHA-512:

生成的字符串长度:512 位(128 位十六进制字符串)

特点:安全性更强,摘要更长

适用:金融、军事等高安全需求场景

2.2、MD5加密、SHA-256加密、SHA-512加密在java中的使用

package cn.itcast.md5;
import org.junit.Test;import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class Test3 {private static final String UTF8=StandardCharsets.UTF_8.name();private static final String encryMehod="MD5";private static final String encryMehodSha256="SHA-256";private static final String encryMehodSha512="SHA-512";public static void main(String[] args) throws Exception {String str="赚大钱,拿高薪";//得到摘要算法对象MessageDigest md5 = MessageDigest.getInstance(encryMehod);//获取原始内容的字节数组byte[] bytes = str.getBytes(UTF8);//得到加密后的字节数组byte[] digest = md5.digest(bytes);//转换成base64编码后的字符串String digestStr = Base64.getEncoder().encodeToString(digest);//e5chhV0sUGv52v0ACRi7ow==System.out.println("digestStr:" + digestStr);}@Testpublic void test() throws NoSuchAlgorithmException, UnsupportedEncodingException {String str="赚大钱,拿高薪";//得到摘要算法对象MessageDigest md5 = MessageDigest.getInstance(encryMehodSha256);//获取原始内容的字节数组byte[] bytes = str.getBytes(UTF8);//得到加密后的字节数组byte[] digest = md5.digest(bytes);//转换成base64编码后的字符串String digestStr = Base64.getEncoder().encodeToString(digest);///9KkZoej9MOqqSM5Oys3yb7tjPvv0pRQMaTFBr7/3PY=System.out.println("digestStr:" + digestStr);}@Testpublic void test2() throws NoSuchAlgorithmException, UnsupportedEncodingException {String str="赚大钱,拿高薪";//得到摘要算法对象MessageDigest md5 = MessageDigest.getInstance(encryMehodSha512);//获取原始内容的字节数组byte[] bytes = str.getBytes(UTF8);//得到加密后的字节数组byte[] digest = md5.digest(bytes);//转换成base64编码后的字符串String digestStr = Base64.getEncoder().encodeToString(digest);///66In1HuSrsSPoMIG6lZpYlZc6s9U2Cyebqb3V4gkyRLgP7H9GXvA6GCZ7ybL1+TXrWkAlsfLVq72sRTNJ2pBQA==System.out.println("digestStr:" + digestStr);}}

三、对称加密

3.1、对称加密的特点

        对称加密使用同一密钥加解密速度快但密钥需保密,而 AES 是一种安全性高、效率快、密钥长度可选 128/192/256 、广泛应用的对称加密算法。

3.2、java代码实现AES加解密

package cn.itcast.encry;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class Test3 {private static  final String ALGORITHM="AES";private static final String key="123456789avbkjui";public static void main(String[] args) throws Exception {String text="我是需要被加密的字符串";//使用java自带的cipher对象,并且指定加密方式为AES对称加密Cipher cipher = Cipher.getInstance(ALGORITHM);//创建加解密的规则SecretKey secretKey=new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8),ALGORITHM);//选择加密还是解密模式,此时选择加密模式cipher.init(Cipher.ENCRYPT_MODE,secretKey);//将所需要的字符串进行加密,得到字节数组byte[] bytes = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));//将字节数组进行base64编码得到可视化的字符串String result = Base64.getEncoder().encodeToString(bytes);System.out.println("AES对称加密后进行base64编码后的结果:" + result);String dencry = dencry(result);System.out.println("AES对称解密后的结果:" + dencry);}public static String dencry(String text) throws Exception {//使用java自带的cipher对象,并且指定解密方式为AES对称解密Cipher cipher = Cipher.getInstance(ALGORITHM);//创建加解密的规则SecretKey secretKey=new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8),ALGORITHM);//选择加密还是解密模式,此时选择解密模式cipher.init(Cipher.DECRYPT_MODE,secretKey);//首先将经过base64编码后的字符串解码为字节数组,再将字节数组进行解密byte[] decode = Base64.getDecoder().decode(text);byte[] bytes = cipher.doFinal(decode);//将字节数组转化成正常字符串return new String(bytes,StandardCharsets.UTF_8);}}

http://www.xdnf.cn/news/1351999.html

相关文章:

  • RAG Embeddings 向量数据库
  • 使用Ollama部署自己的本地模型
  • 疯狂星期四文案网第48天运营日记
  • 12 SQL进阶-锁(8.20)
  • Python语法速成课程(二)
  • 科技赋能,宁夏农业绘就塞上新“丰”景
  • 进程的概念:进程调度算法
  • 【GPT入门】第57课 详解 LLamaFactory 与 XTuner 实现大模型多卡分布式训练的方案与实践
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(七) 鼠标在控件上悬浮时的提示
  • linux中文本文件操作之grep命令
  • 【软件设计模式】策略模式
  • MySQL:事务管理
  • Intel RealSense D435 深度相机详解
  • Java 学习笔记(基础篇8)
  • Linux总线设备驱动模型深度理解
  • Vue3 学习教程,从入门到精通,基于 Vue 3 + Element Plus + ECharts + JavaScript的51购商城项目(45)
  • imx6ull-驱动开发篇37——Linux MISC 驱动实验
  • 大模型四种常见安全问题与攻击案例
  • MySQL数据库管理与索引优化全攻略
  • 力扣(全排列)
  • 使用 PSRP 通过 SSH 建立 WinRM 隧道
  • Linux-常用文件IO函数
  • jQuery 知识点复习总览
  • (nice!!!)(LeetCode 面试经典 150 题) 173. 二叉搜索树迭代器 (栈)
  • 55 C++ 现代C++编程艺术4-元编程
  • 数据结构与算法-字符串、数组和广义表(String Array List)
  • 【Tech Arch】Apache Flume海量日志采集的高速公路
  • 解码LLM量化:深入剖析最常见8位与4位核心算法
  • Mac相册重复照片终结指南:技术流清理方案
  • chromadb使用hugging face模型时利用镜像网站下载注意事项