代码如下,请自取

/**
* @description: SHA256算法加密
* @author: luolei
* @Date: 2022-10-31 17:16
*/
public class SHA256 {
// 用long模拟32位无符号数据
// 前32位0,后32位1的数字,控制数字在32位,4294967295
final static long OVER = 0xFFFFFFFFL;
// 前8个质数的平方根的小数
// long[] h = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};
static long h0 = 0x6a09e667L;
static long h1 = 0xbb67ae85L;
static long h2 = 0x3c6ef372L;
static long h3 = 0xa54ff53aL; static long h4 = 0x510e527fL;
static long h5 = 0x9b05688cL;
static long h6 = 0x1f83d9abL;
static long h7 = 0x5be0cd19L; // 前64个质数的立方根的小数
static long[] k = {
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; public static String getSha256(String in) {
StringBuilder stringBuilder = toBinary(in);
String string = addZeroTo512(stringBuilder);
return cycleCalculation(string);
} // 1. 将输入的字符串转换为二进制in
// string的长度限制在2^32
private static StringBuilder toBinary(String in) {
StringBuilder stringBuilder = new StringBuilder();
char[] inArray = in.toCharArray();
for (int i = 0; i < inArray.length; i++) {
// 还有前导的0
String binary = Integer.toBinaryString(inArray[i]);
int count0 = 8 - binary.length();
for (int j = 0; j < count0; j++) {
stringBuilder.append("0");
}
stringBuilder.append(binary);
}
return stringBuilder;
} // 2. 将输入的二进制的长度补齐到512的倍数,原长度l + 1(默认1位1) + k(补齐的0) + 64(64为二进制表示的输入字符串的长度)
private static String addZeroTo512(StringBuilder binaryIn) { int l = binaryIn.length();
int k = 959 - (l % 512);
if (k > 512) {
k = k - 512;
}
// 默认先添加1
binaryIn.append("1");
// 添加k个0
for (int i = 0; i < k; i++) {
binaryIn.append("0");
}
// 添加64位的源数据长度
String lengthBinary = Integer.toBinaryString(l);
int k2 = 64 - lengthBinary.length();
for (int i = 0; i < k2; i++) {
binaryIn.append("0");
}
binaryIn.append(lengthBinary); return binaryIn.toString();
} // 核心:循环计算 /**
* @param binaryIn 通过补位后的源数据
* @return
*/
private static String cycleCalculation(String binaryIn) {
// 1. 按照512的长度分成n个消息块
int n = binaryIn.length() / 512;
for (int i = 0; i < n; i++) {
// 对于每一个块
// 2. 每个消息块分成16个32位的“字”
String[] wString = new String[16];
for (int j = 0; j < 16; j++) {
wString[j] = binaryIn.substring(32 * j, 32 + 32 * j);
}
// 3. 将16个字扩充为64个字,转换方法
long[] w = new long[64];
for (int j = 0; j < wString.length; j++) {
// 将二进制的string转为10进制的long
w[j] = Long.parseLong(wString[j], 2);
}
// s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor(w[i-15] rightshift 3)
// s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor(w[i-2] rightshift 10)
// w[i] := w[i-16] + s0 + w[i-7] + s1
for (int j = 16; j < 64; j++) {
long s0 = ((rightRotate(w[j - 15], 7)) ^ rightRotate(w[j - 15], 18) ^ (rightShift(w[j - 15], 3))) & OVER;
long s1 = ((rightRotate(w[j - 2], 17)) ^ (rightRotate(w[j - 2], 19)) ^ (rightShift(w[j - 2], 10))) & OVER;
w[j] = (w[j - 16] + s0 + w[j - 7] + s1) & OVER;
}
// 4. hash初始化
long a = h0;
long b = h1;
long c = h2;
long d = h3; long e = h4;
long f = h5;
long g = h6;
long h = h7;
// 5. 64次循环
for (int j = 0; j < 64; j++) {
// s0 := (a rightrotate 2) xor (a rightrotate 13) xor(a rightrotate 22)
// maj := (a and b) xor (a and c) xor(b and c)
// t2 := s0 + maj
// s1 := (e rightrotate 6) xor (e rightrotate 11) xor(e rightrotate 25)
// ch := (e and f) xor ((not e) and g)
// t1 := h + s1 + ch + k[i] + w[i]
// h := g
// g := f
// f := e
// e := d + t1
// d := c
// c := b
// b := a
// a := t1 + t2 long s0 = (rightRotate(a, 2) ^ (rightRotate(a, 13)) ^ (rightRotate(a, 22))) & OVER;
long maj = ((a & b) ^ (a & c) ^ (b & c)) & OVER;
long t2 = (s0 + maj) & OVER;
long s1 = ((rightRotate(e, 6)) ^ (rightRotate(e, 11)) ^ (rightRotate(e, 25))) & OVER;
long ch = ((e & f) ^ ((~e) & g)) & OVER;
long t1 = (h + s1 + ch + k[j] + w[j]) & OVER;
h = g;
g = f;
f = e;
e = (d + t1) & OVER;
d = c;
c = b;
b = a;
a = (t1 + t2) & OVER;
} h0 = (h0 + a) & OVER;
h1 = (h1 + b) & OVER;
h2 = (h2 + c) & OVER;
h3 = (h3 + d) & OVER;
h4 = (h4 + e) & OVER;
h5 = (h5 + f) & OVER;
h6 = (h6 + g) & OVER;
h7 = (h7 + h) & OVER;
}
// 把h0到h7拼起来就是所需要的值了。
return getHash(h0) + getHash(h1) + getHash(h2) + getHash(h3) + getHash(h4) + getHash(h5) + getHash(h6) + getHash(h7);
} // 把long型的数字转换为字符串,只取后32位的数字,不足则前补0,前面多余的则舍去
private static String getHash(long h) {
String hash = Long.toHexString(h);
StringBuilder result = new StringBuilder();
if (hash.length() > 8) {
result.append(hash.substring(hash.length() - 8, hash.length()));
} else {
int count0 = 8 - hash.length();
for (int i = 0; i < count0; i++) {
result.append("0");
}
result.append(hash);
}
return result.toString();
} /**
* 右旋n位,循环右移n位,对于32位无符号数字而言,末尾的数字被移到开头
* 用long模拟32位无符号数字,末尾被移出的数字替换到开头,相当于左移了
*
* @param x
* @param n
* @return
*/
private static long rightRotate(long x, int n) {
long wei = (0 << n) - 1; // 这个操作有点疑问
x = ((wei & (x & OVER)) << (32 - n)) | (x & OVER) >> n;
return x;
} /**
* 按位右移n位,末尾的数字舍去,前面补0,相当于>>>,无符号右移
*
* @param x
* @param n
* @return
*/
private static long rightShift(long x, int n) {
// return (x&0xFFFFFFFFL)>>n;
return (x & OVER) >>> n;
}
}

SHA256算法加密工具类的更多相关文章

  1. App开发流程之加密工具类

    科技优家 2016-09-08 18:10 从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累. 我建议先将基础的工具加入项目,后续的开发效率会呈指数增长.如果在专注功能开发过程中,才发现缺少 ...

  2. java 加密工具类(MD5、RSA、AES等加密方式)

    1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...

  3. Java AES 加密工具类

    package com.microwisdom.utils; import java.security.NoSuchAlgorithmException; import java.security.S ...

  4. 加密工具类 - CryptoUtils.java

    加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载  - CryptoUtils.java.commons-io-2.4.jar.commons-code ...

  5. android开发MD5加密工具类(一)

    MD5加密工具类整理: package com.gzcivil.utils; import java.io.UnsupportedEncodingException; import java.secu ...

  6. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  7. c# 加密工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  8. java MD5Utils 加密工具类

    package com.sicdt.library.core.utils; import java.io.File; import java.io.FileInputStream; import ja ...

  9. spring自带的MD5加密工具类

    Spring 自带的md5加密工具类,本来打算自己找一个工具类的,后来想起来Spring有自带的,就翻了翻 //导入包import org.springframework.util.DigestUti ...

  10. 封装各种生成唯一性ID算法的工具类

    /** * Copyright (c) 2005-2012 springside.org.cn * * Licensed under the Apache License, Version 2.0 ( ...

随机推荐

  1. html元数据

    元数据就是用来描述数据的数据.HTML中也有很多元数据. <meta>标签提供关于HTML文档的元数据:描述(description)\关键词(keywords).文档的作者(author ...

  2. 使用MkDocs搭建个人博客

    使用MkDocs搭建个人博客 接触编程已经好几年了,阅读了无数大佬的博客文章,但是从来没有自己写过.这其中最重要的原因当然是懒惰,觉得写博客太费时间了,对自己的帮助也不大.可是如今发现自己的记性越来越 ...

  3. ChatGPT赋能低代码开发:打造智能应用的双重引擎

    摘要:本文摘自葡萄城低代码产品活字格的资深用户(格友超哥)所撰写的文章:<惊叹表现!活字格+ChatGPT:低代码开发智能应用的巨大潜力>. ChatGPT的functions函数使用方 ...

  4. springboot项目自动关闭进程重启脚本

    话不多说,先上脚本 kill -15 $(netstat -nlp | grep :9095 | awk '{print $7}' | awk -F"/" '{ print $1 ...

  5. 【源码】Vue.js 官方脚手架 create-vue 是怎么实现的?

    Vue.js 官方脚手架 create-vue 是怎么实现的? 摘要 本文共分为四个部分,系统解析了vue.js 官方脚手架 create-vue 的实现细节. 第一部分主要是一些准备工作,如源码下载 ...

  6. KRPano中文教程文档PDF版本下载

    KRPano中文教程文档PDF版本下载 下载地址:https://pan.baidu.com/s/1qXIZ2os 感谢KRPano技术解密群小伙伴:斌仔分享 中文文档目录: 概述文件说明krpano ...

  7. 在Vue2和Vue3中JSX的使用集锦

    Vue2安装JSX支持 有时候,我们使用渲染函数(render function)来抽象组件,而渲染函数使用Vue的h函数来编写Dom元素相对template语法差别较大,体验不佳,这个时候就派 JS ...

  8. Mac上使用Royal TSX快速连接到OCI主机

    问题: 每次使用Royal TSX连接到OCI主机都要交互式输入opc这个用户名,次数多了也蛮烦. 那如何既指定用户名,又想要通过ssh私钥登陆机器呢? 这个需求确实很初级,但也着实困扰过我,因为开始 ...

  9. Python 潮流周刊第 20 期(摘要)

    你好,我是猫哥.本周刊分享优质的 Python.AI 及通用技术内容,大部分为英文.这里是标题摘要版,查看全文请至☞:https://pythoncat.top/posts/2023-09-16-we ...

  10. 「atcoder - abc246h」01? Queries

    link. 平时基本打不到 ex,这个 ex 还是比较 ez 的,但也有些需要注意的地方. 考虑 dp 规划前缀,设 \(f[i][0/1]\) 表示前缀 \([1, i]\) 否是选 \(i\) 的 ...