零知识证明-椭圆曲线(四)

news2024/9/20 1:05:26

前言
零知识证明(Zero—Knowledge Proof),是指一种密码学工具,允许互不信任的通信双方之间证明某个命题的有效性,同时不泄露任何额外信息
上章介绍了基础数字知识,这章主要讲 椭圆曲线 方程

2:椭圆曲线方程
y2+axy+by=x3+cx2+dx+e
式中,a、b、c、d、e均为实数,x和y在实数集上取值。
在加密领域一般采用如下简化后的数学形式:
有限域椭圆曲线
y2= x3+ax+b mod p (p为素数) 方程1
其中对于 a,b 两个参数有一个判定式,其值不得为零
选择两个满足下列约束条件的小于p的非负整数a、b
Δ=4a3+27b2≠ 0
假设𝑟1,𝑟2,𝑟3是方程的三个根,则((𝑟1−𝑟2)(𝑟1−𝑟3)(𝑟2−𝑟3))2=−(4a3+27b2)。若要求方程1无重根,即𝑟1,𝑟2,𝑟3互不相同,有((𝑟1−𝑟2)(𝑟1−𝑟3)(𝑟2−𝑟3))2≠0,即4a3+27b2≠0

比特币Bitcoin使用了 secp256k1这条特殊的椭圆曲线:y2 = x3+7
限场模量
在的情况下secp256k1,该字段是整数模的有限域p,其中
p = 2256 - 232 - 977
29+28+27+26+24+1 = 977
这里选择p相对接近2 256。它不是小于2 256的最大素数; p和2 256之间有很多素数。其他因素也同样影响着选择p。请注意,我们不是在整数mod p本身工作,而是在一个阿贝尔组中,其加法法则由整数mod p上的椭圆曲线定义
2256 = 10进制
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936

x = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
y = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
assert((yy - xx*x - 7) % p == 0)

随便画的曲线,大概描述是这样(画的直点,歪点不要太在意)
在这里插入图片描述
从 A 点开始:
A dot B = -C(从 A 点至 B 点画一条直线,与曲线相交于 -C 点)
-C 点经过 X 轴反射到曲线上的 C 点
A dot C = -D (从 A 点至 C 点画一条直线,与曲线相交于 -D 点)
-D 点经过 X 轴反射到曲线上的 D 点
A dot D = -E (在 A 点至 D 点画一条直线,与曲线相交于 -E 点)
-E 点经过 X 轴反射到曲线上的 E 点

因为如果你知道起点(A)在哪里,以及到达终点(E)需要经历多少次跳跃,很容易就能找到终点。但是,如果你只知道起点 A 和终点 E 在哪里,几乎不可能知道中间经历了几次跳跃。 公钥:起点 A 、终点 E 私钥:从 A 点至 E 点需要经历几次跳跃

在这里插入图片描述
相关公式如下: 有限域GF§上的椭圆曲线y² = x³ + ax + b,若P(Xp, Yp), Q(Xq, Yq),且P≠-Q,则R(Xr,Yr) = P+Q 由如下规则确定:
公式(1)
在这里插入图片描述
P+0 或者 Q=0 :因为定义0为无穷远处,不能基于无穷远处划线。但是因为定义了0为单位元,所以 P+0=P 以及 0+Q=Q。
P = -Q :因为两个点是对称的,所以基于这两个点划的线垂直于x轴,不再相交于其他点。P+Q = -Q+Q = 0。
P = Q :如果P和Q是同一个点的话, 那存在多条线穿过这“两个”点。如果把Q看作是无限接近P的过程,可以看出,穿过P和Q的是椭圆曲线在P点的切线。如果切线和椭圆曲线相交的点为R,则 P+P+R = 0,P++ = 2P = -R

在选择椭圆曲线时,密码学家会考虑曲线的具体参数,如曲线的阶(n)、基点(G)、以及相关的数学难题的难度等。这些参数的选择直接影响到算法的安全性。因此,密码学家会通过严格的数学分析和安全审计来证明这些曲线的安全性,确保在实际应用中能够提供足够的安全保障‌;
为了确保加密通信的安全性,应该选择经过密码学家证明具备安全性的椭圆曲线方程

模运算法则
除法运算
(a/b)%m = ?
设定 (a/b)%m = x %m 变成 求 x 的值
(a/b)%m = x %m <=> a %m = (b * x) %m

负数 -a %m = (-a+km) %m 加k倍m 使 -a+km 值为正数
eg: 求 1/3 mod23 = ?
假如 1/3 mod 23 = x mod 23 成立
那么 1 mod 23 = 3 x mod 23 ## numa = 1 m=23,b= 3 ,xmax for循环的最大数
穷求 x = 1 到 1000 ,先设定个范围
3 * x mod 23 = 1
x=8
求 -1/3 mod 23 = ?
假如 -1/3 mod 23 = x mod 23 成立
1 mod 23 = -3 * x mod23
1mod 23 = -3 mod23 * x mod23
1 mod23 = 20 mod 23 * x mod 23
1 mod 23 = 20 * x mod23
x= 15
在这里插入图片描述

上代码

package main

import "fmt"

func main()  {
	// a/b mod m  假如    a/b mod m = x mod m   //x  为a/b mod m 的结果
	// a mod m   =  b x mod m
	//x 取一个最大范围,穷举 算出最小值
	numa ,m,b,xmax := 0,0,0,0
	for ;; {

		fmt.Printf("please input a,mod,b ,xmax:")
		if _,err := fmt.Scan(&numa ,&m,&b,&xmax);err !=nil{
			fmt.Printf("input error")
			break

		}
		if m <=0{
			fmt.Printf("input error2")
			break
		}

		/
		//处理负数
		// a mod m  = -b * x  mod m
		// a mod m  = (-b+m) mod m *  x mod m   // -b+m 加到为正数为止可以加n个m
		if numa < 0  || b < 0{
			flag := 0
			for ;; {
				if numa < 0 {
					numa += m
				}else{
					flag |= 1
				}
				if b < 0 {
					b += m
				}else{
					flag |= 2
				}
				if flag  == 3 {
					fmt.Printf("new a=%v new b=%v \n",numa,b)
					break
				}
			}
		}
		/

		bf := false
		for i:=1;i<xmax;i++{
			if b*i %m == numa {
				bf = true
				fmt.Printf("x=%v \n",i)
				break
			}
		}
		if !bf{
			fmt.Printf("[not found]x=%v",-1)
		}

	}
}

求模代码

package main

import (
	"fmt"
	//"strconv"
)

func main()  {
	valuea ,primenum := 0,0
	//fmt.Printf("prime number:%v \n",primenum)
	for ;; {

		fmt.Printf("please input value  and  prime:")
		if _,err := fmt.Scan(&valuea,&primenum);err !=nil{
			fmt.Printf("input error")
			break

		}
		m := valuea%primenum
		if m < 0 {
			m += primenum
		}
		fmt.Printf("%v mod %v =%v(%v) \n",valuea,primenum,valuea%primenum,m)
	}

	fmt.Printf("ready exit \n")

}

除法运算
(a/b)%m = ?
设定 (a/b)%m = x %m 变成 求 x 的值
(a/b)%m = x %m <=> a %m = (b * x) %m

负数 -a %m = (-a+km) %m 加k倍m 使 -a+km 值为正数
在这里插入图片描述

椭圆曲线:y2 = x3+ x + 1 mod 23 //简单点 a=1 b=1
有点集 (0,1) (0,22)
(1,17)(1,16)
(3,10)(3,13)
(4,0) 这个说明下 43 +4+1 = 69 %23 = 0 所以 y = 0 (4,23)=(4,0)//自身对称 没有(4,23)
(5,4) (5,19)
点 相对与 y = 23/2 这条直线 对称
在这里插入图片描述

这里 设定为 mod 23 G点 (0,1)
2G = G+G P=G Q=G (6,19)
3G = G+2G (3,13)
4G= 2G+2G 或 G+3G (13,16)
6G= 3G+3G (7,11)

在这里插入图片描述
上图的4G 参数有问题,这里重写了
在这里插入图片描述
在这里插入图片描述

再上个6G的
在这里插入图片描述

椭圆曲线加解密算法原理
建立基于椭圆曲线的加密机制,需要找到类似RSA质因子分解或其他求离散对数这样的难题。而椭圆曲线上的已知G和xG求x,是非常困难的,此即为椭圆曲线上的的离散对数问题。此处x即为私钥,xG即为公钥。
椭圆曲线加密算法原理如下:

椭圆曲线公钥密码的关键和难点是快速计算椭圆曲线的阶(有理点的个数),椭圆曲线的阶在很大程度上决定了其
安全性。计算椭圆曲线的阶的算法主要有SCHOOF算法、SEA算法、Satoh算法和AGM算法

参考 https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum
type CurveParams struct {
P *big.Int //% p中的p
N *big.Int //基点的阶,如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的阶
B *big.Int //曲线方程中常数b,如y² = x³ - 3x + b
Gx, Gy *big.Int //基点G(x,y)
BitSize int //基础字段的大小
Name string //椭圆曲线的名称
}
在这里插入图片描述

func initP224() {
	// See FIPS 186-3, section D.2.2
	p224.CurveParams = &CurveParams{Name: "P-224"}
	p224.P, _ = new(big.Int).SetString("26959946667150639794667015087019630673557916260026308143510066298881", 10)
	p224.N, _ = new(big.Int).SetString("26959946667150639794667015087019625940457807714424391721682722368061", 10)
	p224.B, _ = new(big.Int).SetString("b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4", 16)
	p224.Gx, _ = new(big.Int).SetString("b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", 16)
	p224.Gy, _ = new(big.Int).SetString("bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34", 16)
	p224.BitSize = 224

	p224FromBig(&p224.gx, p224.Gx)
	p224FromBig(&p224.gy, p224.Gy)
	p224FromBig(&p224.b, p224.B)
}

func initP384() {
	// See FIPS 186-3, section D.2.4
	p384 = &CurveParams{Name: "P-384"}
	p384.P, _ = new(big.Int).SetString("39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319", 10)
	p384.N, _ = new(big.Int).SetString("39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643", 10)
	p384.B, _ = new(big.Int).SetString("b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef", 16)
	p384.Gx, _ = new(big.Int).SetString("aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", 16)
	p384.Gy, _ = new(big.Int).SetString("3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", 16)
	p384.BitSize = 384
}

func initP521() {
	// See FIPS 186-3, section D.2.5
	p521 = &CurveParams{Name: "P-521"}
	p521.P, _ = new(big.Int).SetString("6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151", 10)
	p521.N, _ = new(big.Int).SetString("6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449", 10)
	p521.B, _ = new(big.Int).SetString("051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00", 16)
	p521.Gx, _ = new(big.Int).SetString("c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", 16)
	p521.Gy, _ = new(big.Int).SetString("11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", 16)
	p521.BitSize = 521
}

设私钥、公钥分别为k、K,即K = kG,其中G为G点。基点G的阶数n(即nG = O)
选择一个私有密钥k(k<n)n 是一轮
公钥加密: 选择随机数r,将消息M生成密文C,该密文是一个点对 C1,C2
C1=M+rK C2 = rG
私钥解密:C1-kC2 = M + rK - k(rG) = M + r(kG) - k(rG) = M 其中k、K分别为私钥、公钥。

椭圆曲线签名算法原理
 椭圆曲线签名算法,即ECDSA。
 设私钥、公钥分别为k、K,即K = kG,其中G为G点。
 私钥签名:
 1、选择随机数r,计算点rG(x, y)。
 2、根据随机数r、消息M的哈希h、私钥k,计算s = (h + kx)/r。
 3、将消息M、和签名{rG, s}发给接收方。

公钥验证签名:
 1、接收方收到消息M、以及签名{rG=(x,y), s}。
 2、根据消息求哈希h。
 3、使用发送方公钥K计算:hG/s + xK/s,并与rG比较,如相等即验签成功。

原理如下:
  hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s
  = r(h+xk)G / (h+kx) = rG
  
eg:加解密
//a,b,p,x
椭圆方程E = y2 = x3+x+1 mod 23
a=1 b=1 p=23

选择 G点 (3,10)
0G(0) 1G(3,10) 2G(7,12) 3G(19,5) 4G(17,3) 5G(9,16) 6G(12,4) 7G(11,3) 8G(13,16)
9G(0,1) 10G(6,4) 11G(18,20) 12G(5,4) 13G(1,7) 14G(4,0) 15G(1,16) 16G(5,19) 17G(18,3)
18G(6,19) 19G(0,22) 20G(13,7) 21G(11,20) 22G(12,19) 23G(9,7) 24G(17,20) 25G(19,18) 26G(7,11) 27(3,13) 后面开始循环了
28G(0),29G = 1G(3,10)30G(7,12)31G(19,5) 32G(17,3)
网上抄的别人的图 来源 https://www.cnblogs.com/Yumeka/p/7392505.html
在这里插入图片描述

计算可得27G=-G=(3,13) 所以28G=O ∞ G的阶为28 这些点做成了一个循环阿贝尔群,其中生成元为G,阶数为29

G阶数n 这里 29
私钥 k = 2 < n 那么 K=2G= (6,19) //为了好手算,选择小的数
加密过程
把 E,K,G (公钥基本信息) 加密 明文
将明文 编码到曲线上的一点M(编码方法略),产生一个随机整数 r<n
这里假如r=4,加密的信息19(x坐标) 得到一个点(19,5) 或 (19,18)
这里用 M (19,5)
C1= M+rK 查表知 (19,5) 3G
= 3G+4(2G) = 11G (18,20)
或 用公式算也可以 (19,5) +(13,16) = (18,20)
C2 = rG = 4G(17,3)
得到C1 C2 点对后
解密 用到私钥
因为 K = kG
理论 C1-kC2 = M+r(kG)-k(rG) = M
C1-kC2 = (18,20)- 2(4G)=(18,20)-8G(13,16) 可以直接查表 (18,20)11G +(13,7) 20G =31G(19,5)
=(18,20)+(13,-16) = (18,20)+(13,7) = (19,5) == M

在这里插入图片描述
椭圆曲线的 怎么计算 阶 子群阶,明文嵌入曲线点 放到下章补充

如果觉得有用,麻烦点个赞,加个收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知乎知+和信息流广告报价,知乎推广多少钱?

知乎作为中国领先的问答社区&#xff0c;凭借其高质量的内容和庞大的用户群体&#xff0c;已成为众多品牌竞相追逐的营销高地。如何在知乎平台上精准投放广告&#xff0c;实现品牌价值的最大化&#xff0c;成为了众多企业面临的难题。云衔科技&#xff0c;作为数字化营销解决方…

基于MATLAB的涡流函数方法案例+代码

前言 这里介绍一下相关理论和代码----基于MATLAB使用伪谱离散化 三阶龙格库塔时间积分实现涡流函数方法的CFD案例 1. 代码详解 这段 MATLAB 代码实现了一个二维湍流模拟&#xff0c;使用伪谱法在周期性边界条件下解算非线性涡度-流函数方程&#xff1a; M 256; % number o…

驱动开发系列14 - Wayland 详解

目录 一:概述 二:操作系统如何支持 Wayland 三:显卡驱动如何支持 Wayland 四:Wayland 协议介绍 一:概述 Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因…

SpringBoot项目中mybatis执行sql很慢的排查改造过程(Interceptor插件、fetchSize、隐式转换等)

刚入职公司&#xff0c;就发现公司项目跑sql特别慢&#xff0c;差不多一万条数据插入到数据库要5秒以上&#xff08;没有听错&#xff0c;就是这个速度&#xff09;&#xff0c;查询修改删除也是特别慢。直到22年年底实在是受不了了&#xff0c;我就去排查了一下。 用的是Oracl…

大模型之二十八-语音识别Whisper进阶

在上一篇博客大模型之二十七-语音识别Whisper实例浅析中遗留了几个问题&#xff0c;这里来看一下前两个问题。 1.如果不是Huggingface上可以下载的数据该怎么办&#xff1f; 2.上面的代码是可以训练了&#xff0c;但是训练的时候loss真的会和我们预期一致吗&#xff1f;比如如下…

【netty系列-08】深入Netty组件底层原理和基本实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

第一个go程序

package main import "fmt" func main(){fmt.Println("Hello World") }hello.go所在目录 运行go程序

美团代付多模版三合一源码 附教程

简介 美团代付多模版三合一源码 附教程 界面

这一轮医疗数字化,沃可趣以医疗专业人员交流成长为中心

沃可趣看见医疗行业人员需求痛点&#xff0c;量身打造数字服务平台&#xff0c;促进知识分享&#xff0c;赋能活动组织。 从电子病历的普及到远程医疗的兴起&#xff0c;从人工智能辅助诊断到大数据在医疗管理中的应用&#xff0c;科技进步正在大力推动医疗领域的发展。然而&a…

Ubuntu系统本地搭建WordPress网站并一键发布内网站点至公网实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

嵌入式技术文件、学习资料、在线工具、学习网站、技术论坛,非常全面的分享~~~

一、数据手册查询及下载网站 1、【ALLDATASHEET 自称是最大的在线电子元件数据的搜索引擎】ALLDATASHEETCN.COM - 电子元件和半导体及其他半导体的数据表搜索网站。电子元件和半导体, 集成电路, 二极管, 三端双向可控硅 和其他半导体的https://www.alldatasheetcn.com/ 2、【…

defineProps、defineEmits、 defineExpose的TS写法

小满视频 1 defineProps&#xff1a;父向子传递数据 作用&#xff1a;父组件向子组件传递数据 1.1 传递纯类型参数的方式来声明 父组件中的代码&#xff1a; 父组件App.vue <template><div><span>传递给子组件的响应式数据&#xff1a;</span>&l…

【循环顺序队的实现】

1.队列的逻辑结构 与 抽象数据类型定义 先进先出的线性表 在顺序队列中&#xff0c;我们使用头指针front指向队首元素&#xff1b;用尾指针rear指向队尾元素的下一个位置&#xff08;当然这里的指针是用下标模拟出来的&#xff09; 同时顺序队列中的元素当然是用数组来存储的 …

【系统架构设计】嵌入式系统设计(1)

【系统架构设计】嵌入式系统设计&#xff08;1&#xff09; 嵌入式系统概论嵌入式系统的组成硬件嵌入式处理器总线存储器I/O 设备与接口 软件 嵌入式开发平台与调试环境交叉平台开发环境交叉编译环境调试 嵌入式网络系统嵌入式数据库管理系统实时系统与嵌入式操作系统嵌入式系统…

【Qt笔记】QToolButton控件详解

目录 一、前言 二、QToolButton的基本特性 2.1 图标和文本 2.2 自动提升 2.3 下拉菜单 2.4 工具提示 2.5 弹出模式 三、高级功能 3.1 自定义大小与形状 3.2 检查框与单选按钮 3.3 动画效果 四、常用方法与信号槽 常用方法 信号槽 五、实际应用示例 说明 六、总…

ESP32 CYD 使用 LVGL 在屏幕上显示图像 | Random Nerd Tutorials

在本指南中&#xff0c;你将学习如何使用LVGL在ESP32 Cheap Yellow Display (CYD) 板上处理和加载图像。ESP32将使用Arduino IDE进行编程。 对ESP32 Cheap Yellow Display不熟悉&#xff1f; 从这里开始&#xff1a;开始使用ESP32 Cheap Yellow Display Board – CYD (ESP32-2…

线性代数 第三讲 线性相关无关 线性表示

线性代数 第三讲 线性相关无关 线性表示 文章目录 线性代数 第三讲 线性相关无关 线性表示1.向量运算1.线性相关与线性无关1.1 线性相关与线性无关基本概念 2.线性表示&#xff08;线性组合&#xff09;3.线性相关无关与线性表示的定理大总结3.1 向量β可由向量组线性表出的同义…

心觉:潜意识显化很简单,只是很多人想复杂了

很多人知道潜意识的力量很大&#xff0c;是意识力量的30000倍以上 也知道该怎么显化自己的潜意识 但是就是做不到 这就像很多肥胖的人知道运动可以减肥 知道减肥之后就可以穿漂亮的衣服 知道减肥之后自己有多帅多美 但是就是迈不开腿 根本原因是你的潜意识和意识上的认知不…

RenderMan v26.2更新内容!云渲染平台支持新版本

皮克斯的最新RenderMan v26.2版本带来了一系列激动人心的新特性和改进&#xff0c;进一步巩固了其在高端渲染领域的领导地位&#xff0c;为艺术家们提供了更丰富的创意工具和更流畅的工作流程。作为老牌的云渲染农场&#xff0c;瑞云依然支持新版本的使用。 RenderMan v26.2更新…

移动端视频编辑SDK解决方案,关键帧曲线塑造生动效果

美摄科技&#xff0c;作为移动视频编辑技术的领航者&#xff0c;携其革命性的移动端视频编辑SDK解决方案&#xff0c;正以前所未有的创新力&#xff0c;为视频创作者们开启了一扇通往无限创意的大门。 重塑视频编辑体验&#xff0c;让创意触手可及 美摄科技的移动端视频编辑S…