2010-12-02 20 views
3

J'essaie de hacher un nombre, représenté par une chaîne hexadécimale avec une bibliothèque de sécurité Java. Ce qui signifie, si j'ai la chaîne "AABBCCDD" je veux hacher non car c'est une entrée ascii, qui est 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, 0x68, 0x68, mais comme quatre octets - 0xAA, 0xBB, 0xCC, 0xDD. J'ai réussi à le faire avec des valeurs faibles telles que "112233445566" (puisque les octets sont signés en Java) mais ont échoué avec des valeurs élevées.SHA1 Hash on Hex Chaîne

Est-ce que quelqu'un sait comment implémenter une telle chose?

Merci, Binyamin

+0

Ce n'est pas une méthode qui prend comme entrée 'octet []'? Je ne suis pas sûr de comprendre le problème. –

+0

Oui c'est. Je suppose que j'ai fait quelques erreurs dans ma mise en œuvre avant. – MByD

Répondre

6

d'abord convertir votre hex en byte[] en utilisant par exemple ceci: Convert a string representation of a hex dump to a byte array using Java?

Après utilisation

byte[] data = hexStringToByteArray(hexData); 
MessageDigest md = MessageDigest.getInstance("SHA-1"); 
md.update(data, 0, data.length); 
byte[] sha1hash = md.digest(); 
+0

J'ai déjà implémenté hexStringToByteArray() avant pour l'implémentation de RC4, mais pour une raison inconnue, j'ai oublié qu'il existe et j'ai essayé de le résoudre d'une manière différente (de manière plus compliquée et inefficace). Merci. – MByD

+0

Pourquoi créez-vous un tableau d'octets, puis l'annulez efficacement? Déclarez simplement sha1Hash sur la dernière ligne lorsque vous appelez 'md.digest()'. –

+0

(Correction de l'utilisation bizarre de 'text.length()'.) –

2

Fondamentalement, vous avez juste besoin de trouver un analyseur hexagonal - il y a beaucoup autour, avec one example here ou Apache Commons Codec pour cela et d'autres conversions. Bien que les octets Java soient effectivement signés, vous obtiendrez le même modèle binaire que s'ils étaient non signés, donc ils auront la même manière. À moins que vous n'effectuiez votre propre calcul arithmétique/bit-shift sur les valeurs d'octets, vous pouvez généralement ignorer le fait que les octets sont signés en Java.

+0

Merci, comme j'ai écrit à gleber (ci-dessus), j'ai déjà implémenté votre première option. – MByD