【问题标题】:CRC32 and MD5 algorithms for dummies用于假人的 CRC32 和 MD5 算法
【发布时间】:2009-12-16 12:47:21
【问题描述】:

我想自己实现 CRC32 和 MD5 算法,但我仍在尝试围绕我在该主题上找到的不同来源进行思考。有人能帮我指出一个以简单格式解释算法的资源,或者发布不同步骤的项目符号列表,以便我可以尝试填写它们。TIA。

这是每个维基百科的相应页面。我了解正在做的部分工作,但按位运算是我遇到的困难。那和数学不是我的强项。

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

【问题讨论】:

  • 你用什么语言工作?
  • 我在 Java 中工作,但我想为早期版本的 Unrealscript 执行此操作,它没有这些作为内置函数。
  • @High-Performance Mark:我确实了解基本级别的按位运算。似乎有关该主题的文章对读者以前的知识做出了一些假设(因此有“傻瓜”的标题)。我会看看这个周末我能不能解决 CRC,因为它是最简单的。

标签: algorithm language-agnostic md5


【解决方案1】:

关于MD5的RFC-1321 spec也包含算法的详细解释。关于CRC的Wiki文章已经很清楚了。

毕竟,您的主要问题显然实际上是对二进制系统和按位运算符的无知。以下是一些关于二进制系统和相关运算符的优秀指南:

这必须让你开始。

编辑:如果您想要自己开发 MD5 函数的实际原因是您实际上似乎无法在 Java 中找到现有函数,那么您可能会发现这个 sn-p 很有用:

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

【讨论】:

    【解决方案2】:

    根据DRY你应该这样做

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

    但如果你真的想弄清楚 md5 / sha1 等发生了什么,你可能应该参加安全课程,我试过但失败了:(祝你好运!

    【讨论】:

    • 安全课程有助于加深理解。但除非安全是您的核心业务,否则我建议您不要尝试自己实现算法。
    • 这个 MD5 示例有缺陷。在byte &lt; 0x10 的情况下,它不会以 0 为前缀,并且它还依赖于平台默认字符编码,这本身可能不是正确的编码。
    【解决方案3】:

    对于那些感兴趣的人,第一个链接是 md5 上的 rfc 文档。第二个是下载 Java 实现的链接:

    http://www.ietf.org/rfc/rfc1321.txt

    http://www.freevbcode.com/ShowCode.Asp?ID=741

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 2016-06-28
      • 1970-01-01
      • 2017-10-21
      • 2013-04-13
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多