sha1 java 代码_HMAC-SHA1的java源代码实现

这个博客详细介绍了如何使用Java实现SHA1哈希算法,包括初始化摘要数据存储数组,格式化输入字节数组,计算数据摘要,以及进行HMAC-SHA1的加密过程。提供了一个名为SHA1的类,包含了从字节数组计算SHA1摘要的完整流程,可用于数据安全相关的Java应用中。
摘要由CSDN通过智能技术生成

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);

}

}

简要介绍<br>JAVA CLASS文件加密工具是一款专门为保护您的JAVA源代码而设计的软件。传统的JAVA代码保护方式通常是扰乱生成的CLASS文件,从而降低反编译生成的源代码的可读性;有的保护工具甚至能生成部分废代码(垃圾代码),使得反编译后的源码在重新编译时出现编译错误,不能直接生成CLASS文件。这种方法具有一定的效果,但是不能彻底保护您的JAVA源代码。 <br><br>JAVA CLASS文件加密工具对CLASS文件进行加密保护,加密密钥高达256位(bit,即:32字节),并采用多重加密的算法,既安全又高效。加密后的CLASS文件不可能被破解;反编译工具对加密后的CLASS文件无能为力,根本就不能处理! <br><br>运行方式<br>运行时,加密后的CLASS文件要能正常加载,需要使用我们提供的动态库hidea.dll。执行java时带上参数<br>-agentlib:<动态库文件所在路径>\hidea<br>注意:不要加文件后缀.dll,直接使用文件的名字部分(classloader)!<br><br>举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行加密后的CLASS文件的命令行如下:<br>java -agentlib:c:\hideasoft\java_protect\hidea <您的CLASS类及参数><br>应用场合<br>独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:<所在路径>\hidea <br>Tomcat等JAVA Web Server,修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\hidea <br>JBOSS等JAVA Application Server(应用服务器),修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\hidea <br>适用环境操作系统:Windows 98/2000/XP 等Windows系统 <br>JDK:1.5.0及以上版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值