Fiat-Shamir 零知识证明协议

场景介绍

一般用户在网站注册账号的时候,网站会要求用户设置一个密码,然后在后台保存这个密码,用户登录网站的时候要求再输入这个密码,与后台保存的密码进行比较,确定是否给用户登录权限,但这种时候用户的密码容易受到字典攻击,有一些安全意识的网站会加盐保存密码的hash,增加敌手穷举用户密码或撞库的难度。但用户密码保存在网站后台服务器上始终增加了泄露的风险,Fiat-Shamir零知识证明协议可以允许用户向注册的网站证明自己知道自己的密码,而不向网站泄露任何关于密码的信息。

Fiat-Shamir with secret password

首先Peggy(证明者,Prover)与Victor(验证者,Verifier)就公开参数(一个素数n,一个模n群的生成元g)达成共识。

  1. Peggy首先选择她的密码,然后对密码进行哈希,把结果转成整型数值x。
x=int(Hash(passowrd))
y=g^x mod n

Peggy 把y的值发给 Victor,让他保存

  1. 现在Peggy想要登录,她选择一个随机数v,计算
t = g^v mod n

然后把t的值发给Victor

  1. Victor收到t,然后发送随机数c给Peggy
  2. Peggy生成随机数v,计算
r =v -cx mod (n-1)

Peggy把r发送给Victor

  1. Victor计算
val=(g^r)(y^c) mod n

然后判断val与t是否相等,若相等,则Peggy证明了自己知道密码,然后允许Peggy登录。

使用

源码

SmartDev-Contract/contracts/common_tools/privacy_computation/Fiat-Shamir-ZK at master · WeBankBlockchain/SmartDev-Contract · GitHub

将FiatShamir.sol部署到区块链

0x0a49ecf4d04e32769bdb210ee5be64e5171d5b59

1. 在链下使用contract_step1.py 计算 y值,然后在FiatShamir.sol中调用Step1_register 将y值登记。

2. 在链下使用contract_step2.py 计算 t值, 然后在FiatShamir.sol中调用Step2_login 传递t值。

3. 在FiatShamir.sol中调用Step3_randomchallenge 生成c值。

4. 查看c值并使用contract_step45.py 计算r值。

v是一个随机数,在第2步中生成

5.在FiatShamir.sol中调用Step45_verify ,输入r值,输出true 或 false,表示验证通过与否。

结果通过

尝试一个其它的

其中各个函数的输入通过 链下运行 contract_step1.py 计算 y,contract_step2.py 计算t, contract_step45.py 计算r 。

fiat_shamir_1.py 为整个交互过程的参考代码

参考文献

[1] Fiat, Amos, and Adi Shamir. “How to prove yourself: Practical solutions to identification and signature problems.” Conference on the Theory and Application of Cryptographic Techniques. Springer, Berlin, Heidelberg, 1986.

文档:

Fiat-Shamir 零知识证明协议 — WeBankBlockchain-SmartDev-Doc v2.6.0 文档

contract_step1.py

import libnum
import hashlib
n=8269
g=11password = "Hello"print("Password:\t\t",password)
x = int(hashlib.sha256(password.encode()).hexdigest()[:8], 16) % n
print("Password hash(x):\t",x,"\t (last 8 bits)")print('\n======Phase 1: Peggy sends y to Victor,Victor store y as Peggy\' token==================')
y= pow(g,x,n)
print('y= g^x mod P=\t\t',y)

contract_step2.py

import libnum
import hashlib
import random
n=8269
g=11v = random.randint(1,n)print('\n======Phase 2: Peggy wants to login , She send t to Victor==================')
v = random.randint(1,n)
t = pow(g,v,n)
print('v=',v,'\t(Peggy\'s random value)')
print('t=g**v % n =\t\t',t)

contract_step45.py

import libnum
import hashlib
import random
n=8269
g=11password = "Hello"
x = int(hashlib.sha256(password.encode()).hexdigest()[:8], 16) % nprint('\n======Phase 4: Peggy recieves c and calculate r=v-cx, sends r to Victor==================')
c = input("c= ")
v = input("v= ")
r = (int(v) - int(c) * x) % (n-1)print('c=\t\t',c)
print('v=\t\t',v)
print('r=v-cx =\t\t',r)

fiat_shamir_1.py

import sys
import random
import hashlib
import libnumn=8269
password="Hello"
g= 11v = random.randint(1,n)
c = random.randint(1,n)print("Password:\t\t",password)
x = int(hashlib.sha256(password.encode()).hexdigest()[:8], 16) % n
print("Password hash(x):\t",x,"\t (last 8 bits)")y= pow(g,x,n)t = pow(g,v,n)r = (v - c * x) % (n-1)Result = ( pow(g,r,n) * pow(y,c,n))  % nprint('\n======Phase 0: Agreed parameters============')
print('P=',n,'\t(Prime number)')
print('G=',g,'\t(Generator)')print('\n======Phase 1: Peggy sends y to Victor,Victor store y with Peggy ==================')
print('y= g^x mod P=\t\t',y)print('\n======Phase 2: Peggy wants to login , She send t to Victor==================')
print('v=',v,'\t(Peggy\'s random value)')
print('t=g**v % n =\t\t',t)print('\n======Phase 3: Victor choose c randomly ,and sends it to Peggy==================')
print('c=',c,'\t(Vitor\' random challenge)')print('\n======Phase 4: Peggy recieves c and calculate r=v-cx, sends r to Victor==================')
print('r=v-cx =\t\t',r)print('\n======Phase 5: Victor calculates (g^r)*(y^c)== t? ==================')
print('t= % n =\t\t',t)
print('( (g**r) * (y**c) )=\t',Result)
if (t==Result):print('\nPeggy has proven she knows password')
else:print('\nPeggy has not proven she knows x')

FiatShamir.sol

pragma solidity >=0.4.16 <0.9.0;contract FiatShamir {//============Phase 0: Agreed parameters===================// primeuint public n = 8269;// generatoruint public g = 11;//=========================================================// g^x mod nuint y;// Victor's random challengeuint public c;// peggy sends random t uint t;//======Phase 1: Peggy sends y to Victor,Victor store y as Peggy' token==================// peggy registers with y,  y = g^x mod nfunction Step1_register( uint _y) public {y = _y;}//=======================================================================================//======Phase 2: Peggy wants to login , She send t to Victor=============================function Step2_login(uint _t) public {t = _t;}//=======================================================================================//======Phase 3: Victor choose c randomly ,and sends it to Peggy=========================function Step3_randomchallenge() external returns (uint){c = randomgen();return c;}//TODO : NOT secure , low entropy ,change random source.function randomgen() private view returns (uint) {return uint(keccak256(abi.encodePacked(block.timestamp))) % n;}//=======================================================================================//======Phase 4: Peggy recieves c and calculate r=v-cx, sends r to Victor================//======Phase 5: Victor calculates (g^r)*(y^c)== t? =====================================function Step45_verify(uint r) public  returns (bool){uint256 result = 0;result = (modExp(g,r,n)*modExp(y,c,n)) % n;return t == result;}//=======================================================================================// modular algorithm : calculate  b**e mod mfunction modExp(uint256 _b, uint256 _e, uint256 _m) private returns (uint256 result) {assembly {// Free memory pointerlet pointer := mload(0x40)// Define length of base, exponent and modulus. 0x20 == 32 bytesmstore(pointer, 0x20)mstore(add(pointer, 0x20), 0x20)mstore(add(pointer, 0x40), 0x20)// Define variables base, exponent and modulusmstore(add(pointer, 0x60), _b)mstore(add(pointer, 0x80), _e)mstore(add(pointer, 0xa0), _m)// Store the resultlet value := mload(0xc0)// Call the precompiled contract 0x05 = bigModExpif iszero(call(not(0), 0x05, 0, pointer, 0xc0, value, 0x20)) {revert(0, 0)}result := mload(value)}}
}

FISCO BCOS 零知识证明 Fiat-Shamir 实例源码相关推荐

  1. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码

    jsp与javabean链接mysql数据库并查询数据表的简单实例源码.这个简单的实例是给新手学习的,或者一些高手临时忘记怎么使用jsp操作mysql数据库时候查找的,包括了建立mysql数据库连接的 ...

  2. 微信小程序实例源码大全demo下载

    怎么本地测试微信小程序实例源码 1.下载源码 2.打开微信开发者工具 3.添加项目->选择本项目目录->编译执行 微信小程序实例源码大全 微信小程序游戏类demo:识色:从相似颜色中挑选不 ...

  3. Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...

    在Silverlight程序(非Out of Browser模式)中是无法直接调用DLL的,但是很多的计算或者其他应用程序的调用中我们需要用到DLL的加载.比如调用DLL来识别身份证读卡器传输过来 ...

  4. 龙格库塔法解微分方程组的matlab程序,MATLAB实例源码教程:龙格库塔法求解微分方程组源代码实例.doc...

    MATLAB实例源码教程:龙格库塔法求解微分方程组源代码实例.doc MATLAB实例源码教程龙格库塔法求解微分方程组源代码实例题目用经典 Runge-Kutta方法求下列一阶微分方程组的近似解y1 ...

  5. c语言 临时文件作用,c语言函数mktemp()产生唯一临时文件名实例源码介绍

    c语言函数mktemp()产生唯一临时文件名实例源码介绍.有关的函数:tmpfile引入的头文件:#include 定义函数mktemp():char * mktemp(char * template ...

  6. c语言复制粘贴源码,c语言函数memccpy()如何复制内存中的内容实例源码介绍

    c语言函数memccpy()如何复制内存中的内容实例源码介绍.引入的头文件:#include memccpy()函数定义:void * memccpy(void *dest, const void * ...

  7. C++ Opengl 变形实例源码

    C++ Opengl 变形实例源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方 ...

  8. C++ Opengl纹理过滤和光照实例源码

    C++ Opengl纹理过滤和光照实例源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8. ...

  9. java线程实例题_java线程相关试题实例源码代码

    java线程相关试题实例源码代码. /** * 计算输出其他线程锁计算的数据 */ class ThreadA { public static void main(String[] args) { T ...

  10. 发布CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008)和架构实例源码Demo

    CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008) Microsoft Visual Studio 2008开发,需要安装运行库. 支持生成多标签切换等功能,方便代码生成, ...

最新文章

  1. 一项横断面人群研究中比较放射学阴性的中轴脊柱关节炎患者与强制性脊柱炎患者之间的差别...
  2. Windows Server 2012 R2 WSUS-11:经典的客户端排错操作
  3. vb.net播放avi动画
  4. 直播 | 清华大学博士生姚远:对抗语言游戏
  5. 数据结构带头结点单向不循环链表(C语言版)
  6. Javascrip之匿名函数
  7. 重写慢日志解析程序,实现打印慢SQL信息及其所属数据库
  8. [导入]Text To Picture
  9. Norton AntiVirus 8.0 企业版服务器客户端安装说明
  10. 万科企业宗旨、愿景与核心价值观
  11. grabber的使用_Google Grabber —使用PHP找出您的域名在Google中列出了多少页
  12. 【Qt】一文总结Qt5.15的在线安装
  13. 假如不小心因病去世,怎么给家人留下足够的财富呢?
  14. 24505 Problem A 例题1-1-1 按要求输出信息(1)
  15. BDE与ADO的比较
  16. 接入安卓Facebook SDK的AppEvents
  17. NEWS|药物发现公司正在定制ChatGPT:方法如下
  18. RAID和LVM磁盘阵列
  19. 数字合成器AD9854的使用
  20. 遇事没有眼力见,反应不灵活,该怎么改善?

热门文章

  1. jQuery插件开发精品教程,让你的jQuery提升一个台阶
  2. Java JSON中无分隔符日期字符串处理
  3. CentOS 下安装 Nginx
  4. 走进Linq-Linq to SQL感性认识篇
  5. kafka传数据到Flink存储到mysql之Flink使用SQL语句聚合数据流(设置时间窗口,EventTime)...
  6. angular2 --使用DecimalPipe格式化数字
  7. php对浮点数小数取整,php除法取整数
  8. UGUI Scrollbar控件
  9. 初中级工程师是否应急于学习html5?
  10. 欧几里德算法(求最大公约数和最小公倍数)