rsa_code.sf 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/RSA_code
  4. #
  5. const n = 9516311845790656153499716760847001433441357
  6. const e = 65537
  7. const d = 5617843187844953170308463622230283376298685
  8. module Message {
  9. var alphabet = [('A' .. 'Z')..., ' ']
  10. var rad = alphabet.len
  11. var code = Hash(^rad -> map {|i| (alphabet[i], i) }...)
  12. func encode(String t) {
  13. [code{t.reverse.chars...}] ~Z* {|i| rad**i }.map(^t.len) -> sum
  14. }
  15. func decode(Number n) {
  16. ''.join(alphabet[
  17. gather {
  18. loop {
  19. var (d, m) = n.divmod(rad)
  20. take(m)
  21. break if (n < rad)
  22. n = d
  23. }
  24. }...]
  25. ).reverse
  26. }
  27. }
  28. var secret_message = "ROSETTA CODE"
  29. say "Secret message is #{secret_message}"
  30. var numeric_message = Message::encode(secret_message)
  31. say "Secret message in integer form is #{numeric_message}"
  32. var numeric_cipher = expmod(numeric_message, e, n)
  33. say "After exponentiation with public exponent we get: #{numeric_cipher}"
  34. var text_cipher = Message::decode(numeric_cipher)
  35. say "This turns into the string #{text_cipher}"
  36. var numeric_cipher2 = Message::encode(text_cipher)
  37. say "If we re-encode it in integer form we get #{numeric_cipher2}"
  38. var numeric_message2 = expmod(numeric_cipher2, d, n)
  39. say "After exponentiation with SECRET exponent we get: #{numeric_message2}"
  40. var secret_message2 = Message::decode(numeric_message2)
  41. say "This turns into the string #{secret_message2}"