Skip to content

Instantly share code, notes, and snippets.

@metalefty
Created May 28, 2021 08:28
Show Gist options
  • Save metalefty/3f64d78e03b21ddeec7e90fc55b3af0c to your computer and use it in GitHub Desktop.
Save metalefty/3f64d78e03b21ddeec7e90fc55b3af0c to your computer and use it in GitHub Desktop.
DH鍵共有
#!/usr/bin/env ruby
require 'prime'
require 'securerandom'
require 'socket'
require 'json'
require 'io/console/size'
raise ArgumentError if ARGV.count < 2
host = ARGV.shift
port = ARGV.shift.to_i
def prime_number
p = 0
SecureRandom.random_number(2**32).step(0, -1) do |n|
if n.prime?
p = n
break
end
end
return p
end
def dump_remote_data(data)
tag = "TO CLIENT"
columns = IO.console_size[1]
data_length = data.to_s.inspect.length
left_padding = " " * (columns / 2 - data_length / 2 )
right_padding = " <-" + tag + "-" * (columns / 2 - data_length / 2 - tag.length - 4)
puts "#{left_padding}#{data.inspect}#{right_padding}"
end
def dump_local_data(data)
tag = "TO SERVER"
columns = IO.console_size[1]
data_length = data.to_s.inspect.length
left_padding = "-" * (columns / 2 - data_length / 2 - tag.length - 3) + tag + "-> "
right_padding = " " * (columns / 2 - data_length / 2 - 1)
puts "#{left_padding}#{data.inspect}#{right_padding}"
end
def debug_print(data)
data_length = data.to_s.length
columns = IO.console_size[1]
left_padding = " " * (columns / 2 - data_length / 2 - 2 ) + "> "
right_padding = " <" + " " * (columns / 2 - data_length / 2 - 3)
puts "#{left_padding}#{data.to_s}#{right_padding}"
end
socket = TCPSocket.new(host, port)
p = 0
privkey = 0
#p = prime_number
#data = {p: p}.to_json + "\r\n"
#socket.write(data)
#dump_local_data(data)
loop do
data = socket.gets
dump_remote_data(data)
json = JSON.parse(data, symbolize_names: true)
case true
when json.has_key?(:p)
p = json[:p]
privkey = SecureRandom.random_number(p - 2)
debug_print "privkey=#{privkey}"
g = 2.pow(privkey, p)
debug_print "g=#{g}"
data = {g: g}.to_json + "\r\n"
socket.write(data)
dump_local_data(data)
when json.has_key?(:g)
r = json[:g]
privkey = SecureRandom.random_number(p - 2) if privkey == 0
debug_print "privkey=#{privkey}"
k = r.pow(privkey, p)
debug_print "k=#{k}"
socket.close
exit
else
print "key not found"
end
end
#!/usr/bin/env ruby
require 'prime'
require 'securerandom'
require 'socket'
require 'json'
require 'io/console/size'
tcpserver = TCPServer.open(5001)
def prime_number
return 41980824156648151
p = 0
SecureRandom.random_number(2**56).step(0, -1) do |n|
if n.prime?
p = n
break
end
end
return p
end
def dump_remote_data(data)
tag = "TO SERVER"
columns = IO.console_size[1]
data_length = data.to_s.inspect.length
left_padding = " " * (columns / 2 - data_length / 2 )
right_padding = " <-" + tag + "-" * (columns / 2 - data_length / 2 - tag.length - 4)
puts "#{left_padding}#{data.inspect}#{right_padding}"
end
def dump_local_data(data, peer)
tag = "TO CLIENT #{peer}"
columns = IO.console_size[1]
data_length = data.to_s.inspect.length
left_padding = "-" * (columns / 2 - data_length / 2 - tag.length - 3) + tag + "-> "
right_padding = " " * (columns / 2 - data_length / 2 - 1)
puts "#{left_padding}#{data.inspect}#{right_padding}"
end
def debug_print(data)
data_length = data.to_s.length
columns = IO.console_size[1]
left_padding = " " * (columns / 2 - data_length / 2 - 2 ) + "> "
right_padding = " <" + " " * (columns / 2 - data_length / 2 - 3)
puts "#{left_padding}#{data.to_s}#{right_padding}"
end
loop do
Thread.new(tcpserver.accept) do |s|
sock_domain, remote_port, remote_hostname, remote_ip = s.peeraddr
client_info = "|#{remote_ip}:#{remote_port}|"
puts "Connection received: #{client_info}"
p = 0
privkey = 0
p = prime_number
privkey = SecureRandom.random_number(p - 2)
data = { p: p}.to_json + "\r\n"
s.write(data)
dump_local_data(data, client_info)
while s.gets
data = $_
dump_remote_data(data)
json = JSON.parse(data, symbolize_names: true)
case true
when json.has_key?(:g)
r = json[:g]
g = 2.pow(privkey, p)
debug_print "g=#{g}"
data = {g: g}.to_json + "\r\n"
s.write(data)
dump_local_data(data, client_info)
k = r.pow(privkey, p)
debug_print "k=#{k}"
when json.has_key?(:p)
=begin
p = json[:p]
privkey = SecureRandom.random_number(p - 2) if privkey == 0
debug_print "privkey=#{privkey}"
g = 2.pow(privkey, p)
debug_print "g=#{g}"
data = {g: g}.to_json + "\r\n"
s.write(data)
dump_local_data(data, client_info)
=end
else
puts "key not found"
end
end
s.close
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment