求Win32 的SHA1的加密算法,得到的结果和下面这段java代码的结果一致。:import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;
public class HMAC_SHA1 {
public static void main(String[] args) {
System.out.println(base64sha1("message", "234123"));
}
public static String base64sha1(String str, String key) {
try {
String Algorithm = "HmacSHA1";
SecretKey sk = new SecretKeySpec(key.getBytes(), Algorithm);
Mac mac = Mac.getInstance(Algorithm);
mac.init(sk);
byte[] result = mac.doFinal(str.getBytes());
for (byte b : result) {
System.out.print(b);
System.out.print(" ");
}
return new String(Base64.encodeBase64(result));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return key;
}}我参考了很多代码,都不行
比如这个。
import java.security.NoSuchAlgorithmException;import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;
public class HMAC_SHA1 {
public static void main(String[] args) {
System.out.println(base64sha1("message", "234123"));
}
public static String base64sha1(String str, String key) {
try {
String Algorithm = "HmacSHA1";
SecretKey sk = new SecretKeySpec(key.getBytes(), Algorithm);
Mac mac = Mac.getInstance(Algorithm);
mac.init(sk);
byte[] result = mac.doFinal(str.getBytes());
for (byte b : result) {
System.out.print(b);
System.out.print(" ");
}
return new String(Base64.encodeBase64(result));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return key;
}}我参考了很多代码,都不行
比如这个。
解决方案 »
- 怎样可以在CListCtrl只有16宽度的列中,正确显示了两位数字如"99"
- dll问题 在线等!谢谢
- 简单的类间调用,为什么会提示我 无法解析外部符号
- 哪里可以找到 MICROSOFT WIN32程序员参考大全
- vc中钩子到底是什么意思?怎么解释?请高手对菜鸟的这疑惑进行一下解答!
- 关于10进制到16进制转换的问题?
- 请问大家,如何获得和改变当前桌面窗口的显示模式?
- 用ie访问http://www.hao123.com/会自动变成http://www.hao123.com/?1394084308
- 调试COM
- 高分求解。难度不高,提供信息也行啊…………
- 程序运行结果让人不能理解
- 有没有API读取win7电脑的评分分数?
34 36 -18 117 1 -101 30 105 -83 113 -85 116 41 -30 -110 -13 53 0 58 69 IiTudQGbHmmtcat0KeKS8zUAOkU=
#ifndef _SHA1_H_
#define _SHA1_H_
typedef struct SHA1Context{
unsigned Message_Digest[5];
unsigned Length_Low;
unsigned Length_High;
unsigned char Message_Block[64];
int Message_Block_Index;
int Computed;
int Corrupted;
} SHA1Context;void SHA1Reset(SHA1Context *);
int SHA1Result(SHA1Context *);
void SHA1Input( SHA1Context *,const char *,unsigned);
#endif
#define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF) | ((word) >> (32-(bits))))void SHA1ProcessMessageBlock(SHA1Context *);
void SHA1PadMessage(SHA1Context *);void SHA1Reset(SHA1Context *context){// 初始化动作
context->Length_Low = 0;
context->Length_High = 0;
context->Message_Block_Index = 0; context->Message_Digest[0] = 0x67452301;
context->Message_Digest[1] = 0xEFCDAB89;
context->Message_Digest[2] = 0x98BADCFE;
context->Message_Digest[3] = 0x10325476;
context->Message_Digest[4] = 0xC3D2E1F0; context->Computed = 0;
context->Corrupted = 0;
}
int SHA1Result(SHA1Context *context){// 成功返回1,失败返回0
if (context->Corrupted) {
return 0;
}
if (!context->Computed) {
SHA1PadMessage(context);
context->Computed = 1;
}
return 1;
}
void SHA1Input(SHA1Context *context,const char *message_array,unsigned length){
if (!length) return; if (context->Computed || context->Corrupted){
context->Corrupted = 1;
return;
} while(length-- && !context->Corrupted){
context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF); context->Length_Low += 8; context->Length_Low &= 0xFFFFFFFF;
if (context->Length_Low == 0){
context->Length_High++;
context->Length_High &= 0xFFFFFFFF;
if (context->Length_High == 0) context->Corrupted = 1;
} if (context->Message_Block_Index == 64){
SHA1ProcessMessageBlock(context);
}
message_array++;
}
}void SHA1ProcessMessageBlock(SHA1Context *context){
const unsigned K[] = {0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 };
int t;
unsigned temp;
unsigned W[80];
unsigned A, B, C, D, E; for(t = 0; t < 16; t++) {
W[t] = ((unsigned) context->Message_Block[t * 4]) << 24;
W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16;
W[t] |= ((unsigned) context->Message_Block[t * 4 + 2]) << 8;
W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]);
}
for(t = 16; t < 80; t++) W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); A = context->Message_Digest[0];
B = context->Message_Digest[1];
C = context->Message_Digest[2];
D = context->Message_Digest[3];
E = context->Message_Digest[4]; for(t = 0; t < 20; t++) {
temp = SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = SHA1CircularShift(30,B);
B = A;
A = temp;
}
for(t = 20; t < 40; t++) {
temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = SHA1CircularShift(30,B);
B = A;
A = temp;
}
for(t = 40; t < 60; t++) {
temp = SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = SHA1CircularShift(30,B);
B = A;
A = temp;
}
for(t = 60; t < 80; t++) {
temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
temp &= 0xFFFFFFFF;
E = D;
D = C;
C = SHA1CircularShift(30,B);
B = A;
A = temp;
}
context->Message_Digest[0] = (context->Message_Digest[0] + A) & 0xFFFFFFFF;
context->Message_Digest[1] = (context->Message_Digest[1] + B) & 0xFFFFFFFF;
context->Message_Digest[2] = (context->Message_Digest[2] + C) & 0xFFFFFFFF;
context->Message_Digest[3] = (context->Message_Digest[3] + D) & 0xFFFFFFFF;
context->Message_Digest[4] = (context->Message_Digest[4] + E) & 0xFFFFFFFF;
context->Message_Block_Index = 0;
}void SHA1PadMessage(SHA1Context *context){
if (context->Message_Block_Index > 55) {
context->Message_Block[context->Message_Block_Index++] = 0x80;
while(context->Message_Block_Index < 64) context->Message_Block[context->Message_Block_Index++] = 0;
SHA1ProcessMessageBlock(context);
while(context->Message_Block_Index < 56) context->Message_Block[context->Message_Block_Index++] = 0;
} else {
context->Message_Block[context->Message_Block_Index++] = 0x80;
while(context->Message_Block_Index < 56) context->Message_Block[context->Message_Block_Index++] = 0;
}
context->Message_Block[56] = (context->Length_High >> 24 ) & 0xFF;
context->Message_Block[57] = (context->Length_High >> 16 ) & 0xFF;
context->Message_Block[58] = (context->Length_High >> 8 ) & 0xFF;
context->Message_Block[59] = (context->Length_High) & 0xFF;
context->Message_Block[60] = (context->Length_Low >> 24 ) & 0xFF;
context->Message_Block[61] = (context->Length_Low >> 16 ) & 0xFF;
context->Message_Block[62] = (context->Length_Low >> 8 ) & 0xFF;
context->Message_Block[63] = (context->Length_Low) & 0xFF; SHA1ProcessMessageBlock(context);
}int sha1_hash(const char *source, char *lrvar){// Main
SHA1Context sha;
char buf[128]; SHA1Reset(&sha);
SHA1Input(&sha, source, strlen(source)); if (!SHA1Result(&sha)){
lr_error_message("SHA1 ERROR: Could not compute message digest");
return -1;
} else {
memset(buf,0,sizeof(buf));
sprintf(buf, "%08X%08X%08X%08X%08X", sha.Message_Digest[0],sha.Message_Digest[1],
sha.Message_Digest[2],sha.Message_Digest[3],sha.Message_Digest[4]);
lr_save_string(buf, lrvar);
return strlen(buf);
}
}
本来几个Win32 API就能搞定的,我就是不知道哪几个参数设置的不对
但是下载到的那个代码,只是Degist运算。所以还是不行啊,各位老大再帮忙啊~~~~
这不是信息和密钥吗?
我需要用到SHA1,Blowfish和DSA三个算法,现在还有DSA算法没有找到源代码.哪位有啊?
//sha1_hash ( xor_whole ( dup ( int ( 64 ) , 5c ) , pack00_len ( ansi_string ( "234123" ) , int ( 64 ) ) ) sha1_hash ( xor_whole ( dup ( int ( 64 ) , 36 ) , pack00_len ( ansi_string ( "234123" ) , int ( 64 ) ) ) ansi_string ( "message" ) ) )
//--------int
//-------- input = 64 hex = 00 00 00 40
//
//----------ansi_string convert utf16-little-endian format input data to ansi format
//---------- input = 32 00 33 00 34 00 31 00 32 00 33 00
//---------- output = 32 33 34 31 32 33
//
//----------int
//---------- input = 64 hex = 00 00 00 40
//
//----------------int
//---------------- input = 64 hex = 00 00 00 40
//
//------------------ansi_string convert utf16-little-endian format input data to ansi format
//------------------ input = 32 00 33 00 34 00 31 00 32 00 33 00
//------------------ output = 32 33 34 31 32 33
//
//------------------int
//------------------ input = 64 hex = 00 00 00 40
//
//------------------ansi_string convert utf16-little-endian format input data to ansi format
//------------------ input = 6D 00 65 00 73 00 73 00 61 00 67 00 65 00
//------------------ output = 6D 65 73 73 61 67 65
//
//------dup repeat the specified number of times the input data
//------ result = 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C
//
//------pack00_len implementation of alignment when input data length is not multiple times of the length
//------ input = 32 33 34 31 32 33
//------ output = 32 33 34 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
//
//----------dup repeat the specified number of times the input data
//---------- result = 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 [color=#F0F0F0]
//[/color]
//----------pack00_len implementation of alignment when input data length is not multiple times of the length
//---------- input = 32 33 34 31 32 33
//---------- output = 32 33 34 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
//
//----xor_whole XOR data 1 to data 2, the returned data length is the length of the data 2
//---- data 1 = 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C
//---- data 2 = 32 33 34 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
//---- result = 6E 6F 68 6D 6E 6F 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C
//
//------xor_whole XOR data 1 to data 2, the returned data length is the length of the data 2
//------ data 1 = 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
//------ data 2 = 32 33 34 31 32 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
//------ result = 04 05 02 07 04 05 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
//
//----sha1_hash
//---- input =
//--------04 05 02 07 04 05 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
//--------36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
//--------6D 65 73 73 61 67 65
//---- output = CB 03 87 7F ED 03 DE 7B B7 1A B9 F3 B8 CF 22 1B 53 79 7D FD
//
//--sha1_hash
//-- input =
//------6E 6F 68 6D 6E 6F 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C
//------5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C 5C
//------CB 03 87 7F ED 03 DE 7B B7 1A B9 F3 B8 CF 22 1B 53 79 7D FD
//-- output = 22 24 EE 75 01 9B 1E 69 AD 71 AB 74 29 E2 92 F3 35 00 3A 45
//