ruby RSA算法很有用

时间:2012-02-13 03:22:05

标签: ruby cryptography public-key-encryption

我正在ruby中实现我自己的RSA算法,以了解有关该算法的更多信息。 它几乎正常工作,但是当我解密它时,一些数字不会解密但大多数都会解密。 为什么会这样?

对于给定的明文: [42,24,424,224,421,321]

密文是: [1239,1263,1495,1349,208,1878]

解密时: [42,690,424,779,421,321]

这就是问题所在。为什么会这样?

这些值用于生成键(方法调用位于程序的末尾)

p = 51
q = 37
e = 223
n = 1887
phiN = 1800 (coprime with d)
d = 1687




class RSA
#edited to be concise, such as omitting initialize()

def encrypt(plainText)
index = 0
puts 'encrypt in is ', plainText
    plainText.each do |i|
    plainText[index] = ((i**(@e)) % @n )
    index+=1
    end
 puts  'ciphertext is '
puts plainText
return plainText
end


def decrypt(cipherText)
puts 'decrypt in is ', cipherText
index = 0
    cipherText.each do |i|
    cipherText[index] = ((i**(@d)) % @n )
    index+=1
    end
puts 'plaintext is '
puts cipherText
return cipherText
end


def calcD()
@d=1
begin 
s = (@d*@e)% @phiN;
@d+=1
end while not s==1
@d -= 1
#puts 'd is ', @d
end


end # class

message = RSA.new(51,37,223,[ 42, 24, 424, 224, 421, 321])

1 个答案:

答案 0 :(得分:2)

51不是素数。

由于这是RSA算法的假设之一,因此它无法工作也就不足为奇了。

因为你的p不是素数phi(n)!=(p-1)(q-1)。

你可以通过注意到phi(51 * 37)= phi(3 * 17 * 37)=(3-1)(17-1)(37-1)= 1152然后计算工作d来使其工作= e ^ -1(mod phi(n))= 223 ^ -1(mod 1152)= 31,但我建议只使用素数p。