我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
        • 1. 使用单向函数
        • 2. 使用满足交换律的加密算法
        • 3. 使用二次剩余
        • 4. 使用雅可比符号
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

抛币协议


1. 使用单向函数

  1. Alice和Bob各自选择一个随机字符串,比如"ljngjkrjgnfdudiudd" 和 "gfdgdfjkherfsfsd"
  2. Alice随机生成一个抛硬币的结果,比如"tail"
  3. Bob把自己的随机字符串发送给Alice
  4. Alice把抛币结果和两个人的随机字符串合并成一个新的字符串,例如"tail ljngjkrjgnfdudiudd gfdgdfjkherfsfsd",并且把这个字符串的hash值"59dea408d43183a3937957e71a4bcacc616d9cbc"发送给Bob
  5. Alice问Bob: “你猜是head还是tail"?
  6. Bob猜一个结果,比如"head"
  7. Alice告诉告诉Bob他猜错了,并且出示完整的字符串

2. 使用满足交换律的加密算法

  1. Alice和Bob通过别的协议协商出各自的RSA密钥对{ea,da,n},{ebb,db,n}, 满足eada≡ebdb≡1(modϕ(pq))
  2. Alice生成两份消息M1和M2,一份表示"head",一份表示"tail",这些字符串还要包含双方协商好的特定字符串和随机字符串,以满足后期的验证
  3. Alice使用自己的公钥加密这两份消息,得到Ea(M1),Ea(M2),并且以随机的顺序发给Bob
  4. Bob无法识别消息的内容,随机选择其中的一个消息M,并且用自己的公钥加密得到Eb(Ea(M)),然后发送给Alice
  5. Alice无法识别消息中的内容,用自己的私钥解密该消息,得到Da(Eb(Ea(M)))=Eb(M),然后发送回Bob
  6. Bob用自己的私钥解密消息,得到Db(Eb(M)))=M,于是Bob得到了抛币的结果并发送给Alice
  7. 双方交换各自的密钥对,以验证过程双方有没有欺诈

3. 使用二次剩余

  1. Alice选择两个质数p,q,计算n=qp,然后将n发送给Bob
  2. Bob随机一个数字x<n/2,计算y=x2modn,并发送y给Alice
  3. Alice求解同余方程x2≡y(modpq),得到两对解,分别是±x1,±x2
  4. Alice猜测Bob所随机的数字属于哪组解,并发送该组解±x′给Bob
  5. Bob根据结果判断,如果x=x′或者x=n−x′,表示Alice猜对了,否则就是猜错了
  6. Bob把结果告诉Alice,并出示x
  7. Alice把p,q告诉Bob验算

4. 使用雅可比符号

  1. Bob随机选择两个质数,满足p≡3(mod4),q≡3(mod4), 计算n=pq发送给Alice
  2. Alice随机选择一个数字x, 满足gcd(x,n)=1, 计算y=x2modn,把y发送给Bob
  3. Bob猜测J(x,n)的数值b∈{−1,1},并且把b发送给Alice
  4. Alice向Bob出示x
  5. Bob验证y≡x2(modn),并向Alice出示p,q
Prev
RSA
Next
智能扑克协议