multiplication_encryption.sf 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/ruby
  2. # A very simple message encryption method based on multiplication of large numbers, for messages of arbitrary length, given a secret key.
  3. # The encryption method is secure(-ish) as long as the secret key is not reused,
  4. # and the prime factorization of large integers remains hard on classical computers.
  5. func sha512_prefix(data) {
  6. var t = data.sha512
  7. while (t.begins_with('0')) {
  8. t = t.sha512
  9. }
  10. return t
  11. }
  12. func create_key(secret_key) {
  13. sha512_prefix(secret_key) + secret_key.sha256 -> hex.next_prime
  14. }
  15. func encode_msg(msg) {
  16. sha512_prefix(msg) + msg.deflate.ascii2hex + msg.sha256 -> hex
  17. }
  18. func decode_msg(q) {
  19. q.as_hex.hex2ascii.ascii2bin.substr(512, -256).bin2ascii.inflate
  20. }
  21. func encrypt_msg(msg, secret_key) {
  22. var p = create_key(secret_key)
  23. var q = encode_msg(msg)
  24. p*q
  25. }
  26. func decrypt_msg(enc, secret_key) {
  27. var p = create_key(secret_key)
  28. var q = idiv(enc,p)
  29. decode_msg(q)
  30. }
  31. var secret_key = "a very secret key"
  32. var msg = "Hello, world!"
  33. #var msg = File(__FILE__).read(:raw)
  34. var enc = encrypt_msg(msg, secret_key)
  35. var dec = decrypt_msg(enc, secret_key)
  36. say enc
  37. say dec
  38. assert_eq(msg, dec)
  39. __END__
  40. 2313765241604776730077187616606220478778378021428094989014061346164718072327441037803783726456555953740488543698806966901832086461575914083085289674698300664807080338570395068231775186371894735575206059185704435982655146890302969562971284105104409127738236093004139833572225600394494208944939806197536115369755018907653051538280008818698500913422153562078257468391736978030143442662583677560114553981509305080631703881162093910282823689333603461691803069109034824442161920955634589779269967832750935
  41. Hello, world!