Advertisement
Guest User

Untitled

a guest
Nov 6th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.67 KB | None | 0 0
  1. import java.security.MessageDigest
  2. import java.util.Arrays
  3. import java.util.Base64
  4.  
  5. object Crypt {
  6.     private val Hasher = MessageDigest.getInstance("SHA-256")
  7.  
  8.     private fun buildMessage(seenZero: Boolean): String {
  9.         val element = if (!seenZero) "0" else "1"
  10.         val builder = StringBuilder()
  11.         repeat(256) {
  12.             builder.append(element)
  13.         }
  14.         return builder.toString()
  15.     }
  16.  
  17.     private fun getPrivateKeys(arr: ByteArray): Array<ByteArray> {
  18.         val privateKeys = Array(256) { ByteArray(32) }
  19.         for (j in 0..255) {
  20.             for (k in 0..31) {
  21.                 privateKeys[j][k] = arr[j * 32 + k]
  22.             }
  23.         }
  24.         return privateKeys
  25.     }
  26.  
  27.     private fun getPublicKeys(arr: ByteArray): Array<ByteArray> {
  28.         val publicKeys = Array(512) { ByteArray(32) }
  29.         for (j in 0..511) {
  30.             for (k in 0..31) {
  31.                 publicKeys[j][k] = arr[j * 32 + k]
  32.             }
  33.         }
  34.         return publicKeys
  35.     }
  36.  
  37.     @JvmStatic
  38.     fun main(args: Array<String>) {
  39.         val secretKeys = Array(256) { Array(512) { ByteArray(32) } }
  40.         val keysAcquired = BooleanArray(256)
  41.         val rootHash = Base64.getDecoder().decode(readLine())
  42.         while (true) {
  43.             val key = Integer.valueOf(readLine())
  44.             val zeroSeen = keysAcquired[key]
  45.             val message = buildMessage(zeroSeen)
  46.             println(message)
  47.             val privateKeys = getPrivateKeys(Base64.getDecoder().decode(readLine()))
  48.             val allPublicKeys = Base64.getDecoder().decode(readLine())
  49.             val publicKeys = getPublicKeys(allPublicKeys)
  50.  
  51.             var curHash = Hasher.digest(byteArrayOf(0) + allPublicKeys)
  52.             var curVertexNum = key
  53.             for (j in 0 until 8) {
  54.                 val hash = Base64.getDecoder().decode(readLine())
  55.                 curHash = if (curVertexNum % 2 == 0) {
  56.                     Hasher.digest(byteArrayOf(1) + curHash + byteArrayOf(2) + hash)
  57.                 } else {
  58.                     Hasher.digest(byteArrayOf(1) + hash + byteArrayOf(2) + curHash)
  59.                 }
  60.                 curVertexNum = curVertexNum shr 1
  61.             }
  62.             val q = readLine()!!
  63.             if (!Arrays.equals(curHash, rootHash)) {
  64.                 println("NO\nNO")
  65.                 continue
  66.             }
  67.             var correct = true
  68.             for (j in 0..255) {
  69.                 val additional = if (!zeroSeen) 0 else 256
  70.                 val privateHash = Hasher.digest(privateKeys[j])
  71.                 val curPublicKey = publicKeys[j + additional]
  72.                 if (!Arrays.equals(curPublicKey, privateHash)) {
  73.                     correct = false
  74.                     break
  75.                 }
  76.             }
  77.             if (correct) {
  78.                 println("YES")
  79.             } else {
  80.                 println("NO\nNO")
  81.                 continue
  82.             }
  83.             if (!zeroSeen) {
  84.                 keysAcquired[key] = true
  85.             }
  86.             val additional = if (!zeroSeen) 0 else 1
  87.             for (j in 0..255) {
  88.                 secretKeys[key][2 * j + additional] = privateKeys[j]
  89.             }
  90.             if (!zeroSeen && q != message) {
  91.                 println("NO")
  92.                 continue
  93.             }
  94.             println("YES")
  95.             val ans = ByteArray(256 * 32)
  96.             for (j in 0..255) {
  97.                 val addition = if (q[j] == '1') 1 else 0
  98.                 for (k in 0..31) {
  99.                     ans[j * 32 + k] = secretKeys[key][2 * j + addition][k]
  100.                 }
  101.             }
  102.             println(Base64.getEncoder().encodeToString(ans))
  103.             return
  104.         }
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement