MD5.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # -*- coding: utf-8 -*-
  2. #
  3. # ===================================================================
  4. # The contents of this file are dedicated to the public domain. To
  5. # the extent that dedication to the public domain is not available,
  6. # everyone is granted a worldwide, perpetual, royalty-free,
  7. # non-exclusive license to exercise all rights associated with the
  8. # contents of this file for any purpose whatsoever.
  9. # No rights are reserved.
  10. #
  11. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  12. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  13. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  14. # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  15. # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  16. # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  17. # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  18. # SOFTWARE.
  19. # ===================================================================
  20. """MD5 cryptographic hash algorithm.
  21. MD5 is specified in RFC1321_ and produces the 128 bit digest of a message.
  22. >>> from Crypto.Hash import MD5
  23. >>>
  24. >>> h = MD5.new()
  25. >>> h.update(b'Hello')
  26. >>> print h.hexdigest()
  27. MD5 stand for Message Digest version 5, and it was invented by Rivest in 1991.
  28. This algorithm is insecure. Do not use it for new designs.
  29. .. _RFC1321: http://tools.ietf.org/html/rfc1321
  30. """
  31. _revision__ = "$Id$"
  32. __all__ = ['new', 'digest_size', 'MD5Hash' ]
  33. from Crypto.Util.py3compat import *
  34. from Crypto.Hash.hashalgo import HashAlgo
  35. try:
  36. # The md5 module is deprecated in Python 2.6, so use hashlib when possible.
  37. import hashlib
  38. hashFactory = hashlib.md5
  39. except ImportError:
  40. import md5
  41. hashFactory = md5
  42. class MD5Hash(HashAlgo):
  43. """Class that implements an MD5 hash
  44. :undocumented: block_size
  45. """
  46. #: ASN.1 Object identifier (OID)::
  47. #:
  48. #: id-md5 OBJECT IDENTIFIER ::= {
  49. #: iso(1) member-body(2) us(840) rsadsi(113549)
  50. #: digestAlgorithm(2) 5
  51. #: }
  52. #:
  53. #: This value uniquely identifies the MD5 algorithm.
  54. oid = b('\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05')
  55. digest_size = 16
  56. block_size = 64
  57. def __init__(self, data=None):
  58. HashAlgo.__init__(self, hashFactory, data)
  59. def new(self, data=None):
  60. return MD5Hash(data)
  61. def new(data=None):
  62. """Return a fresh instance of the hash object.
  63. :Parameters:
  64. data : byte string
  65. The very first chunk of the message to hash.
  66. It is equivalent to an early call to `MD5Hash.update()`.
  67. Optional.
  68. :Return: A `MD5Hash` object
  69. """
  70. return MD5Hash().new(data)
  71. #: The size of the resulting hash in bytes.
  72. digest_size = MD5Hash.digest_size
  73. #: The internal block size of the hash algorithm in bytes.
  74. block_size = MD5Hash.block_size