当前位置: 首页 > 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.dtcms.com/a/346854.html

相关文章:

  • 基于大模型的对话式推荐系统技术架构设计
  • 【K8s】整体认识K8s--K8s架构与集群创建过程
  • Doxygen是什么?
  • 多模态大语言VLM模型综述
  • 【GPT入门】第56课 大模型分布式训练的三种方式、模型层介绍及DeepSpeed ZeRO的支持
  • 《Linux》基础命令到高级权限管理指南
  • 【KO】前端面试题三
  • React Hooks UseRef的用法
  • 【Win10 画图板文字方向和繁体问题】
  • 浮点数比较的致命陷阱与正确解法(精度问题)
  • linux下的网络编程:基础概念+UDP编程
  • Class41样式迁移
  • 55.Redis搭建主从架构
  • 计算机网络 各版本TLS握手的详细过程
  • CSS学习步骤及详解
  • 美食菜谱数据集(13943条)收集 | 智能体知识库 | AI大模型训练
  • JUC之虚拟线程
  • ArcGIS Pro 安装路径避坑指南:从崩溃根源到规范实操(附问题修复方案)
  • 运行npm run命令报错“error:0308010C:digital envelope routines::unsupported”
  • 使用 AD 帐户从 ASP.NET 8 容器登录 SQL Server 的 Kerberos Sidecar
  • 【深入理解 Linux 网络】收包原理与内核实现(下)应用层读取与 epoll 实现
  • 5G物联网的现实与未来:CTO视角下的成本、风险与破局点
  • 嵌入式学习日记(33)TCP
  • OpenFeign相关记录
  • 【嵌入式】【搜集】RTOS相关技术信息整理
  • Ubuntu2204server系统安装postgresql14并配置密码远程连接
  • 【python与生活】如何自动总结视频并输出一段总结视频?
  • FastAPI + SQLAlchemy 数据库对象转字典
  • 【力扣 Hot100】每日一题
  • C++之list类的代码及其逻辑详解 (中)