bench_monty.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env python3
  2. import time
  3. from tls.Crypto.PublicKey import RSA
  4. from tls.Crypto.Math import Numbers
  5. from tls.Crypto.Math.Numbers import Integer
  6. from tls.Crypto.Util.number import long_to_bytes
  7. from tls.Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
  8. create_string_buffer,
  9. c_size_t)
  10. ITER = 100
  11. print(Numbers._implementation)
  12. rsa_pem="""-----BEGIN RSA PRIVATE KEY-----
  13. MIIEpAIBAAKCAQEA1maRsgBxvk1m1LcQMrN/oAfPq/V5/LkeUL/CdTs/DOe+dOIW
  14. rvfibUrhgLwg170+qIpsv2+HOA5hPIl5tbBDsgCo/4hWo7EodeNumKdWnzhS0Cjp
  15. Z1UQALAsGen6UugxFbiTCaq7Hhzx4stjadY31Gd1zkUj6jH2StJ5TLw2XdijXgB+
  16. 07V2lYd/vxAtvrizISSROY5JQxTpNyaSbhOD+Ku1iJvqlU64wMocYsjp2D9BiICV
  17. xeZF7W0yUV/gxYwTaMrYRpThjaQ2aMb0PmHXybymM93Np671t5vDltSp9I4qmr4I
  18. NsxFXkNTBTVyKOk9JartRrlS3vrg9XM5vyb1qQIDAQABAoIBACzgr2KJAUYKQZoI
  19. 75UNSYuf1vJxoaUqwpO4b+XGDv6Oi6k/oevh6z1hTS57Moy2CiWRRA4WNEGhkOzx
  20. Ac7sJF9gD//c8/WzoXp7rqy5akJNsdfsmF6OyZi7R5/s//7Wp1+akPyXBi/ZczA7
  21. zoVa17jYJyqUAl6FMr6aq9VKGD8wNTjSp+YhtBMdWegjpGJfOb19UY13hPfDqPGQ
  22. Ydp0l0/0L6HAY97C25fUYeKRp9bnIXCKUineFmwSRjYzcoVOJ/PwiuJ0vBa/0gWw
  23. KKTYE4ZJRDPVFt+7NfSVrLpeTh0YQ8s8MSm2ZCqF/HJEzlhF+sBxx/Yi5O4SrEP6
  24. vuqgzQECgYEA/E9vn6XKnJXX3hiy0XVsUQK+Ana2xn63TxmiMJtrrUjD5WCiy9kD
  25. eTU82igdg9JJGBWOd7mkSAWxVZT9MPaQ4/Vz6ggoZcPHZokmVP7qPePNmFXX6Jdz
  26. hQx8HD0QcwwaYbIJ91WdoAP/cEuu+o+WPKB0CDYWrv3Dx9eTircemlECgYEA2Yk2
  27. WXkOdD2KlnZgHNYp23F2XP6dF4Ny5n478thlJXdexRwRDSKCN/41jfC0FlPpZBcF
  28. 7EFTo+p7lhyJVxPBWSOIhJArMe98bdWoo+6TBuAPLisu7+i+HVRaoyHf0x3t7ViG
  29. JqQOGjHN0G57cgSCrpaFwE2bAZ4dkA27M8Oy99kCgYEAw+HoB0nvwyGSNht2uKcx
  30. MLOwULlZrUEzj3WXNaV0M1QKwkoEGb6hs7hhRf1e7LiVht01fj3iDQheZNMGvryu
  31. QEyPcWJj+p3EcRaJa/N8aBAzzdDXjvwF84V91W6TFr6OvMo8colFlrWD2urnLh/L
  32. w8XOT5Guiqz5Em2LXmZMnAECgYEAuZ1Ksq2Il8arKhd3iyNyM7xssozOnfGbaPDt
  33. VhkutPlV8/ou0nZPhldyetqXzzVqP+0lMKHNLGA3c66Fwbcpk1Wudu5M7R7bnRxh
  34. +P7olUU5rrtKIYsGLSB89hVBVnKDQbH3RaFWJyO36dFbo74Vg8ML/To6uPahYvlU
  35. cqbZXoECgYAOybAyRS9vivcYoKywxtI0aU1HHibPrUl3izYLfDxfWgA0S6IGcBg1
  36. Sx6XG8GYbzkouGb30yjIpn7JB1147DH1oxf8wcHXbAsgNX4IC6rQ1Iwef9P4pORF
  37. icKO95pcPRhmfzuqfhEu/d/ZYjabao95baBHcrRxEbXZtjg88KVXKg==
  38. -----END RSA PRIVATE KEY-----
  39. """
  40. c_defs = """
  41. int monty_pow(const uint8_t *base,
  42. const uint8_t *exp,
  43. const uint8_t *modulus,
  44. uint8_t *out,
  45. size_t len,
  46. uint64_t seed);
  47. """
  48. _raw_montgomery = load_pycryptodome_raw_lib("Crypto.Math._montgomery", c_defs)
  49. key = RSA.import_key(rsa_pem)
  50. message = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  51. SIZE = key.size_in_bytes()
  52. # -----------------------------------------------------------------
  53. start = time.time()
  54. for x in range(ITER):
  55. result_cpython = pow(message, key.d, key.n)
  56. end = time.time()
  57. print("CPython =", end-start)
  58. # -----------------------------------------------------------------
  59. base_b = long_to_bytes(message, SIZE)
  60. exp_b = long_to_bytes(key.d, SIZE)
  61. modulus_b = long_to_bytes(key.n, SIZE)
  62. out = create_string_buffer(SIZE)
  63. start = time.time()
  64. for _ in range(ITER):
  65. _raw_montgomery.monty_pow(
  66. base_b,
  67. exp_b,
  68. modulus_b,
  69. out,
  70. c_size_t(SIZE),
  71. 32
  72. )
  73. end = time.time()
  74. my_time = end-start
  75. print("Custom modexp =", my_time)
  76. # -----------------------------------------------------------------
  77. mg = Integer(message)
  78. md = Integer(key.d)
  79. mn = Integer(key.n)
  80. start = time.time()
  81. for x in range(ITER):
  82. result_gmp = pow(mg, md, mn)
  83. end = time.time()
  84. gmp_time = end - start
  85. print("GMP =", gmp_time)
  86. # -----------------------------------------------------------------
  87. print("%.2f%%" % float((my_time/gmp_time-1)*100), "slower")