๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์‚ฐํ˜• ๋„คํŠธ์›Œํฌ์—์„œ๋Š” ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๋ธ”๋ก์ฒด์ธ์—์„œ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ๊ฐ„์— ์‹ ๋ขฐ๊ฐ€ ์—†๋Š” ๋„คํŠธ์›Œํฌ์—์„œ๋Š” ๋ถ€์ธํ•  ์ˆ˜ ์—†๋Š” ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๊ฒŒ์ž„์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋Š” ํŒŒ๋„ ํฌ๋ฆฌ์Šค๋งˆ์Šค ํŠธ๋ฆฌ. ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

์ฒ˜์Œ์—๋Š” ๋ธ”๋ก์ฒด์ธ์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•  ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆซ์ž๊ฐ€ ์กฐ์ž‘๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์†”๋ฃจ์…˜์ด ์ ํ•ฉํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ํ™•์žฅ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” 1๋ถ€ํ„ฐ 5๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ ์ถ”์ธกํ•˜๊ณ  ์—ฌ๊ธฐ์— ์†”ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ•ด์‹ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ€์ฐฉ ๊ธฐ๋Šฅ. ์„œ๋ฒ„๋Š” ๋ฏธ๋ฆฌ ์ €์žฅ๋œ ๋ฒˆํ˜ธ๋กœ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„์€ ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด์‹œ์— ์ˆจ๊ฒจ์ง„ ์ˆซ์ž๋ฅผ ์ถ”์ธกํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฒ ํŒ…์„ ํ•˜๊ณ  ์„œ๋ฒ„๋Š” ์ˆจ๊ฒจ์ง„ ์ˆซ์ž์™€ "์†Œ๊ธˆ"์„ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์œผ๋กœ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๊ทธ๋Š” ์นด๋“œ๋ฅผ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ ์„œ๋ฒ„๋Š” ์ˆซ์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ŠนํŒจ๋ฅผ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ํ™•์ธ์„ ์œ„ํ•ด ์ˆซ์ž๋‚˜ "์†Œ๊ธˆ"์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ ๊ฒŒ์ž„๋งˆ๋‹ค ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๋ฏธ๋ฆฌ ๋ฐฐํฌํ•˜๊ณ  ์ž ์žฌ์ ์ธ ์Šน๋ฆฌ๋ฅผ ํฌํ•จํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํŽธํ•˜๊ณ  ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ์—๋Š” ๋‹ค๋ฅธ ์•ˆ์ „ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ Tradisys ํŒ€์€ Waves ํ”„๋กœํ† ์ฝœ์— ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. rsaํ™•์ธ(). ๊ณต๊ฐœ ํ‚ค์™€ ๊ฐœ์ธ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ RSA ์„œ๋ช…์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐ€์ง€ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค: ์ฃผ์‚ฌ์œ„ ๋กค๋Ÿฌ, Coin Flip ะธ ํŒŒ๋„๋ฅผ ํƒ€๊ณ . ๊ฐ๊ฐ์€ ๋‚œ์ˆ˜ ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„ ๋ด…์‹œ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

Ride on Waves๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—.

ํƒญ์œผ๋กœ ์ด๋™ ์Šคํฌ๋ฆฝํŠธ ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ ๋””์ปดํŒŒ์ผ๋จ. ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ฝ”๋“œ(์ผ๋ช… ์Šคํฌ๋ฆฝํŠธ)๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ฝ”๋“œ์—๋Š” ์ผ๋ จ์˜ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. @Callable๋กœ ํ‘œ์‹œ๋œ ํ•ญ๋ชฉ์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํŠธ๋žœ์žญ์…˜. ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ ํŒ… ะธ ์ฒ ์ˆ˜:

  • ์žฌ๋ฏธ์žˆ๋Š” ๋ฒ ํŒ…(playerChoice)
  • func ์ฒ ํšŒ(gameId,rsaSign)

1. ์‚ฌ์šฉ์ž๋Š” ์„ธ๊ทธ๋จผํŠธ ๊ธธ์ด์™€ ๋ฒ ํŒ… ํฌ๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

2. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฒ ํŒ… ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ ๋‚ด๊ธฐ("50").

3. ํด๋ผ์ด์–ธํŠธ๋Š” Invocation ํŠธ๋žœ์žญ์…˜์„ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ฃผ์†Œ(Broadcast InvocationTx)๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜์—๋Š” ํ†ตํ™” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฒ ํŒ… ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ˜ธ์ถœ ํŠธ๋žœ์žญ์…˜์ด ์Šค๋งˆํŠธ ๊ณ„์•ฝ์—์„œ ๋ฒ ํŒ… ๊ธฐ๋Šฅ(์„ ํƒ: ๋ฌธ์ž์—ด)์˜ ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

4. ๋ฒ ํŒ… ๊ธฐ๋Šฅ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

@Callable(i)
func bet (playerChoice) = {
    let newGameNum = IncrementGameNum()
    let gameId = toBase58String(i.transactionId)
    let pmt = extract(i.payment)
    let betNotInWaves = isDefined(pmt.assetId)
    let feeNotInWaves = isDefined(pmt.assetId)
    let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
    let txIdUsed = isDefined(getString(this, gameId))
    if (betNotInWaves)
        then throw ("Bet amount must be in Waves")
        else if (feeNotInWaves)
            then throw ("Transaction's fee must be in Waves")
            else if (txIdUsed)
                then throw ("Passed txId had been used before. Game aborted.")
                else {
                    let playerPubKey58 = toBase58String(i.callerPublicKey)
                    let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
                    ScriptResult(WriteSet(cons(DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), cons(DataEntry(GAMESCOUNTERKEY, newGameNum), cons(DataEntry(gameId, gameDataStr), nil)))), TransferSet(cons(ScriptTransfer(SERVER, COMMISSION, unit), nil)))
                    }
    }

์ด ํ•จ์ˆ˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ƒํƒœ์— ์ƒˆ๋กœ์šด ๊ฒŒ์ž„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰:

  • ์ƒˆ ๊ฒŒ์ž„์˜ ๊ณ ์œ  ์‹๋ณ„์ž (๊ฒŒ์ž„ ID)
  • ๊ฒŒ์ž„ ์ƒํƒœ = ์ œ์ถœ๋จ
  • ํ”Œ๋ ˆ์ด์–ด์˜ ์„ ํƒ(์„ธ๊ทธ๋จผํŠธ ๊ธธ์ด 50)
  • ๊ณต๊ฐœํ‚ค
  • ์ž ์žฌ์  ์Šน๋ฆฌ(ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฒ ํŒ…์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

๋ธ”๋ก์ฒด์ธ์˜ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ‚ค-๊ฐ’).

{
    "type": "string",
    "value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
    "key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
  }

"์—ด์‡ "(์—ด์‡ ) โ€“ ๊ฒŒ์ž„ ์•„์ด๋”” ์ƒˆ๋กœ์šด ๊ฒŒ์ž„. ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋Š” "๊ฐ’" ํ•„๋“œ ์ค„์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•ญ๋ชฉ์€ ํƒญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค Data ์Šค๋งˆํŠธ ๊ณ„์•ฝ:

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

5. ์„œ๋ฒ„๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ "๋ณด๊ณ " ๋ธ”๋ก์ฒด์ธ Api๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋œ ํŠธ๋žœ์žญ์…˜(์ƒˆ ๊ฒŒ์ž„)์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๊ฒŒ์ž„์˜ ๊ฒŒ์ž„ ID๋Š” ์ด๋ฏธ ๋ธ”๋ก์ฒด์ธ์— ๊ธฐ๋ก๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

6. ์„œ๋ฒ„๋Š” ์ฒ ํšŒ ๊ธฐ๋Šฅ(gameId, rsaSign)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")

7. ์„œ๋ฒ„๋Š” Invocation ํŠธ๋žœ์žญ์…˜์„ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค(InvocationTx ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ). ํŠธ๋žœ์žญ์…˜์—๋Š” ํ˜•์„ฑ๋œ ์ฒ ํšŒ ํ•จ์ˆ˜(gameId, rsaSign)์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

ํ•จ์ˆ˜์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์•„์ด๋”” ์ƒˆ๋กœ์šด ๊ฒŒ์ž„๊ณผ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ RSA ์„œ๋ช…ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์„œ๋ช… ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”?

๋™์ผํ•œ ๊ฐ’(๊ฒŒ์ž„ ID)์„ ๊ฐ€์ ธ์™€ RSA ์„œ๋ช… ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด RSA ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ID์™€ RSA ์ ์šฉ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ตœ์ข… ์ˆซ์ž๋Š” ์กฐ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

8. ๋ธ”๋ก์ฒด์ธ์ด ๊ฑฐ๋ž˜๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. ์ฒ ํšŒ ๊ธฐ๋Šฅ(gameId, rsaSign)์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

9. ์ถœ๊ธˆ ๊ธฐ๋Šฅ ๋‚ด์—์„œ ์ถœ๊ธˆ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑRandInt ํ•จ์ˆ˜ (gameId, rsaSign). ์ด๊ฒƒ์€ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค.

# @return 1 ... 100
func GenerateRandInt (gameId,rsaSign) = {
   	# verify RSA signature to proof random
    let rsaSigValid = rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
    if (rsaSigValid)
        then {
            let rand = (toInt(sha256(rsaSign)) % 100)
            if ((0 > rand))
                then ((-1 * rand) + 1)
                else (rand + 1)
            }
        else throw ("Invalid RSA signature")
    }

๋žœ๋“œ - ๊ทธ๋ฆฌ๊ณ  ์ž„์˜์˜ ์ˆซ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € RSA ์„œ๋ช…์˜ ๊ฒฐ๊ณผ์ธ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์•„์ด๋”” ๊ฐœ์ธ ํ‚ค(rsaSign). ๊ทธ๋Ÿฐ ๋‹ค์Œ SHA-256(sha256(rsaSign)).

์šฐ๋ฆฌ๋Š” ์„œ๋ช…๊ณผ ํ›„์† ํ•ด์‹ฑ์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚œ์ˆ˜ ์ƒ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ฒ”์œ„(์˜ˆ: 1์—์„œ 100)์˜ ์ˆซ์ž๋ฅผ ์–ป์œผ๋ ค๋ฉด toInt ๋ณ€ํ™˜ ํ•จ์ˆ˜์™€ %100( ๋ชจ๋“œ).

๊ธฐ์‚ฌ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. rsaํ™•์ธ(), ๊ณต๊ฐœ ํ‚ค์™€ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RSA ์„œ๋ช…์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ generateRandInt(gameId,rsaSign) ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค:

rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)

๊ณต๊ฐœ ํ‚ค RSAPUBLIC ๋ฐ rsaSign ๋ฌธ์ž์—ด์ด ์ž…๋ ฅ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์˜ ์œ ํšจ์„ฑ์ด ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์ด ์„ฑ๊ณตํ•˜๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์€ ์„œ๋ช…์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค(์ž˜๋ชป๋œ RSA ์„œ๋ช…).

์„œ๋ฒ„๋Š” ๊ฐœ์ธ ํ‚ค๋กœ ๊ฒŒ์ž„ ID์— ์„œ๋ช…ํ•˜๊ณ  2880 ๋ธ”๋ก ์ด๋‚ด์— ์œ ํšจํ•œ Rsa ์„œ๋ช…์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๋ฐฐํฌํ•  ๋•Œ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ์‹œ๊ฐ„ ๋‚ด์— ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๊ฒฝํ’ˆ์€ ๋ฐ˜๋“œ์‹œ ๊ท€ํ•˜์˜ ์ฃผ์†Œ๋กœ ์ง์ ‘ ๋ฐœ์†ก๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†์‹ค๋กœ ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— "์„œ๋ฒ„๊ฐ€ ๋ถ€์ • ํ–‰์œ„๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ์ˆ˜์ต์„ฑ์ด ์—†๋‹ค"๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ RSA ๋ฌด์ž‘์œ„

์‚ฌ์šฉ์ž๊ฐ€ ํ”Œ๋ ˆ์ด ์ค‘์ž…๋‹ˆ๋‹ค. ์ฃผ์‚ฌ์œ„ ๋กค๋Ÿฌ. ์ €๋Š” ํ๋ธŒ์˜ 2๊ฐœ ๋ฉด ์ค‘ 6๊ฐœ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ ํŒ…์€ 14 WAVES์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„(2880 ๋ธ”๋ก) ๋‚ด์— ์Šค๋งˆํŠธ ๊ณ„์•ฝ์— ์œ ํšจํ•œ RSA ์„œ๋ช…์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” 34.44 WAVES๋ฅผ ๊ฐ€์ ธ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„์—์„œ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ธ”๋ก์ฒด์ธ์ด ์•„๋‹Œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์ธ ์˜ค๋ผํด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๊ฒŒ์ž„ ID์˜ RSA ์„œ๋ช…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋งˆํŠธ ๊ณ„์•ฝ์€ ์„œ๋ช…์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์Šน์ž๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์ •์งํ•œ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  Tradisys ๊ฒŒ์ž„์€ ์„ค๋ช…๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ธ”๋ก์ฒด์ธ ๊ฒŒ์ž„์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ํˆฌ๋ช…ํ•˜๊ณ  ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ธ”๋ก์ฒด์ธ์—๋Š” ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ๊ณผ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ฌด์ž‘์œ„์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€