RSA 簡單實現


rsa.rb 生成公鑰密鑰


puts "公鑰密鑰生成程序開始"
$bitlen = 1024 # 素數二進制長度
$t = 500 # 費馬小素性測試次數
# 生成隨機大整數且爲奇數
def bignum()
	len = $bitlen
	len -= 2
	ret = 1
	len.times do
		ret <<= 1
		ret += rand(2)
	end
	ret <<= 1
	ret += 1
	return ret
end
# 快速冪取模
def pow_mod(a,i,mod)
	ret = 1
	while i > 0
		ret = ret*a%mod if((i&1)==1)
		a = a*a%mod
		i >>= 1
	end
	return ret
end
# 費馬小定理素性測試
def is_prime (x)
	$t.times do
		w = rand(x)
		w = 1 if(w==0)
		return 0 if(pow_mod(w,x-1,x)!=1)
	end
	return 1
end
# 找出大素數
def bigprime()
	x = bignum()
	x -= 2 until(is_prime(x)==1)
	return x
end
# 求最大公因數
def gcd(a,b)
	return a if(b == 0)
	return gcd(b,a%b)
end
# 拓展歐幾里得
def extgcd(a,b)
	if b == 0
		[a, 1, 0]
	else 
		g, x, y = extgcd(b, a % b)
		[g, y, x - a / b * y]
	end
end
# 逆元
def modinv(a,m)
	g, x, y = extgcd(a, m)
	x %= m
	while x < 0
		x += m		
	end
	return x 
end
# 求一個互質的數
def coprime(x)
	y = 10000
	y+=1 until(gcd(x,y)==1)
	return y
end


t1 = Time.now 

P = bigprime()
puts "P :"
puts P
puts "****************"

Q = bigprime()
puts "Q :"
puts Q
puts "****************"

N = P*Q
puts "N :"
puts N
puts "****************"

K = (P-1)*(Q-1)
puts "K :"
puts K
puts "****************"

E = coprime(K)
puts "E :"
puts E
puts "****************"

D = modinv(E,K)
puts "D :"
puts D
puts "****************"

t2 = Time.now
puts "總計用時#{t2 - t1}s"

詳細見github



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章