jjzjj

A New Elliptic Curve Based Analogue of RSA

tr0uble 2023-03-28 原文

refer: A New Elliptic Curve Based Analogue of RSA

椭圆曲线

令 p 和 q 是素数,都大于3。并且满足\(4a^3 + 27b^2 \not\equiv 0 \pmod{p}\)。用\(E_p(a, b)\)表示模p参数为a,b的椭圆曲线。\(y^2 \equiv x^3 + ax + b \pmod{p}\)

椭圆曲线的加法计算定义为

\[P+Q=R \tag 1 \]

\(P=(x_1, y_1),Q=(x_2,y_2),R=(x_3, y_3)\)

\[x3 \equiv \lambda^2-x_1-x_2 \mod{p} \tag 2 \]

\[y_3\equiv \lambda(x_1-x_3) - y_1 \pmod{p} \]

\[\lambda \equiv \begin{cases} \frac{y_1-y_2}{x_1-x_2} & if x_1 \not\equiv x_2 \pmod{p} \\ \\ \frac{3x_1^2 + a}{2y_1} & ifx1=x2 \pmod{p} \end{cases} \]

椭圆曲线的阶8表示为

\[|E_p(a, b)| = 1 + \sum_{x=1}^p((\frac{z}{p}) + 1) \]

\((\frac{z}{p})\)是椭圆曲线的勒让德符号,\(z\equiv x^3 + ax + b\pmod{p}\)。勒让德符号的值为1, 0, -1。

很容易证明:

(1) y有两个值对于一个x,当z是关于p的一个二次剩余

(2) y 有一个值对于一个x,当\(z \equiv 0 \pmod{p}\)

(3) y 不存在对于一个x, 当z是关于p的一个二次非剩余

对一个很大的p使用这个方法显然是不够有效的。更加有效的计算椭圆曲线的阶的算法是Schoof's algorithm,在 维基百科 中也介绍了很多算法,但这篇主要是介绍A New Elliptic Curve Based Analogue of RSA这个密码系统就不多描述了。

一个很重要的定理是Hasses 定理。令\(E\)是定义在\(F_p\)上的椭圆曲线,\(E\)上的点的数量也就是\(E\)的阶满足

\[|p+1-\#E(F_p)| \leq 2 \sqrt{q} \]

其中\(\#E(F_p)\)表示椭圆曲线\(E\)的阶。有了Hasses定理,可以定义

\[|E_p(a,b)|=p+1+\alpha, \quad where\ |\alpha| \leq 2\sqrt{p} \]

椭圆曲线的互补群

令p是一个素数,a, b是椭圆曲线\(E_p(a, b)\)的参数。用\(E_p(a,b)\)来表示满足

\[y^2\equiv x^3+ax+b \]

的所有整数对\((x,y)\),但y是非负整数。即y可以表示成

\[y\equiv u\sqrt{v} \pmod{p} \]

u是一个非负整数,v是模p的一个二次非剩余定值。比如有\((x_1, y_1)=(x_1, u_1\sqrt{v})\)

\((x_2, y_2)=(x_2,u_2\sqrt{v})\)

互补群的阶被这样给出

\[|\overline{E_p(a,b)}|=1+\sum_{x=1}^p(1-(\frac{z}{p})) \]

运用Hasses定理

\[|\overline{E_p(a,b)}|=p+1-\alpha \]

加密解密

选择两个素数p, q。令n=pq。在\(Z_n\)上选择一个椭圆曲线。椭圆曲线的参数满足

\[\gcd(4a^3+27b^2, n)=1 \]

\[|E_p(a,b)|=p+1+\alpha,|\overline{E_p(a,b)}|=p+1-\alpha \\ |E_q(a,b)|=p+1+\beta,|\overline{E_q(a,b)}|=p+1-\beta \]

将明文编码成坐标(x, y)的横坐标x。\(y\equiv \sqrt{x^3+ax+b} \pmod{n}\) ,注意开根是在模n的意义下开根。

加密表示为

\[(s,t)\equiv (x,y)*e \pmod{n} \]

s为密文。

解密表示为i

\[(x,y)\equiv (s, t)*d_i \pmod{n} \]

其中e和d的选择

\[w\equiv s^3+as+b \pmod{n} \]

但这篇论文很奇怪的地方在,如果要确定e,那么要知道N,N是从w的值来决定是那种情况,可是还没加密呢,哪来的s,哪来的w?后来查阅资料找到了另一种确定e的方法

这里就非常的清楚\(gcd(e, (p^2-tp^2)(q^2-tq^2))=1\)\(t_p=-\alpha,t_q=-\beta\)

虽然是椭圆曲线问题,但是此密码的安全性仍然是基于大整数分解和计算椭圆曲线阶的难题。与RSA相似。

Example

from sage.all import *
from sage.all_cmdline import *
from Crypto.Util.number import *
from sympy import nthroot_mod

Nbits = 256

plaintext = bytes_to_long(b"hello world")

def gen_pubkey(p, q):
    n = p*q

    a = getRandomInteger(Nbits // 2)
    b = getRandomInteger(Nbits // 2)

    assert gcd(4*a**3 + 27*b**2, n) == 1
    
    e = getPrime(256)
    orderp = EllipticCurve(GF(p), [a, b]).order()
    orderq = EllipticCurve(GF(q), [a, b]).order()
    tp = p + 1 - orderp
    tq = q + 1 - orderq
    assert gcd(e, (p**2 - tp**2)*(q**2 - tq**2))

    public_key = (n, a, b, e)
	
    return public_key

def gen_prikey(cipher, p, q, a, b, tp, tq):
    cx = cipher[0]
    u = cx**3 + a*cx + b % n
    up = legendre_symbol(u, p)
    uq = legendre_symbol(u, q)
    assert up == uq == 1
    d = inverse_mod(e, lcm(p+1-tp, q+1-tq))

    return d

p, q = getPrime(Nbits), getPrime(Nbits)
n, a, b, e = gen_pubkey(256)
ciphertext = e * plaintext

print("public key:")
print(f"n = {n}\na = {a}\nb = {b}\ne = {e}")
print("cipher:")
print(ciphertext)

orderp = EllipticCurve(GF(p), [a, b]).order()
orderq = EllipticCurve(GF(q), [a, b]).order()
tp = p + 1 - orderp
tq = q + 1 - orderq

d = gen_prikey(ciphertext, p, q, a, b, tp, tq)

m = d * ciphertext
print(long_to_bytes(int(m[0])))

有关A New Elliptic Curve Based Analogue of RSA的更多相关文章

  1. go - 如何设置 SA_ONSTACK 标志 - 2

    我的Go应用程序连接到IBMMQ。当我的应用程序抛出分段违规错误(信号SIGSEGV)时,IBMMQ注册的信号处理程序使我的应用程序抛出“没有SA_ONSTACK标志的非Go代码设置信号处理程序”。那么我该如何设置那个标志呢?我的代码packagemainimport("fmt""github.com/ibm-messaging/mq-golang/ibmmq")typeAstruct{Strstring}typeBstruct{Apointer*A}funcmain(){connectIBMMQ()b:=B{}fmt.Println(b.Apointer.Str)}const(QMg

  2. sql-server - 无法使用 'sa' 连接到远程 SQLServer - 2

    我正在尝试使用我正在编写的Go程序的连接字符串连接到SQLServer的远程实例。我有一个具有相同用户的远程数据库的本地版本。如果我使用这样的连接字符串连接到我的本地数据库,它工作得很好:DataSource=localhost;InitialCatalog=master;UserId=;Password=;现在,如果我使用相同的凭据,但我只是更改数据源,它也能正常工作:DataSource=;InitialCatalog=master;UserId=;Password=;现在,如果我尝试使用“sa”登录,它可以在本地运行,但不能远程运行。这很好用:DataSource=localho

  3. c# - 如何抑制 StyleCop 错误 SA0102 : CSharp. CsParser:使用泛型类型参数属性时在文件中发现语法错误 - 2

    具有以下具有泛型类型参数属性的C#代码:[System.AttributeUsage(System.AttributeTargets.GenericParameter)]publicclassGenericParameterAttribute:System.Attribute{}publicclassGenericClass{}打开StyleCop集成(在.csproj文件中导入StyleCop.targets)StyleCop返回错误且编译失败:Error1SA0102:CSharp.CsParser:Asyntaxerrorhasbeendiscoveredinfile...没有在

  4. SE、ECA、CA、SA、CBAM、ShuffleAttention、SimAM、CrissCrossAttention、SK、NAM、GAM、SOCA注意力模块、程序 - 2

    SE、ECA、CA、SA、CBAM、ShuffleAttention、SimAM、CrissCrossAttention、SKAttention、NAMAttention、GAMAttention、SOCA注意力模块、程序文章目录SE、ECA、CA、SA、CBAM、ShuffleAttention、SimAM、CrissCrossAttention、SKAttention、NAMAttention、GAMAttention、SOCA注意力模块、程序1、SE通道注意力2、ECA通道注意力3、CA通道注意力4、SA空间注意力5、CBAM(通道注意力和空间注意力)6、ShuffleAttention

  5. Segment Anything论文翻译,SAM模型,SAM论文,SAM论文翻译;一个用于图像分割的新任务、模型和数据集;SA-1B数据集 - 2

    【论文翻译】-SegmentAnything/Model/SAM论文论文链接:https://arxiv.org/pdf/2304.02643.pdfhttps://ai.facebook.com/research/publications/segment-anything/代码连接:https://github.com/facebookresearch/segment-anything论文翻译:http://t.csdn.cn/nnqs8https://blog.csdn.net/leiduifan6944/article/details/130080159文章目录【论文翻译】-Segmen

  6. c++ - 什么是 sa_family_t - 2

    我正在关注Beej'sGuidetoNetworkProgramming,并且我使用的是VC++2010,但是当我将结构复制粘贴到我的程序中时,某些类型会作为不正确的标识符出现。例如:u_int32_t就是这样出现的,经过一些搜索我发现这些是C语言大约1999年的旧类型。我本可以包含stdint.h,但这需要我记住它们的意思。相反,我使用了标准的int,它是32位长(4字节),而对于其他的64位长(8字节),我使用了longlongint.无论如何,我正在缩小我的最后一个语法错误,它说sa_family_t是一个无效的标识符。我不知道它应该是什么,搜索也没有任何结果。那是我的问题,我不

  7. SpringBoot 使用 Sa-Token 完成权限认证 - 2

    一、设计思路所谓权限认证,核心逻辑就是判断一个账号是否拥有指定权限:有,就让你通过。没有?那么禁止访问!深入到底层数据中,就是每个账号都会拥有一个权限码集合,框架来校验这个集合中是否包含指定的权限码。例如:当前账号拥有权限码集合["user-add","user-delete","user-get"],这时候我来校验权限"user-update",则其结果就是:验证失败,禁止访问。动态演示图:所以现在问题的核心就是:如何获取一个账号所拥有的的权限码集合?本次操作需要验证的权限码是哪个?接下来,我们将介绍在SpringBoot中如何使用Sa-Token完成权限认证操作。Sa-Token是一个轻量

  8. android - 警告 : linker: libvc1dec_sa. ca7.so 有文本重定位。这是在浪费内存并且存在安全风险。请修复 - 2

    我正在编写这个Android应用程序,突然间它现在无法启动。好吧,它会说:[Yourapp]hasclosedunexpectedly奇怪的是它在logcat中没有显示任何错误消息。我看到的唯一消息是:WARNING:linker:libvc1dec_sa.ca7.sohastextrelocations.Thisiswastingmemoryandisasecurityrisk.Pleasefix.所以我做了一些搜索并发现了这个:mylib.sohastextrelocations.Thisiswastingmemoryandisasecurityrisk.Pleasefix但那是在

  9. python - 让 pylint 在 pylons/SA 模型中查找继承方法时遇到问题 - 2

    我有一个Pylons应用程序,我正在为其使用SqlAlchemy声明性模型。为了使代码更简洁一些,我在SABase上添加了一个.query并从中继承了我的所有模型。所以在我的app.model.meta中有Base=declarative_base()metadata=Base.metadataSession=scoped_session(sessionmaker())Base.query=Session.query_property(Query)我认为将其继承到app.model.mymodel中并将其声明为meta.Base的子项。这让我可以将查询写为mymodel.query.f

  10. c# - sa1200 是否所有 using 指令都必须放在命名空间 (StyleCop) 内纯粹是装饰性的? - 2

    这个问题在这里已经有了答案:关闭13年前。PossibleDuplicate:ShouldUsingsbeinsideoroutsidethenamespacesa1200所有using指令必须放在命名空间(StyleCop)内这只是为了代码的可读性还是这样做有任何实际好处?它以某种方式帮助GC吗?

随机推荐