2009-12-16 7 views
2

Je voudrais implémenter les algorithmes CRC32 et MD5 par moi-même mais j'essaie toujours de comprendre les différentes sources que j'ai trouvées sur le sujet. Quelqu'un pourrait-il me diriger vers une ressource qui explique les algorithmes dans un format simple ou poster une liste des différentes étapes afin que je puisse essayer de les remplir. TIA.Algorithmes CRC32 et MD5 pour les nuls

Voici les pages wikipedia respectives sur chacun. Je comprends une partie de ce qui est fait, mais les opérations sur les bits sont quelque chose que j'ai de la difficulté. Ça et les mathématiques ne sont pas mon fort.

http://en.wikipedia.org/wiki/Cyclic_redundancy_check
http://en.wikipedia.org/wiki/MD5

+0

Quelle langue travaillez-vous? – Skilldrick

+0

Je travaille en Java mais je veux le faire pour une version antérieure de Unrealscript qui ne possède pas ces fonctions intégrées. –

+0

@ High-Performance Mark: Je comprends réellement les opérations au niveau du bit de base. Il semble juste que les articles sur le sujet fassent des suppositions sur les connaissances antérieures d'un lecteur (d'où le titre «for dummies»). Je vais voir si je peux aborder le CRC ce week-end car c'est le plus simple. –

Répondre

1

Selon DRY vous devriez faire

final public class Security { 

    synchronized public static String MD5(String msg) { 
     try { 
      MessageDigest md = MessageDigest.getInstance("MD5"); 
      md.update(msg.getBytes()); 
      byte[] digest = md.digest(); 
      return new BigInteger(1, digest).toString(16); 
     } catch (NoSuchAlgorithmException ex) { 
      return "" + msg.hashCode(); 
     } 
    } 
} 

mais si vous figure voulez vraiment ce qui se passe avec md5/sha1 etc, vous devriez probablement prendre un cours de sécurité, que j'ai essayé, mais a échoué :(bonne chance à vous!

+0

Les cours de sécurité sont bons pour améliorer votre compréhension. Mais à moins que la sécurité ne soit votre cœur de métier, je vous suggère de ne pas essayer de mettre en place un algorithme vous-même. – Onots

+0

Cet exemple MD5 est défectueux. Il ne préfixe pas 0 dans le cas de 'byte <0x10' et il repose également sur le codage de caractères par défaut de la plate-forme qui peut ne pas être le codage correct. – BalusC

2

Le RFC-1321 spec sur MD5 contient également une explication détaillée de l'algo. L'article d'Iki sur CRC est assez clair.

Après tout, votre problème majeur est apparemment l'ignorance sur le système binaire et les opérateurs bit à bit. Voici plusieurs excellents guides sur le système binaire et les opérateurs impliqués:

Cela doit vous aider à démarrer.

Modifier: si la raison réelle que vous vouliez homegrow une fonction MD5 est que vous semblez pouvez réellement ne pas trouver une fonction existante en Java, vous trouverez peut-être cet extrait utile:

/** 
* Generate MD5 hash for the given String. 
* @param string The String to generate the MD5 hash for. 
* @return The 32-char hexadecimal MD5 hash of the given String. 
*/ 
public static String hashMD5(String string) { 
    byte[] hash; 

    try { 
     hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8")); 
    } catch (NoSuchAlgorithmException e) { 
     // Unexpected exception. "MD5" is just hardcoded and supported. 
     throw new RuntimeException("MD5 should be supported?", e); 
    } catch (UnsupportedEncodingException e) { 
     // Unexpected exception. "UTF-8" is just hardcoded and supported. 
     throw new RuntimeException("UTF-8 should be supported?", e); 
    } 

    StringBuilder hex = new StringBuilder(hash.length * 2); 
    for (byte b : hash) { 
     if ((b & 0xff) < 0x10) hex.append("0"); 
     hex.append(Integer.toHexString(b & 0xff)); 
    } 
    return hex.toString(); 
}