2016-09-22 15 views
2

でequivalantパック機能なし

$message = "hello world"; 
$key = "7E066"; 
echo hash_hmac('SHA256',$message, $key); 

私はあまりにも0315a69471ebe855e9e221a374b30d8de08dcc833857f964737632698c87278eを取得するJava

で0315a69471ebe855e9e221a374b30d8de08dcc833857f964737632698c87278e

String data = "hello world"; 
String key = "7E066"; 
System.out.println(hmacSha(key,data, "HmacSHA256")); 

private static String hmacSha(String KEY, String VALUE, String SHA_TYPE) { 
     try { 

      SecretKeySpec signingKey = new SecretKeySpec(KEY.getBytes("UTF-8"), SHA_TYPE); 
      Mac mac = Mac.getInstance(SHA_TYPE); 
      mac.init(signingKey); 
      byte[] rawHmac = mac.doFinal(VALUE.getBytes("UTF-8")); 

      byte[] hexArray = { 
        (byte)'0', (byte)'1', (byte)'2', (byte)'3', 
        (byte)'4', (byte)'5', (byte)'6', (byte)'7', 
        (byte)'8', (byte)'9', (byte)'a', (byte)'b', 
        (byte)'c', (byte)'d', (byte)'e', (byte)'f' 
      }; 
      byte[] hexChars = new byte[rawHmac.length * 2]; 
      for (int j = 0; j < rawHmac.length; j++) { 
       int v = rawHmac[j] & 0xFF; 
       hexChars[j * 2] = hexArray[v >>> 4]; 
       hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
      } 
      return new String(hexChars); 
     } 
     catch (Exception ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

得ます。パックの機能

$message = "hello world"; 
$key = "7E066"; 
echo hash_hmac('SHA256',$message, pack('H*',$key)); 

とPHPで

私はありません、私はJavaで同じ機能を書き込むことはできませんどのようなパックの機能を理解していません33e97719c1b98f64bd0394e7fe94f43eae927e15f9eda15aeff0830bc3dd2fc3

を取得します。誰でも私を助けてくれますか?

+0

うわー、それは魅力のように動作します。 – Learner

答えて

0

このお試しください:それはあなたが必要なことを正確に返します。このデータの

public String pack(String hex) { 
    String input = hex.length() % 2 == 0 ? hex : hex + "0"; 
    StringBuilder output = new StringBuilder(); 
    for (int i = 0; i < input.length(); i+=2) { 
     String str = input.substring(i, i+2); 
     output.append((char)Integer.parseInt(str, 16)); 
    } 
    return output.toString(); 
} 

を:

String data = "hello world"; 
    String key = "7E066"; 
    System.out.println(hmacSha(key,data, "HmacSHA256")); 
    System.out.println(hmacSha(pack(key), data, "HmacSHA256")); 

0315a69471ebe855e9e221a374b30d8de08dcc833857f964737632698c87278e 
33e97719c1b98f64bd0394e7fe94f43eae927e15f9eda15aeff0830bc3dd2fc3 

トリックは奇数長シフトの入力の16進数の文字列のためのパック()PHP関数ということですつまり、値の右側にゼロを1つ追加します。これは、偶数長の入力16進文字列のバイナリ文字列を計算することしかできないためです。