C++计算HMAC sha1和HMAC MD5 与java 计算HMAC sha1和HMAC MD5不一样?求高手解答,附上源码

问题描述

publicclassSHA1{privatefinalint[]abcde={0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0};//摘要数据存储数组privateint[]digestInt=newint[5];//计算过程中的临时数据存储数组privateint[]tmpData=newint[80];//计算sha-1摘要privateintprocess_input_bytes(byte[]bytedata){//初试化常量System.arraycopy(abcde,0,digestInt,0,abcde.length);//格式化输入字节数组,补10及长度数据byte[]newbyte=byteArrayFormatData(bytedata);//获取数据摘要计算的数据单元个数intMCount=newbyte.length/64;//循环对每个数据单元进行摘要计算for(intpos=0;pos<MCount;pos++){//将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中for(intj=0;j<16;j++){tmpData[j]=byteArrayToInt(newbyte,(pos*64)+(j*4));}//摘要计算函数encrypt();}return20;}//格式化输入字节数组格式privatebyte[]byteArrayFormatData(byte[]bytedata){//补0数量intzeros=0;//补位后总位数intsize=0;//原始数据长度intn=bytedata.length;//模64后的剩余位数intm=n%64;//计算添加0的个数以及添加10后的总长度if(m<56){zeros=55-m;size=n-m+64;}elseif(m==56){zeros=63;size=n+8+64;}else{zeros=63-m+56;size=(n+64)-m+64;}//补位后生成的新数组内容byte[]newbyte=newbyte[size];//复制数组的前面部分System.arraycopy(bytedata,0,newbyte,0,n);//获得数组Append数据元素的位置intl=n;//补1操作newbyte[l++]=(byte)0x80;//补0操作for(inti=0;i<zeros;i++){newbyte[l++]=(byte)0x00;}//计算数据长度,补数据长度位共8字节,长整型longN=(long)n*8;byteh8=(byte)(N&0xFF);byteh7=(byte)((N>>8)&0xFF);byteh6=(byte)((N>>16)&0xFF);byteh5=(byte)((N>>24)&0xFF);byteh4=(byte)((N>>32)&0xFF);byteh3=(byte)((N>>40)&0xFF);byteh2=(byte)((N>>48)&0xFF);byteh1=(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;}privateintf1(intx,inty,intz){return(x&y)|(~x&z);}privateintf2(intx,inty,intz){returnx^y^z;}privateintf3(intx,inty,intz){return(x&y)|(x&z)|(y&z);}privateintf4(intx,inty){return(x<<y)|x>>>(32-y);}//单元摘要计算函数privatevoidencrypt(){for(inti=16;i<=79;i++){tmpData[i]=f4(tmpData[i-3]^tmpData[i-8]^tmpData[i-14]^tmpData[i-16],1);}int[]tmpabcde=newint[5];for(inti1=0;i1<tmpabcde.length;i1++){tmpabcde[i1]=digestInt[i1];}for(intj=0;j<=19;j++){inttmp=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(intk=20;k<=39;k++){inttmp=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(intl=40;l<=59;l++){inttmp=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(intm=60;m<=79;m++){inttmp=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(inti2=0;i2<tmpabcde.length;i2++){digestInt[i2]=digestInt[i2]+tmpabcde[i2];}for(intn=0;n<tmpData.length;n++){tmpData[n]=0;}}//4字节数组转换为整数privateintbyteArrayToInt(byte[]bytedata,inti){return((bytedata[i]&0xff)<<24)|((bytedata[i+1]&0xff)<<16)|((bytedata[i+2]&0xff)<<8)|(bytedata[i+3]&0xff);}//整数转换为4字节数组privatevoidintToByteArray(intintValue,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;}//将字节转换为十六进制字符串privatestaticStringbyteToHexString(byteib){char[]Digit={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};char[]ob=newchar[2];ob[0]=Digit[(ib>>>4)&0X0F];ob[1]=Digit[ib&0X0F];Strings=newString(ob);returns;}//将字节数组转换为十六进制字符串privatestaticStringbyteArrayToHexString(byte[]bytearray){StringstrDigest="";for(inti=0;i<bytearray.length;i++){strDigest+=byteToHexString(bytearray[i]);}returnstrDigest;}//计算sha-1摘要,返回相应的字节数组publicbyte[]getDigestOfBytes(byte[]byteData){process_input_bytes(byteData);byte[]digest=newbyte[20];for(inti=0;i<digestInt.length;i++){intToByteArray(digestInt[i],digest,i*4);}returndigest;}//计算sha-1摘要,返回相应的十六进制字符串publicStringgetDigestOfString(byte[]byteData){returnbyteArrayToHexString(getDigestOfBytes(byteData));}publicstaticvoidmain(String[]args){Stringdata1="12345678901234567890";byte[]data=Tool.hexStringToBytes(data1);System.out.println(data);Stringdigest=newSHA1().getDigestOfString(data);System.out.println(digest);}publicclassHMACSHA1{publicstaticbyte[]getHmacSHA1(Stringdata,Stringkey){byte[]ipadArray=newbyte[64];byte[]opadArray=newbyte[64];byte[]keyArray=newbyte[64];intex=key.length();SHA1sha1=newSHA1();if(key.length()>64){byte[]temp=sha1.getDigestOfBytes(key.getBytes());ex=temp.length;for(inti=0;i<ex;i++){keyArray[i]=temp[i];}}else{byte[]temp=key.getBytes();for(inti=0;i<temp.length;i++){keyArray[i]=temp[i];}}for(inti=ex;i<64;i++){keyArray[i]=0;}for(intj=0;j<64;j++){ipadArray[j]=(byte)(keyArray[j]^0x36);opadArray[j]=(byte)(keyArray[j]^0x5C);}byte[]tempResult=sha1.getDigestOfBytes(join(ipadArray,data.getBytes()));//tempResult=sha1.getDigestOfBytes(join(ipadArray,tempResult));returnsha1.getDigestOfBytes(join(opadArray,tempResult));}privatestaticbyte[]join(byte[]b1,byte[]b2){intlength=b1.length+b2.length;byte[]newer=newbyte[length];for(inti=0;i<b1.length;i++){newer[i]=b1[i];}for(inti=0;i<b2.length;i++){newer[i+b1.length]=b2[i];}returnnewer;}publicstaticvoidmain(String[]args){HMACSHA1hMacSha1=newHMACSHA1();Stringdata="123456";Stringkey="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";byte[]ab=hMacSha1.getHmacSHA1(data,key);Stringa=Tool.bytesToHexString(ab);a=a.toUpperCase();System.out.println("HMacSha1=================="+a);}}sha1值为:AE4659D724E6CA2EAB552C3AAF662805552C8C6EC++计算key="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";data="123456"sha1="40C84ADE47F4DEFCA8EA74E6CADD7F4BF3D3C3DB"

解决方案

本帖最后由 wangqinglin_12 于 2010-12-09 17:32:30 编辑
解决方案二:
如果实现算法一样的饿,结果也是一样。

时间: 2024-11-08 21:14:47

C++计算HMAC sha1和HMAC MD5 与java 计算HMAC sha1和HMAC MD5不一样?求高手解答,附上源码的相关文章

Java实现常用加密算法——单向加密算法MD5和SHA_java

本文主要介绍了Java实现常用加密算法--单向加密算法MD5和SHA,具体如下: 1.Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.security 包(及其子包),以及sun.securityAPI包(及其子包)中.设计用于帮助开发人员在程序中同时使用低级和高级安全功能. JDK 1.1 中第一次发布的 JDK 安全中引入了"Java 加密体系结构"(JCA),

MD5的Java Bean实现

MD5简介 MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数.请注意我使用了"字节串"而不是"字符串"这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关. MD5将任意长度的"字节串&q

Java与C++实现相同的MD5加密算法简单实例_java

1.Java版 package com.lyz.utils.common; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5加密 * @author liuyazhuang */ public class MD5Hash { public static String md5

java中spring-shiro实现密码的MD5盐值加密

看了网上很多教程,都提到有配置spring shiro的密码加密方式,甚至给出了自定义的Class来实现.却很少有通过配置来解决的. 密码的盐值加密方式应该是非常通用的,也可以算是基础吧.按理说spring shiro不可能没有实现,让用户自己去实现吧. 通过读源码看各种关系,摸索出shiro的MD5盐值加密方式,分享一下 (shiro的maven仓库中的source从来都是个空文件,github上的源码又没有stable版本的代码,要调试很恼火),当然阅读源码可以直接到github上,http

rpc-关于RPC 计算问题,小弟不不明白怎么计算

问题描述 关于RPC 计算问题,小弟不不明白怎么计算 一个客户向服务器发出RPC.客户花5ms时间计算每个请求的参数,服务器花10ms处理每个请求.本地操作系统每次发送和接收的时间是0.5ms,网络传递或者应答消息的时间是3ms.编码.解码每个消息需要0.5ms.计算一个 RPC实现所需要的时间.

word2vec中文相似词计算和聚类的使用说明及c语言源码

word2vec相关基础知识.下载安装参考前文:word2vec词向量中文文本相似度计算目录: word2vec使用说明及源码介绍 1.下载地址 2.中文语料 3.参数介绍 4.计算相似词语 5.三个词预测语义语法关系 6.关键词聚类 1.下载地址 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 运行 make 编译word2vec工具:Makefile的编译代码在makefile.txt文件中,先改名makefile.txt 为Makef

java数组-Java计算排列组合 用java计算0,1,2,3这三个数每一行出现一个数,共有15行这样的数,如何求

问题描述 Java计算排列组合 用java计算0,1,2,3这三个数每一行出现一个数,共有15行这样的数,如何求 用java计算0,1,2,3这三个数每一行出现一个数,共有15行这样的数,如何求 解决方案 我觉得你的问题实在是很模糊,我刚好对java多线程懂一些,所以多问两句: 计算的是什么样的排列组合? 0,1,2,3 的 15行这样的数是哪样的数? 三个数? 每一行出现一个数? 麻烦解释一下~ 另外一个小建议:以后不要这样提问题啦~那些懂的人就算看到也会懒得回答的哦.提问要清晰明确~ 解决方

java算法-通过java计算最大收益值

问题描述 通过java计算最大收益值 x1,x2,x3分别代表三种营销产品,a1,a2,a3营销成功率,b1,b2,b3是三种产品的价值:假设a1=0.6%,b1=0.7%,c1=0.89%:b1=10,b2=20,b3=30 收益=x1*a1*b1+x2*a2*b2+x3*a3*b3 条件1:x1+x2+x3=110000(三种产品的营销数量为11万) 条件2:x1*a1+x2*a2+x3*a3>=500 (三种产品的营销成功数量大于500) 求收益的max值时x1,x2,x3的数值各为多少?

Apache Spark源码走读(十)ShuffleMapTask计算结果的保存与读取 &amp;WEB UI和Metrics初始化及数据更新过程分析

<一>ShuffleMapTask计算结果的保存与读取 概要 ShuffleMapTask的计算结果保存在哪,随后Stage中的task又是如何知道从哪里去读取的呢,这个过程一直让我困惑不已. 用比较通俗一点的说法来解释一下Shuffle数据的写入和读取过程 每一个task负责处理一个特定的data partition task在初始化的时候就已经明确处理结果可能会产生多少个不同的data partition 利用partitioner函数,task将处理结果存入到不同的partition,这