準同型暗号による秘密裡の計算 RSA

library(openssl)
# RSAの乗算の準同型の確認
# RSAの鍵
e <- 17
p <- 61 # 素数
q <- 53 # 素数
n <- p * q
d <- 413

# m1とm2とを暗号化し
# 暗号化されたM1,M2のみを使って
# m1 x m2 の値の暗号化された値を作り
# 返却する
# 返却された人は、こっそりm1 x m2の値を知ることができる

m1 <- 6
m2 <- 3
m3 <- m1 * m2

# 暗号化
M1 <- bignum_mod_exp(bignum(m1),bignum(e),bignum(n))
M2 <- bignum_mod_exp(bignum(m2),bignum(e),bignum(n))

# m1, m2 の値を知っていれば、m3 = m1 x m2 を計算して
# その暗号を作ることはできるが、それはできない仕掛け
# M3 <- bignum_mod_exp(bignum(m3),bignum(e),bignum(n))

M3_angou <- M1 * M2

# 暗号化されたM3 (M3_angou)を秘密鍵で開く
bignum_mod_exp(M3_angou,bignum(d),bignum(n))

m1 * m2
m3