public classSHA1 {private final int[] abcde ={0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0};//摘要数据存储数组

private int[] digestInt = new int[5];//计算过程中的临时数据存储数组

private int[] tmpData = new int[80];//计算sha-1摘要

private int process_input_bytes(byte[] bytedata) {//初试化常量

System.arraycopy(abcde, 0, digestInt, 0, abcde.length);//格式化输入字节数组,补10及长度数据

byte[] newbyte =byteArrayFormatData(bytedata);//获取数据摘要计算的数据单元个数

int MCount = newbyte.length / 64;//循环对每个数据单元进行摘要计算

for (int pos = 0; pos < MCount; pos++) {//将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中

for (int j = 0; j < 16; j++) {

tmpData[j]= byteArrayToInt(newbyte, (pos * 64) + (j * 4));

}//摘要计算函数

encrypt();

}return 20;

}//格式化输入字节数组格式

private byte[] byteArrayFormatData(byte[] bytedata) {//补0数量

int zeros = 0;//补位后总位数

int size = 0;//原始数据长度

int n =bytedata.length;//模64后的剩余位数

int m = n % 64;//计算添加0的个数以及添加10后的总长度

if (m < 56) {

zeros= 55 -m;

size= n - m + 64;

}else if (m == 56) {

zeros= 63;

size= n + 8 + 64;

}else{

zeros= 63 - m + 56;

size= (n + 64) - m + 64;

}//补位后生成的新数组内容

byte[] newbyte = new byte[size];//复制数组的前面部分

System.arraycopy(bytedata, 0, newbyte, 0, n);//获得数组Append数据元素的位置

int l =n;//补1操作

newbyte[l++] = (byte) 0x80;//补0操作

for (int i = 0; i < zeros; i++) {

newbyte[l++] = (byte) 0x00;

}//计算数据长度,补数据长度位共8字节,长整型

long N = (long) n * 8;byte h8 = (byte) (N & 0xFF);byte h7 = (byte) ((N >> 8) & 0xFF);byte h6 = (byte) ((N >> 16) & 0xFF);byte h5 = (byte) ((N >> 24) & 0xFF);byte h4 = (byte) ((N >> 32) & 0xFF);byte h3 = (byte) ((N >> 40) & 0xFF);byte h2 = (byte) ((N >> 48) & 0xFF);byte h1 = (byte) (N >> 56);

newbyte[l++] =h1;

newbyte[l++] =h2;

newbyte[l++] =h3;

newbyte[l++] =h4;

newbyte[l++] =h5;

newbyte[l++] =h6;

newbyte[l++] =h7;

newbyte[l++] =h8;returnnewbyte;

}private int f1(int x, int y, intz) {return (x & y) | (~x &z);

}private int f2(int x, int y, intz) {return x ^ y ^z;

}private int f3(int x, int y, intz) {return (x & y) | (x & z) | (y &z);

}private int f4(int x, inty) {return (x << y) | x >>> (32 -y);

}//单元摘要计算函数

private voidencrypt() {for (int i = 16; i <= 79; i++) {

tmpData[i]= f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^tmpData[i- 16], 1);

}int[] tmpabcde = new int[5];for (int i1 = 0; i1 < tmpabcde.length; i1++) {

tmpabcde[i1]=digestInt[i1];

}for (int j = 0; j <= 19; j++) {int tmp = f4(tmpabcde[0], 5) +f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +tmpData[j]+ 0x5a827999;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] =tmp;

}for (int k = 20; k <= 39; k++) {int tmp = f4(tmpabcde[0], 5) +f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +tmpData[k]+ 0x6ed9eba1;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] =tmp;

}for (int l = 40; l <= 59; l++) {int tmp = f4(tmpabcde[0], 5) +f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +tmpData[l]+ 0x8f1bbcdc;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] =tmp;

}for (int m = 60; m <= 79; m++) {int tmp = f4(tmpabcde[0], 5) +f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +tmpData[m]+ 0xca62c1d6;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] =tmp;

}for (int i2 = 0; i2 < tmpabcde.length; i2++) {

digestInt[i2]= digestInt[i2] +tmpabcde[i2];

}for (int n = 0; n < tmpData.length; n++) {

tmpData[n]= 0;

}

}//4字节数组转换为整数

private int byteArrayToInt(byte[] bytedata, inti) {return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) |((bytedata[i+ 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);

}//整数转换为4字节数组

private void intToByteArray(int intValue, byte[] byteData, inti) {

byteData[i]= (byte) (intValue >>> 24);

byteData[i+ 1] = (byte) (intValue >>> 16);

byteData[i+ 2] = (byte) (intValue >>> 8);

byteData[i+ 3] = (byte) intValue;

}//将字节转换为十六进制字符串

private static String byteToHexString(byteib) {char[] Digit ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c','d', 'e', 'f'};char[] ob = new char[2];

ob[0] = Digit[(ib >>> 4) & 0X0F];

ob[1] = Digit[ib & 0X0F];

String s= newString(ob);returns;

}//将字节数组转换为十六进制字符串

private static String byteArrayToHexString(byte[] bytearray) {

String strDigest= "";for (int i = 0; i < bytearray.length; i++) {

strDigest+=byteToHexString(bytearray[i]);

}returnstrDigest;

}//计算sha-1摘要,返回相应的字节数组

public byte[] getDigestOfBytes(byte[] byteData) {

process_input_bytes(byteData);byte[] digest = new byte[20];for (int i = 0; i < digestInt.length; i++) {

intToByteArray(digestInt[i], digest, i* 4);

}returndigest;

}//计算sha-1摘要,返回相应的十六进制字符串

public String getDigestOfString(byte[] byteData) {returnbyteArrayToHexString(getDigestOfBytes(byteData));

}public static voidmain(String[] args) {

String data= "1";

System.out.println(data);

String digest= newSHA1().getDigestOfString(data.getBytes());

System.out.println(digest);

}

}

sha1 java 代码_HMAC-SHA1的java源代码实现相关推荐

  1. 【Java 代码实例 13】Java操作pdf的工具类itext

    目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...

  2. 画王八java代码参数_java画乌龟源代码-郭遥航.doc

    java画乌龟源代码-郭遥航.doc /*JAVA基本功小练习用java语言描述小王八用鼠标可以拖动小乌龟进行移动选中乌龟时可以显示小乌龟的腹面*/importjava.awt.*;importjav ...

  3. asp java 变量_ASP_用stack变量优化Java代码,  java程序包含了大量的对象 - phpStudy...

    用stack变量优化Java代码 java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量. 我们写一个Java类,在其 ...

  4. java代码识别_识别Java中的代码气味

    java代码识别 作为软件开发人员,我们不仅要编写有效的代码,而且还要编写可维护的代码,这是我们的责任. Martin Fowler在他的<重构:改进现有代码的设计>中将代码气味定义为: ...

  5. 大数据 java 代码示例_功能Java示例 第7部分–将失败也视为数据

    大数据 java 代码示例 这是称为" Functional Java by Example"的系列文章的第7部分. 我在本系列的每个部分中开发的示例是某种"提要处理程序 ...

  6. jsp java代码_jsp内的java代码不执行,急啊!!大家来看看!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我的jsp页面上的java代码和html代码是穿插的, 用System.out.println去跟踪的时候, 内的代码都不执行, html都是执行的! 怎 ...

  7. linux怎样写java代码,linux 怎么写java

    linux 怎么写java 一.环境安装 由于使用 yum 或者 apt-get 命令 安装 openjdk 可能存在类库不全,从而导致用户在安装后运行相关工具时可能报错的问题,所以此处我们推荐采用手 ...

  8. java代码自动抠图_Opencv java实现人脸抠图和行为识别

    基于java的OpenCV环境搭建(Windows平台上ecplise) https://blog..net/qq_32447301/article/details/78494913 https:// ...

  9. java 代码加壳,关于java加壳和代码混淆

    在C中,进行,首要经过加壳的方法.所谓加壳,即是先将程序代码加密,然后用特定的程序加载器,将代码解密后加载进内存,这样能够在避免代码的反编译,当然,有加壳东西,也有解壳东西,尽管不能100%避免cra ...

  10. java 代码封装_封装 java代码

    Java工程师必知词汇:封装 |名词定义| 封装(Encapsulation)是将数据和处理数据的程序组合起来,仅对外公开接口,达到信息隐藏的功能.封装的优点是能减少耦合.Java定义对象都是在语法中 ...

最新文章

  1. 数字图像处理之图像几何变换
  2. 免费网络研讨会:调试生产中Java的新方法
  3. 前端基础-html-段落标签
  4. 腾讯视频向湖北地区用户推出1个月免费看活动
  5. [毕业生的商业软件开发之路]系列文章目录规划
  6. 绝对定位(HTML、CSS)
  7. HDU 1862 EXCEL次序 (排序水问题)
  8. (day 26 - 广度优先搜索 )剑指 Offer 32 - III. 从上到下打印二叉树 III
  9. 机器学习常见概率模型
  10. 通讯录管理软件Cardhop for Mac
  11. 华为自研OS操作系统,今秋是否真的会面市?
  12. 一文读懂HBase的存储模式--BigTable
  13. 2019_Generative Adversarial Networks for Extreme Learned Image Compression
  14. Unity笔记-29-ARPG游戏项目-01-第三人称相机
  15. 论文阅读-2017-Vidal-NEARP
  16. Java中接口如何继承接口呢?
  17. MATLAB 学习心得(3) 定积分和双重积分,三重积分的求法
  18. 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(四)
  19. 【EMC专题】电磁辐射的危害
  20. php remember,PHP remember me

热门文章

  1. 一些认识或对不清楚知识的猜想
  2. 学习PHP的必备开发工具
  3. ANIMATION经典小车动画
  4. PHP实现MySQL并发查询
  5. 从mysql中检索数据后,通过userId的链接去delete数据
  6. 第10章 接口、继承与多态----对象类型的转换
  7. HDU 4059 The Boss on Mars(容斥原理)
  8. 【MySQL】与【Oracle】
  9. android 点击后退按钮,android – 按下后退按钮后重新选择正确的NavigationView菜单项...
  10. android 弹幕礼物,Android的简易弹幕