椭圆曲线加密(ECC)明文编码方法及代码实现
编码原理
将m转化为B进制,即
m = m 0 + m 1 B + m 2 B 2 + ⋯ + m N B N (当中 B N + 1 ⩽ n ) m=m_0+m_1B+m_2B^2+\cdots+m_NB^N \text{ (当中}B^{N+1}\leqslant n\text{)} m=m0+m1B+m2B2+⋯+mNBN (当中BN+1⩽n) 椭圆曲线:
E : y 2 ≡ x 3 + a x + b ( m o d p ) E: y^2\equiv x^3+ax+b \text{ } (mod \text{ } p) E:y2≡x3+ax+b (mod p) 将明文m对应到椭圆曲线 E ( F p ) E(\mathbb{F}_p) E(Fp)某点的x坐标值。但是 m 3 + a m + b m^3+am+b m3+am+b为完全平方数的概率为 1 2 \frac{1}{2} 21(不知道这个概率怎么来的)。所以添加若干位在m上,即
m ′ = m K + j ( j = 0 , ⋯ , K − 1 ) m'=mK+j\text{ }(j=0,\cdots,K-1) m′=mK+j (j=0,⋯,K−1) 使 x 3 + a x + b x^3+ax+b x3+ax+b为完全平方数,如此便可对应到 E ( F p ) E(\mathbb{F}_p) E(Fp)上的一点。而失败的概率,即m’无法对应到 E ( F p ) E(\mathbb{F}_p) E(Fp)的概率为 2 − K 2^{-K} 2−K(m可以对应K个m’,每个m’失败的概率为1/2$,全部失败的概率 2 − K 2^{-K} 2−K),其中(m+1)K<p。
而解码 P m P_m Pm=(x,y),只需要
m = ⌊ x K ⌋ m=\lfloor \frac{x}{K} \rfloor m=⌊Kx⌋
示例
E : y 2 ≡ x 3 + 82 x + 502773 ( m o d 502807 ) E: y^2\equiv x^3+82x+502773 \text{ } (mod \text{ } 502807) E:y2≡x3+82x+502773 (mod 502807)
将m="coding"用曲线上的点表达,表达失败概率为 1 2 20 \frac{1}{2^{20}} 2201,所以取K=20。约定编码为:空白=0,a=1,……,z=26,所以有27个符号(看作27进制)
⌊ log 27 502807 20 ⌋ = 3 ( 求 ⌊ log B p K ⌋ ) \lfloor \log_{27}\frac{502807}{20} \rfloor=3 \qquad (\text{求}\lfloor \log_{B}\frac{p}{K} \rfloor) ⌊log2720502807⌋=3(求⌊logBKp⌋) 所以每3个字母区块编码
m = " c o d i n g " = ( m 1 , m 2 ) = ( ( 3 , 15 , 4 ) 27 , ( 9 , 14 , 7 ) 27 ) = ( 2596 , 1047 ) \begin{aligned} m&="coding" \\ &=(m_1,m_2) \\ &=((3,15,4)_{27},(9,14,7)_{27}) \\ &=(2596,1047) \end{aligned} m="coding"=(m1,m2)=((3,15,4)27,(9,14,7)27)=(2596,1047) 以上均为书上内容(见文末参考),但是之后的内容我看不懂了,就直接写我的想法了。
1. 对于 m 1 m_1 m1, x ( P m 1 ) = 20 m 1 = 51920 x(P_{m_1})=20m_1=51920 x(Pm1)=20m1=51920,代入椭圆曲线方程,算出 y 2 ( m o d p ) ≡ 465711 y^2 \text{ } (mod \text{ } p)\equiv 465711 y2 (mod p)≡465711 2. 另外由于 p ≡ 3 ( m o d 4 ) p\equiv 3 \text{ } (mod \text{ } 4) p≡3 (mod 4),计算
y ( P m 1 ) = 46571 1 p + 1 4 ( m o d p ) = 309270 y(P_{m_1})=465711^{\frac{p+1}{4}} \text{ } (mod \text{ } p)=309270 y(Pm1)=4657114p+1 (mod p)=309270 这一步书上写的是错的,我怎么算都算不出来。另外,这步我也看不懂,跟着做就完事了。
3. 验证309270是否是y值,计算
30927 0 2 ( m o d p ) = 465711 309270^2 \text{ } (mod \text{ } p)=465711 3092702 (mod p)=465711 得到曲线点
P m 1 = ( 51920 , 309270 ) P_{m_1}=(51920,309270) Pm1=(51920,309270) 对于 m 2 m_2 m2, x ( P m 2 ) = 20 m 2 + 3 = 20943 x(P_{m_2})=20m_2+3=20943 x(Pm2)=20m2+3=20943,我觉得这个+3是遍历得到的,m’+=1,重复以上的三步并验证。
sage代码实现
怎么把明文字符串和int相互转换就不介绍了(我也不知道在sage里要怎么转换),比如在python里先encode/decode,再Crypto.Util.number库里的bytes_to_long/long_to_bytes就能实现。
# encode int m to a point on E
def curveEncode(m):m *= Kwhile(1):# step 1f = pow(m,3,p)+7 # secp256k1, change it to your curvef = f%p# step 2y = pow(f,(p+1)//4,p) # p+1 because p mod 4 = 3, to be changed# step 3: checkif(f==pow(y,2,p)):return E(m,y) # return the pointm += 1def curveDecode(Pm):m = int(Pm[0])//K # convert Pm[0] into int typereturn m
参考:《密码学——加密演算法》邓安文编著 10.6 将信息转化为椭圆曲线代码
椭圆曲线加密(ECC)明文编码方法及代码实现相关推荐
- 椭圆曲线加密和签名算法
简述 椭圆曲线密码学,简称ECC.是一种建立公开加密的算法,也就是非对称加密.和RSA类似.被公认在给定密钥长度下最安全的加密算法.应用范围很广,主要的三个技术TLS.PGP.SSH都在使用它,特别是 ...
- 转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名...
转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 July 20, 20 ...
- 椭圆曲线加密(ECC)
什么是椭圆曲线加密(ECC)? 比特币使用椭圆曲线算法生成公钥和私钥,选择的是secp256k1曲线.与RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样, ...
- 椭圆曲线加密(ECC)elliptic curves cryptography
前言 ECC英文全称"Ellipse Curve Cryptography" 与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥 ECC164位 ...
- 【密码学Sage代码】椭圆曲线加密/解密(基于《密码编码学与网络安全——原理与实践(第七版)》)
[密码学Sage代码]椭圆曲线加密/解密(基于<密码编码学与网络安全--原理与实践(第七版)>) 教材内容: 实践的Sage代码: #[静水流深Sage代码]使用椭圆曲线密码体制进行加密/ ...
- 椭圆曲线加密(Elliptic Curve Cryptography, ECC)
近年来,国内外的科研人员面向设备资源受到限制的多种场景提出了很多基于ECC的认证密钥协商协议.虽然各协议应用场景不尽相同,但解决的问题和最终的目标都较为类似,可以归纳为在性能开销尽可能小的前提下,安全 ...
- 椭圆曲线加密——椭圆曲线的动态展示python代码分享
学校信息安全课老师让我来讲一下椭圆曲线加密,当看到椭圆曲线公式的时候,就想研究一下改变a或者b会对椭圆曲线的形状带来哪些影响,于是自己搜集一些资料绘制出了随a, b变化的椭圆曲线.a,b使用进度条来改 ...
- python椭圆曲线加密算法_ECC椭圆曲线加密学习笔记
0x00 前言 之前做题的时候遇到一个ECC相关的题目,学习了好几篇大佬的文章ECC的剖析文章,学习之后也记录一下,写一遍加强自己的巩固. 此文章严格意义上来讲应该算是读书笔记,在总结过程中观摩了很多 ...
- Go-ecc加密解密详解与代码
目录 Ecc概述 历史 密钥对生成 加密算法 解密算法 小结 Ecc的Go实现 crypto/ecdsa 包 crypto/elliptic 包 crypto/rand 包 crypto/x509包 ...
最新文章
- GPS定位精度单位CEP、RMS、2DRMS
- linux停止nodejs,node.js – 在linux重启后,nodejs消失了
- mysql分库分表方案之sharding-jdbc使用(非demo示例)
- 【原】TreeView+Checkbox级联操作(IE/FireFox测试通过)
- GCJ 2015-Qualification-B Infinite House of Pancakes 枚举,思路,误区 难度:3
- java学到什么程度才有用处_如何自学Java?Java学到什么程度才可以找工作?
- 文档过期打不开怎么办_标准的产品需求文档在这里!(详细说明版)(2)
- python map lambda表达式_Python的lambda表达式、filter、map、reduce等函数的用法
- ios实例开发精品文章推荐(8.14)
- 001-JavaScript简介
- Java学到什么程度可以找工作?
- 关于嵌入式Linux做底层还是应用,要掌握什么技能
- iOS高阶程序员必修——汇编
- c# 图像识别 车辆型号【百度AI】
- 产品读书《设计心理学1-4》-设计
- 《路由器开发 - 路由器刷机指南》联想Newifi Y1刷机
- Science| 深度解析肠道菌群与肥胖
- 代码赏析:子窗口对于键盘和鼠标的响应
- Error: Canceled future for execute_request message before replies were done
- Spring Boot2 总结(二) Spring Security的基本配置