1
0
Fork 0
mirror of https://github.com/in3rsha/sha256-animation synced 2024-05-03 22:26:13 +02:00
sha256-animation/constants.rb
2021-04-13 13:13:55 +01:00

107 lines
2.9 KiB
Ruby

# coding: utf-8
require_relative "sha256lib.rb"
# ---------
# Constants - K
# ---------
# SHA256 uses the same sequence of sixty-four constant 32-bit words.
#
# These words represent the first thirty-two bits of the fractional parts of the cube roots of the first sixty-four prime numbers. These are "nothing up my sleeve" constants.
# The first sixty-four primes
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311]
# Store results for display later
roots = [];
constants = [];
hexs = [];
# For each prime number
primes.each do |prime|
# Get the cube root of the prime
root = prime ** (1/3.0)
roots << root
# Get fractional part of the number
fractional = root - root.floor
# Convert fractional part to hexadecimal
#
# Example:
#
# 3√2 = 1.259921049895
# 0.259921049895 <- fractional part is what we want
#
# Keep multiplying the fractional part by 16 and taking the integer as the next hex character.
#
# 0.259921049895 * 16 <- multiply by 16
# = 4.15873679832 <- the integer part is used for the hexadecimal result
#
# 0.15873679832 * 16
# = 2.53978877312
#
# 0.53978877312 * 16
# = 8.63662036992
#
# ...
#
# Hex: 428a2f98
#
# In other words, you multiply the fractional part by 2^32, floor it, then convert to hexadecimal.
#
hex = ""
8.times do # 32 bits = 8 hex characters
product = fractional * 16 # multiply fraction by 16
carry = product.floor # the integer part of the product is used for the next hexadecimal character
fractional = product - product.floor # the fractional part of the product is used for next round
hex << carry.to_s(16)
end
# Save results
hexs << hex
constants << hex.to_i(16)
end
# ---------
# Animation
# ---------
system "clear"
puts "-------------"
puts "constants (K)"
puts "-------------"
sleep 0.1
(64+1+3).times do |i| # extra 3 iterations to see through
system "clear"
puts "-------------"
puts "constants (K)"
puts "-------------"
i.times do |j|
# 3 or more behind
if j <= i-4
puts "#{j.to_s.ljust(2, " ")} = #{bits(constants[j])}"
end
# 2 behind
if j == i-3
puts "#{j.to_s.ljust(2, " ")} = 3√#{primes[j].to_s.ljust(3, " ")} = #{bits(constants[j])}"
end
# 1 behind
if j == i-2
puts "#{j.to_s.ljust(2, " ")} = 3√#{primes[j].to_s.ljust(3, " ")} = #{(roots[j] - roots[j].floor).to_s[2..-1]}"
end
# current
if j == i-1
puts "#{j.to_s.ljust(2, " ")} = 3√#{primes[j].to_s.ljust(3, " ")} = #{roots[j]}"
end
# dont try and show trailing 64, 65, 66 (this is just to format last 3)
break if j >= 63
end
sleep 0.1
end
sleep 1