HmacSHA256 de Hachage en JAVA

J'ai été donné un ensemble d'étapes pour obtenir un hachage de données. J'ai essayer de comprendre les étapes depuis assez longtemps maintenant, mais la valeur de hachage qui je suis ne semble pas correspondre à attendre de hachage.

Les étapes qui a été mentionné est comme suit:

  1. Utiliser la FIN du message d'entrée comme valeur binaire (unsigned char en langage C, les octets en Java). La FIN du message d'entrée doivent être codés dans le jeu de caractères ASCII.
  2. Combiner la gauche de la LAU, la clé et le droit de LAU-clés sous forme de chaîne. La fusion de LAU clé doit être utilisée comme une valeur binaire (unsigned char en langage C, les octets en Java). La fusion de LAU-clés doivent être codés dans le jeu de caractères ASCII.
  3. Appeler un HMAC256 routine pour calculer la valeur de hachage. La valeur de hachage doit aussi être traitée comme une valeur binaire (unsigned char en langage C, les octets en Java). Le hmac taille est de 32 octets.
  4. Convertir le hmac valeurs binaires en majuscules hexadécimal caractères imprimables (par exemple, un onebyte valeur binaire 0000 1010 a une valeur hexadécimale de 0x0A et sera traduit à l'twobyte caractères “0A”).

C'est ce que j'ai essayé.

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
public class ABCHash{
public static void main(String[] args) throws Exception        
{
try{
int character;
StringBuffer buffer = new StringBuffer("");
FileInputStream inputStream = new FileInputStream(new File("C:/EncPDF.txt"));
while( (character = inputStream.read()) != -1)
buffer.append((char) character);
inputStream.close();
System.out.println("Fetching data from the file"+buffer);
StringBuffer sbuf = new StringBuffer(buffer);
String str=sbuf.toString();
System.out.println( "Data = "+ str);
if(str!=null)
{
String key = "0123456789ABCDEF0123456789ABCDEF"; //Assuming the key as 0123456789ABCDEF
byte[] hexvalue= stringToHexByte(str);
byte[] hexkey=stringToHexByte(key);
byte[] byHMAC = encode(hexkey, hexvalue);
String stEncryptedData = Hex.encodeHexString(byHMAC).toUpperCase();
System.out.println("Encrypted data =\n "+stEncryptedData);
}
}
catch(Exception e)
{
System.out.println("Exception in the file reading"+e);
}
}
private static byte[] encode(byte[] hexkey, byte[] hexvalue) {
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(hexkey, "HmacSHA256");
sha256_HMAC.init(secret_key);
return sha256_HMAC.doFinal(hexvalue);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return null;
}
public static String stringToHex(String base) throws UnsupportedEncodingException
{
return String.format("%040x", new BigInteger(1, base.getBytes(StandardCharsets.US_ASCII)));
}
public static byte[] stringToHexByte(String base) throws UnsupportedEncodingException
{
System.out.println(stringToHex(base).toUpperCase());
return DatatypeConverter.parseHexBinary(stringToHex(base).toUpperCase());
}
}

Il sera vraiment utile si quelqu'un peut point quoi de mal avec la mise en œuvre.

  • Selon votre description de l' message input must be coded in the ASCII mais vous encodez dans hex: hexvalue= stringToHexByte(str);.
  • Sandesh, avez-vous résoudre le problème qui vous a demandé? Je suis face à face avec ce problème maintenant.
  • Oui. J'ai terminé, mais je ne me souviens pas de la solution. Je n'ai pas accès au code. désolé camarade!
  • ok merci