RSA 简单实现

本文介绍了一个使用Ruby编写的RSA公钥和私钥生成程序。该程序通过生成两个大素数P和Q来创建模数N,并进一步计算出公钥E和私钥D。程序实现了大整数生成、快速幂取模、费马小定理素性测试等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值