Рубиновый алгоритм RSA работает - в основном - PullRequest
0 голосов
/ 13 февраля 2012

Я реализую свой собственный алгоритм RSA в ruby, чтобы узнать больше об этом алгоритме.Это почти работает, но когда я расшифровываю, некоторые цифры не дешифруются, но большинство делают.Почему это так?

Для данного открытого текста: [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 Ответ

2 голосов
/ 14 февраля 2012

51 не является простым числом.

Поскольку это одно из предположений алгоритма RSA, неудивительно, что он не работает.

Поскольку ваш p ​​не являетсяпростое число (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.

...