【网络安全】【密码学】常见数据加(解)密算法及Python实现(二)、椭圆曲线密码ECC

本文介绍椭圆曲线密码及其Python实现。

一、实验目的

1、 掌握椭圆曲线上的点间四则运算和常见的椭圆曲线密码算法
2、 了解基于ECC的伪随机数生成算法和基于椭圆曲线的商用密码算法。

二、算法原理

1、算法简介

椭圆曲线密码学(Elliptic Curve Cryptography,ECC)是一种基于椭圆曲线数学的公开密钥加密算法。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
ECC的主要优势是在某些情况下它比其他的算法(比如RSA加密算法)使用更小的密钥并提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。

2、椭圆曲线的数学原理

椭圆曲线(ECC)可以用下述方程表示
y^^2 = x^^3 + ax + b,其中a、b是实数,椭圆曲线记为E(a,b)。由方程可知,每一条椭圆曲线都关于x轴对称。
1、加法(+):
为了在群上定义加法,参数a和b需要满足不等式4a^^3 + 27b^^2 ≠ 0.加法的运算规则为:若椭圆曲线上的3个点在同一条直线上,则它们的和为O(无穷远点)。
2、减法(-):
点P的负元定义如下:
点P(x,y)的负元是具有相同x坐标和相反的y坐标的点,即若P = (x,y),则-P = (x, -y)。则P和-P可用一条垂直的线连接起来,且P + (-P) = P – P = 0.
P – Q = P + (-Q)。
3、数乘
n为非负整数,则nP = P + …… + P(n个P相加)。
4、除法
m为非负整数,则P / m = P * m^^-1,其中m-1为m在模p下的逆元。

3、椭圆曲线加密原理

首先,将要发送的消息明文m编码为形为(x,y)的点Pm,并对点Pm进行加密和其后的解密。加/解密系统需要点G和椭圆群参数(p,a,b)。用户A悬念则一个私钥nA,并产生公钥PA = nA * G. A随机选择一个正整数k,并产生密文Cm,该密文时一个点对
Cm = {kG, Pm + kPB},其中PB为B的公钥。B在对密文解密时,则需用第二个点减去第一个点与B的私钥之积,得到消息Pm。
算法流程由下图简要表示:
在这里插入图片描述

三、算法实现

1、Python代码

文件1ecc.py,定义椭圆曲线上的运算
文件内容:

# 加法
def add(xp, yp, xq, yq, a, b, p):  # 计算(Zp上的)椭圆曲线上两点P(xp, yp)和Q(xq, yq)的和
    if (4 * (a ** 3) + 27 * (b ** 2)) % p == 0:
        print('不能形成abel群')
        return
    else:
        if yp + yq == 0:
            print('infinity')
            return
        else:
            if (xp == xq) and (yp == yq):
                delta = (3 * (xp ** 2) + a) * inverse((2 * yp), p) % p
                xr = (delta ** 2 - xp - xq) % p
                yr = (-yp + delta * (xp - xr)) % p
                return xr, yr
            else:
                delta = (yq - yp) * inverse((xq - xp), p) % p
                xr = (delta ** 2 - xp - xq) % p
                yr = (-yp + delta * (xp - xr)) % p
                return xr, yr

# 减法
def sub(xp, yp, xq, yq, a, b, p):
    return add(xp, yp, xq, -yq, a, b, p)

# 乘法
def mul(n, xp, yp, a, b, p):
    ans_x = xp
    ans_y = yp
    for i in range(0, n - 1):
        (ans_x, ans_y) = add(ans_x, ans_y, xp, yp, a, b, p)
    return ans_x, ans_y

# 求逆
def inverse(a, p):
    for i in range(1, p):
        if ((i * a) % p) == 1:
            return i

# 除法
def div(n, xp, yp, a, b, p):
    m = inverse(n, p)
    return mul(m, xp, yp, a, b, p)

# 以下为测试
# print(add(-3, 9, -2, 8, 0, -36, 11))
# print(sub(10, 2, 3, 5, 1, 6, 11))
# print(mul(7, 8, 3, 1, 6, 11))
# print(inverse(2, 3))
# print(div(12, 3, 10, 1, 1, 23))

文件2dh.py,用于产生公钥和私钥
文件内容:

from ecc import *


def generateKey_a(na, xg, yg, a, b, p):
    (x_pa, y_pa) = mul(na, xg, yg, a, b, p)
    return x_pa, y_pa


def generateKey_b(nb, xg, yg, a, b, p):
    (x_pb, y_pb) = mul(nb, xg, yg, a, b, p)
    return x_pb, y_pb


def secret_a(na, x_pb, y_pb, a, b, p):
    (xka, yka) = mul(na, x_pb, y_pb, a, b, p)
    return xka, yka


def secret_b(nb, x_pa, y_pa, a, b, p):
    (xkb, ykb) = mul(nb, x_pa, y_pa, a, b, p)
    return xkb, ykb


(xpa, ypa) = generateKey_a(121, 2, 2, 0, -4, 211)
(xpb, ypb) = generateKey_b(203, 2, 2, 0, -4, 211)
(xka, yka) = secret_a(121, xpb, ypb, 0, -4, 211)
(xkb, ykb) = secret_b(203, xpa, ypa, 0, -4, 211)
print('A的私钥:121')
print('B的私钥:203')
print('A的公钥:', xpa, ypa)
print('B的公钥:', xpb, ypb)
print('A产生的秘密钥: ', xka, yka)
print('B产生的秘密钥: ', xkb, ykb)

文件3crypt.py,用于椭圆曲线加、解密
文件内容:

from dh import *


def encrypt(pm_x, pm_y):  # 椭圆曲线加密
    (x_pb, y_pb) = generateKey_b(101, 2, 2, 0, -4, 257)
    k = 41
    (cm1_x, cm1_y) = mul(k, 2, 2, 0, -4, 257)  # Cm1 = kG
    (temp_x, temp_y) = mul(k, x_pb, y_pb, 0, -4, 257)
    (cm2_x, cm2_y) = add(temp_x, temp_y, pm_x, pm_y, 0, -4, 257)
    return cm1_x, cm1_y, cm2_x, cm2_y


def decrypt(cm1_x, cm1_y, cm2_x, cm2_y):  # 椭圆曲线解密
    nb = 101
    (tempx, tempy) = mul(nb, cm1_x, cm1_y, 0, -4, 257)
    (pmx, pmy) = sub(cm2_x, cm2_y, tempx, tempy, 0, -4, 257)
    return pmx, pmy


(cm1x, cm1y, cm2x, cm2y) = encrypt(112, 26)
(pmx, pmy) = decrypt(136, 128, 246, 174)
# (xpb, ypb) = generateKey_b(101, 2, 2, 0, -4, 257)
# print(xpb)
# print(ypb)
# (kpbx, kpby) = mul(41, xpb, ypb, 0, -4, 257)
# print(kpbx)
# print(kpby)
print('加密结果:')
print(cm1x)
print(cm1y)
print(cm2x)
print(cm2y)
print()
print('解密结果:')
print(pmx)
print(pmy)

2、运行测试

经运行,解密结果==明文

在这里插入图片描述

至此,本次实验结束。

四、参考文献

1、《密码编码学与网络安全——原理与实践(第七版)》(Cryptography and Network Security, Principles and Practice, Seventh Edition),【美】威廉 斯托林斯 William Stallings 著,王后珍等 译,北京,电子工业出版社,2017年12月。

2、《密码学实验教程》,郭华 刘建伟等 主编,北京,电子工业出版社,2021年1月。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

conda环境下Torch not compiled with CUDA enabled解决方法

1 问题描述 在运行wav2lip模型训练时&#xff0c;报如下错误&#xff1a; Traceback (most recent call last):File "D:\ml\Wav2Lip\preprocess.py", line 32, in <module>fa [face_detection.FaceAlignment(face_detection.LandmarksType._2D, flip_inputF…

[Oracle][详细] Win完全卸载Oracle

前提准备 进入服务 找到Oracle开头的服务 将这些服务全部停止 Top 1 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击【Universal Installer】 Top 2 点击之后稍等一会然后会进入进入下图界面,点击卸载产品 Top 3 选中要删除的Oracle产品,然后点击【删除】 Top 4 进…

清晰讲解Cookie、Session、Token、JWT之间的区别

文章目录 什么是认证(Authentication)什么是授权(Authorization)什么是凭证(Credentials)什么是Cookie什么是SessionSession的痛点 Cookie 和 Session 的区别什么是Token(令牌)Acesss TokenRefresh Token Token 和 Session 的区别Token 与 Cookie什么是 JWT生成JWTJWT 的原理JW…

指导AI进行推理:提示工程如何弥补RAG系统中的差距

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research) 原文标题:Instructing AI to Reason: How Prompt Engineering Bridges the Gap in RAG Systems 原文地址:https://medium.c…

ROS---激光雷达的使用

ROS—激光雷达的使用 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&#xff0c;是机器人感知外界的一种重要手段。本文将介绍在ROS下使用激光雷达传感器&#xff0c;我们选用的激光雷达型号为思岚A1。 使用流程如下: 硬件准备&#xff1b;软…

如何给字符串字段添加索引

MySQL是支持前缀索引的&#xff0c;可以定义字符串的一部分作为索引&#xff0c;如果创建索引的语句不指定前缀长度&#xff0c;那么索引就会包含整个字符串。 alter table SUser add index index1(email);alter table SUser add index index2(email(6)); 如上两个创建索引的语…

openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题

文章目录 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题194.1 分析查询语句长时间运行的问题194.1.1 问题现象194.1.2 原因分析194.1.3 处理办法 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时…

【python入门】day24:千年虫问题、京东购物流程、根据星座测试性格特点

千年虫 yList[82,17,73,56,84,0,99] print(原列表&#xff1a;,yList) for index,val in enumerate(yList):yList[index]2000 if val0 else 1900 print(更改后列表&#xff1a;,yList) yList.sort() print(排序后列表&#xff1a;,yList)enumerate的作用&#xff1a;会把列表中…

[金融支付]EMV是什么?

文章目录 EMVCoEMVCo是谁&#xff1f;EMVCo是做什么的&#xff1f;EMVCo是如何运作的&#xff1f;EMVCo 是否强制要求 EMV 规范&#xff1f; EMVEMV的历史背景EMV技术的一些关键点 EMV TechnologiesEMV 认证EMV的三层认证 EMV规范在全球各地存在差异参考 EMVCo EMVCo是谁&…

Kafka的简介及架构

目录 消息队列 产生背景 消息队列介绍 常见的消息队列产品 应用场景 消息队列的消息模型 Kafka的基本介绍 简介 Kafka的架构 Kafka的使用 Kafka的shell命令 Kafka的Python API的操作 完成生产者代码 完成消费者代码 消息队列 产生背景 消息队列:指数据在一个容器…

C# 微信小程序获取群id

前提 有个需求&#xff0c;需要限制小程序的抽奖只能在某个群内&#xff0c;需要知道谁在群里面&#xff0c;但是微信并没有提供谁在群里面的方法&#xff0c;不过提供了获取群id的方法&#xff0c;这样加上限制分享就能保证群里的参加&#xff0c;即时分享出去了&#xff0c;…

Vue3 中使用 Vuex 和 Pinia 对比之 Vuex的用法

本文基于 Vue3 的 composition API 来展开 Vuex 和 Pinia 的用法比较 Pinia传送门 Vuex传送门 Vuex 状态管理的核心概念 状态- 驱动应用的数据源&#xff1b;视图 - 以声明方式将状态映射到视图&#xff1b;操作 - 响应在视图上的用户输入导致的状态变化 下面是源自Vuex 官…

每日一题——LeetCode1154.一年中的第几天

方法一 列举法&#xff1a; 用一个数组把每个月份的天数都列举出来 判断闰年&#xff0c;是闰年2月份有29天 循环对当前月份之前的月份天数求和 加上当天月份的天数 var dayOfYear function(date) {let year date.slice(0, 4);let month date.slice(5, 7);let day dat…

第十二章Session

第十二章Session 1.什么是Session2.Session的创建与获取3.session域中数据的存取4.Session超时的控制5.浏览器和session之间关联的技术内幕 1.什么是Session 注意&#xff1a;前面的Cookie是保存在客户端&#xff0c;而session是在服务端的 2.Session的创建与获取 这里Session…

2024几个测试接口的好工具,效率加倍~

作为一名后端程序员&#xff0c;一定要对自己写的接口负责&#xff0c;保证接口的正确和稳定性。因此&#xff0c;接口测试也是后端开发中的关键环节。 但我相信&#xff0c;很多朋友是懒得测试接口的&#xff0c;觉得这很麻烦。一般自己写的接口自己都不调用&#xff0c;而是…

RT-Thread入门笔记4-跑马灯线程实例

RT-Thread操作系统是基于线程调度的多任务系统。 线程状态切换 调度过程是一种完全抢占式的基于优先级的调度算法。 支持8/32/256优先级&#xff0c;其中0表示最高&#xff0c;7/31/255表示最低。最低优先级7/31/255优先级用于空闲线程。 支持以相同优先级运行的线程。 共享时…

如何理解线程池中的参数设计

如何理解线程池中的参数设计 你的线程池的参数怎么配置&#xff1f;线程数量设置多少合理&#xff1f;如何确定一个线程池中的人物已经完成了为什么不建议使用java自带的Executors创建线程池线程池里面的阻塞队列设置多少合理&#xff1f; 考察&#xff1a;了解你对技术的掌握…

springboot摄影跟拍预定管理系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

如何通过 3 个步骤,管理项目可交付成果?

没有可交付成果&#xff0c;就没有项目。无论是构建软件、公寓、汽车还是其他东西&#xff0c;项目工作都可以定义为实现项目可交付成果。 项目管理中的可交付成果 项目可交付成果是项目要实现的最终结果。“可交付成果 "的内容没有限制&#xff0c;可以是实体产品&…

石大版跳一跳(UPC)

题目描述 还记得微信上那个风靡全国的跳一跳小程序吧&#xff0c;估计曾经也受到不少我校同学的喜爱吧。话说唐克也在玩这款游戏&#xff0c;不过&#xff0c;与一般玩家的境界不一样&#xff0c;唐克并不沉迷于游戏&#xff0c;唐克玩游戏是为了开发游戏&#xff0c;作为中国石…