Advertisement
Guest User

Untitled

a guest
May 20th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.10 KB | None | 0 0
  1. import java.math.BigInteger
  2. import java.util.*
  3.  
  4. class RSA(val pq: Pair<BigInteger,BigInteger>) {
  5.     val sizeOfValues = 1024
  6.     // generate two values
  7.     //val p = BigInteger.probablePrime(sizeOfValues, Random())
  8.     //val q = BigInteger.probablePrime(sizeOfValues, Random())
  9.     var tmpToShow: BigInteger? = null
  10.     val p = pq.first
  11.     val q = pq.second
  12.     val n = p*q  // our module
  13.     var publicKey = Pair(BigInteger.ZERO,BigInteger.ZERO)
  14.     var privateKey = Pair(BigInteger.ZERO,BigInteger.ZERO)
  15.  
  16.     val eilerVal = (p.minus(1.toBigInteger()))*(q.minus(1.toBigInteger()))
  17.  
  18.     val e = BigInteger.valueOf(3) // public exponent
  19.  
  20.  
  21.     fun go(){
  22.         checkE(e)
  23.         val d = modInversion(e,eilerVal)
  24.         publicKey = Pair(e,n)
  25.         privateKey = Pair(d,n)
  26.         println("Public key is {${publicKey.first};${publicKey.second}}")
  27.         println("Private key is {${privateKey.first};${privateKey.second}}")
  28.     }
  29.  
  30.     fun encrypt(message: BigInteger): BigInteger? {
  31.         val encryptedMsg = message.insverseMod(publicKey)
  32.         println("Encrypted message is $encryptedMsg")
  33.         return encryptedMsg
  34.     }
  35.  
  36.     fun decrypt(message: BigInteger): BigInteger? {
  37.         val decryptedMsg = message.insverseMod(privateKey)
  38.         println("Decrypted message is $decryptedMsg")
  39.         return decryptedMsg
  40.     }
  41.  
  42.     fun sign(message: BigInteger): Pair<BigInteger, BigInteger> {
  43.         tmpToShow = message
  44.  
  45.         var s = message.insverseMod(privateKey)
  46.         val sha = SHA1()
  47.         val sString = sha.encrypt(s.toString())
  48.         return Pair(message,s!!)
  49.     }
  50.  
  51.     fun checkSign(signedMessage: Pair<BigInteger,BigInteger>): Boolean {
  52.         val checkingPair = signedMessage.second.insverseMod(publicKey)
  53.         println("Checking pair is $checkingPair")
  54.         if (checkingPair == tmpToShow){
  55.             return true
  56.         }
  57.         return false
  58.     }
  59.  
  60.  
  61.     fun checkE(e: BigInteger){
  62.         if (e > 1.toBigInteger() && e < eilerVal && isPrime(e, eilerVal)) {
  63.                 println("Open exponent is correct")
  64.             } else {
  65.                 println("Your open exponent is wrong")
  66.             }
  67.         }
  68.     private fun nod(a: BigInteger, b: BigInteger): BigInteger {
  69.         var a = a
  70.         var b = b
  71.         var t: BigInteger
  72.         while (b != BigInteger.ZERO) {
  73.             t = a
  74.             a = b
  75.             b = t % b
  76.         }
  77.         return a
  78.     }
  79.  
  80.     private fun isPrime(a: BigInteger, b: BigInteger): Boolean {
  81.         return nod(a, b) == 1.toBigInteger()
  82.     }
  83.  
  84.     fun ClosedRange<Int>.random() =
  85.             Random().nextInt(endInclusive - start) +  start
  86.  
  87.     fun modInversion(a: BigInteger, m: BigInteger): BigInteger {
  88.         var a = a
  89.         var m = m
  90.         val m0 = m
  91.         var y = BigInteger.ZERO
  92.         var x = BigInteger.ONE
  93.  
  94.         if (m == BigInteger.ONE)
  95.             return BigInteger.ZERO
  96.  
  97.         while (a.compareTo(BigInteger.ONE) > 0) {
  98.             val q = a.divide(m)
  99.             var t = m
  100.             m = a.mod(m)
  101.             a = t
  102.             t = y
  103.  
  104.             y = x.subtract(q.multiply(y))
  105.             x = t
  106.         }
  107.  
  108.  
  109.         if (x.compareTo(BigInteger.ONE) < 0)
  110.             x = x.add(m0)
  111.  
  112.         return x
  113.     }
  114. }
  115.  
  116. private fun BigInteger.insverseMod(key: Pair<BigInteger, BigInteger>): BigInteger? {
  117.     return modPower(this,key.first,key.second)
  118. }
  119.  
  120. fun modPower(base: BigInteger, exponent: BigInteger, mod: BigInteger): BigInteger {
  121.     var base = base
  122.     var exponent = exponent
  123.     var mod = mod
  124.     var res = BigInteger("1")
  125.     if (exponent.compareTo(BigInteger.ZERO) < 0) {
  126.         exponent = exponent.abs()
  127.     }
  128.     if (base.compareTo(BigInteger.ZERO) < 0) {
  129.         base = base.abs()
  130.     }
  131.     if (mod.compareTo(BigInteger.ZERO) < 0) {
  132.         mod = mod.abs()
  133.     }
  134.  
  135.     while (exponent.compareTo(BigInteger.ZERO) > 0) {
  136.         if (exponent.and(BigInteger.ONE).compareTo(BigInteger.ONE) == 0) {
  137.             res = res.multiply(base).mod(mod)
  138.         }
  139.         base = base.multiply(base).mod(mod)
  140.         exponent = exponent.shiftRight(1)
  141.     }
  142.     return res
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement