2016-09-22 2 views
2

En PHP Sans fonction pack

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

je reçois 0315a69471ebe855e9e221a374b30d8de08dcc833857f964737632698c87278e

En Java

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

Je reçois 0315a69471ebe855e9e221a374b30d8de08dcc833857f964737632698c87278e aussi.

En PHP avec la fonction Pack

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

Je reçois 33e97719c1b98f64bd0394e7fe94f43eae927e15f9eda15aeff0830bc3dd2fc3

Je ne comprends pas ce que la fonction Pack ne, je ne peux pas écrire même fonction en Java. Quelqu'un pourrait-il m'aider, s'il vous plaît?

+0

wow merci bro fonctionne comme un charme ... – Learner

Répondre

0

Essayez ceci:

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

pour ces données, il retourne exactement que vous avez besoin:

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

0315a69471ebe855e9e221a374b30d8de08dcc833857f964737632698c87278e 
33e97719c1b98f64bd0394e7fe94f43eae927e15f9eda15aeff0830bc3dd2fc3 

L'astuce est que le pack() fonction PHP pour l'entrée chaîne hexadécimale du décalage de longueur impaire à gauche, c'est-à-dire ajouter un zéro à droite de la valeur. En effet, il est uniquement possible de calculer une chaîne binaire pour une chaîne hexadécimale d'entrée de longueur égale.