Advertisement
Guest User

Untitled

a guest
Jan 15th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.76 KB | None | 0 0
  1.  
  2. import org.apache.commons.codec.digest.DigestUtils
  3. import org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_1
  4. import java.math.BigDecimal
  5. import java.math.BigInteger
  6. import java.util.*
  7.  
  8.  
  9. const val L = 512
  10. const val N = 64
  11. val q = BigInteger.probablePrime(N, Random())
  12. val p :BigInteger = {
  13.     var p :BigInteger
  14.     print("Calculating p...")
  15.     do {
  16.         p = BigInteger.probablePrime(L, Random())
  17.         print('.')
  18.     }while((p.minus(BigInteger.ONE)).mod(q) == BigInteger.ZERO)
  19.     println("Done!")
  20.     p
  21.     }()
  22.  
  23. val g :BigInteger = {
  24.     var g :BigInteger
  25.     var h :BigInteger = BigInteger.ONE
  26.     print("Calculating q...")
  27.     do {
  28.         h += BigInteger.ONE
  29.          g = h.modPow((p - BigInteger.ONE)/q,p)
  30.         print('.')
  31.     }while(g.modPow(q,p) == BigInteger.ONE)
  32.     println("Done")
  33.     g
  34. }()
  35.  
  36.  
  37. fun main(args: Array<String>) {
  38.     val x = {
  39.         var randomNumber: BigInteger
  40.         val random = Random()
  41.         do {
  42.             randomNumber = BigInteger(q.bitLength(),random )
  43.         } while (randomNumber >= q)
  44.         randomNumber
  45.     }()
  46.     val y = g.modPow(x,p)
  47.     println("$x:$y")
  48.     val string = "string"
  49.     val pair = string.sign(x)
  50.     println("${pair.r}:${pair.s}")
  51.     if(string.verify(y,pair.r,pair.s)){
  52.         println("it worked")
  53.     }else{
  54.         System.err.println("fuck")
  55.     }
  56.  
  57. }
  58.  
  59. fun String.sign(x :BigInteger):RSPair{
  60.     var r :BigInteger
  61.     var k :BigInteger
  62.     do{
  63.         k =  random(BigInteger.valueOf(10))
  64.         r = g.modPow(k,p).mod(q)
  65.     }while(r == BigInteger.ZERO)
  66.     var s :BigDecimal
  67.     while(true) {
  68.         s = (BigDecimal.valueOf(1)/k.toBigDecimal()).times((this.sha1() + x * r).toBigDecimal()).rem(q.toBigDecimal())
  69.         if(s == BigDecimal.ZERO){
  70.             do{
  71.                 k =  random(BigInteger.valueOf(10))
  72.                 r = g.modPow(k,p).mod(q)
  73.             }while(r == BigInteger.ZERO)//regenerate k and r
  74.         }else{
  75.             break
  76.         }
  77.     }
  78.     return RSPair(r,s.toBigIntegerExact())
  79. }
  80.  
  81. data class RSPair(val r :BigInteger, val s :BigInteger)
  82.  
  83. fun random(top :BigInteger):BigInteger{
  84.     val rand = Random()
  85.     var result :BigInteger
  86.     do {
  87.         result = BigInteger(top.bitLength(), rand)
  88.     }while(result >= top || result <= BigInteger.ZERO)
  89.     return result
  90. }
  91.  
  92. fun String.verify(y :BigInteger, r :BigInteger, s: BigInteger):Boolean{
  93.     if(BigInteger.ZERO < r || r < q)return false
  94.     if(BigInteger.ZERO < s || s < q)return false
  95.     val w = s.pow(-1).mod(q)
  96.     val u1 = (this.sha1() * w).mod(q)
  97.     val u2 = (r * w).mod(q)
  98.     val v = (g.pow(u1.toInt()) * y.pow(u2.toInt())).mod(p).mod(q)
  99.     return v == r
  100. }
  101.  
  102.  
  103. fun String.sha1():BigInteger {
  104.     return BigInteger(1,DigestUtils(SHA_1).digest(this))
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement