33 lines
1.3 KiB
Scala
33 lines
1.3 KiB
Scala
object RSA_saket{
|
|
val d = BigInt("5617843187844953170308463622230283376298685")
|
|
val n = BigInt("9516311845790656153499716760847001433441357")
|
|
val e = 65537
|
|
val text = "Rosetta Code"
|
|
val encode = (msg:BigInt) => pow_mod(msg,e,n)
|
|
val decode = (msg:BigInt) => pow_mod(msg,d,n)
|
|
val getmsg = (txt:String) => BigInt(txt.map(x => "%03d".format(x.toInt)).reduceLeft(_+_))
|
|
def pow_mod(p:BigInt, q:BigInt, n:BigInt):BigInt = {
|
|
if(q==0) BigInt(1)
|
|
else if(q==1) p
|
|
else if(q%2 == 1) pow_mod(p,q-1,n)*p % n
|
|
else pow_mod(p*p % n,q/2,n)
|
|
}
|
|
def gettxt(num:String) = {
|
|
if(num.size%3==2)
|
|
("0" + num).grouped(3).toList.foldLeft("")(_ + _.toInt.toChar)
|
|
else
|
|
num.grouped(3).toList.foldLeft("")(_ + _.toInt.toChar)
|
|
}
|
|
def main(args: Array[String]): Unit = {
|
|
println(f"Original String \t: "+text)
|
|
val msg = getmsg(text)
|
|
println(f"Converted Signal \t: "+msg)
|
|
val enc_sig = encode(msg)
|
|
println("Encoded Signal \t\t: "+ enc_sig)
|
|
val dec_sig = decode(enc_sig)
|
|
println("Decoded String \t\t: "+ dec_sig)
|
|
val rec_msg = gettxt(dec_sig.toString)
|
|
println("Retrieved Signal \t: "+rec_msg)
|
|
}
|
|
}
|