运行该rsaKeygen()
函数时,它生成的键始终是 length 19
,增加p
和q
生成范围的大小会导致程序挂起。代码:
function rsaKeygen()
p = math.random(50000,100000)
while not isprime(p) do
p = math.random(1,1000)
end
q = math.random(1,1000)
while not isprime(q) do
q = math.random(50000,100000)
end
local n = p*q
totientN = carmichael(n)
e = 2^16+1
local d = 1%totientN/e
p,q,totientN = nil,nil,nil
return e,d,n
end
我尝试增加p
和的范围q
,但这会导致程序挂起,并且在我的pkcs1_v1_5_pad(message,key_size)
函数中,19
对于任何合理大小的明文来说,这不是一个足够长的密钥。 PKCS功能:
function pkcs1_v1_5_pad(message,key_size)
print(key_size)
local block_size = key_size/8
local message_length = #message
local padding_length = block_size - message_length - 3
if padding_length < 0 then
error("Message is too long for the given key size")
end
local padding = string.rep("\x00",padding_length)
local padded_message = string.char(0x00)..string.char(0x02)..padding..string.char(0x00)..message
return padded_message
end
Lua 似乎通常使用 64 位数字,对于 RSA 之类的东西来说太小了。请注意,63 位大约意味着19 位数字。这意味着您需要使用BigInt 库或加密库。如果您查看此 RSA 库,您会发现大部分代码都致力于实现 bigint 操作。请注意,此类代码不太可能抵抗侧信道攻击等攻击。
当超过 63 位时,您会遇到奇怪的情况,因为基本上所有操作都是模 2^64 并解释为带符号的 2 补数。这可能是长时间等待的原因。
另一个可能的原因当然是
isprime
功能没有得到有效的实现。对于足够大的密钥大小,这在本机系统上甚至可能很慢。我还会尝试从特定的随机值开始计数,否则您的 RNG 将不断被要求提供新的随机值进行测试。与检查可能偶数是否为素数相比,随机数生成相对较慢。
这并不是 Lua 真正设计的目的。在 OpenSSL 中调用函数来进行 RSA 操作更有意义。