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

news2024/9/24 21:23:25

本文介绍椭圆曲线密码及其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月。

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

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

相关文章

web学习笔记(九)

目录 1.初识JS(JavaScript) 1.1什么是JavaScript? 1.2HTML5 CSS3 javaScript三者的关系 1.3 JAVAScript的作用 1.4JAVAScript的组成部分 1.5JS注释 1.6补充知识 2.JS的引入方法 2.1行内式 2.2嵌入式(内嵌式) 2.3外链式 3.输入和…

使用docker build构建image

文章目录 环境步骤准备例1:基本用法例2:缓存layer例3:Multi-stage例4:Mountcache mountbind mount 例5:参数例6:Export文件例7:测试 参考 环境 RHEL 9.3Docker Community 24.0.7 步骤 在Dock…

Protobuf 安装与使用

Protobuf 安装与使用 1 环境2 安装 [apt安装]2 安装 [源码安装]1 依赖2 下载 protobuf3 解压4 编译安装5 配置环境 2 命令查看版本卸载 3 使用书写 .proto 文件编译 .proto 文件生成 cpp 文件编写 cpp 文件编译运行 参考 1 环境 ubuntn 20.04 protobuf v3.6.1 2 安装 [apt安装…

如何在 Ubuntu 20.04 上安装和使用 Docker

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装和使用 Docker 介绍 Docker是一个可以简化容器中应用程序进程管理过程的应用程序。…

uniapp中的导入zzx-calendar日历的使用

需求&#xff1a; 一周的日历&#xff0c;并且可以查看当月的 &#xff0c;下个月的&#xff0c;以及可以一周一周的切换日期 借助&#xff1a;hbuilder插件市场中的zzx-calendar插件库 在父组件中引入 并注册为子组件 <template><zzx-calendar selected-change&qu…

设计模式③ :生成实例

文章目录 一、前言二、Singleton 模式1. 介绍2. 应用3. 总结 三、Prototype 模式1. 介绍2. 应用3. 总结 四、Builder 模式1. 介绍2. 应用3. 总结 五、Abstract Factory 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所…

LiveGBS流媒体平台GB/T28181常见问题-国标编号是什么设备编号和通道国标编号标记唯一的摄像头|视频|镜头通道

LiveGBS国标GB28181中国标编号是什么设备编号和通道国标编号标记唯一的摄像头|视频|镜头通道 1、什么是国标编号&#xff1f;2、国标设备ID和通道ID3、ID 统一编码规则4、搭建GB28181视频直播平台 1、什么是国标编号&#xff1f; 国标GB28181对接过程中&#xff0c;可能有的小…

flutter版本升级后,解决真机和模拟器运行错误问题

flutter从3.3.2升级到3.16.0&#xff0c;项目运行到真机和模拟器报同样的错&#xff0c;错误如下: 解决办法&#xff1a;在android目录下的build.gradle加入下面这行&#xff0c;如下图&#xff1a; 重新运行&#xff0c;正常把apk安装到真机上或者运行到模拟器上

PC+Wap仿土巴兔装修报价器源码 PHP源码

核心功能&#xff1a; 业主自助预算计算&#xff1a;通过简洁的界面&#xff0c;业主可以输入装修需求&#xff0c;系统自动进行预算计算信息自动收集&#xff1a;系统自动收集业主的基本信息&#xff0c;如姓名、联系方式、房屋面积等一键发送报价&#xff1a;业主完成预算计…

Apache Doris 2.0.2 安装步骤 Centos8

Linux 操作系统版本需求 Linux 系统版本当前系统版本CentOS7.1 及以上CentOS8Ubuntu16.04 及以上- 软件需求 软件版本当前版本Java1.81.8.0_391GCC4.8.2 及以上gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4) 1、查看操作系统版本 方法 1&#xff1a;使用命令行 打开终端或…

springboot第46集:Nginx,Sentinel,计算机硬件的介绍

image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png 什么是单点容错率低&#xff1a; 单点容错率低指的是系统中存在某个关键节点&#xff0c;一旦这个节点发生故障或崩…

Apache SeaTunnel:探索下一代高性能分布式数据集成工具

大家下午好&#xff0c;我叫刘广东&#xff0c;然后是来自Apache SeaTunnel社区的一名Committer。今天给大家分享的议题是下一代高性能分布式海量数据集成工具&#xff0c;后面的整个的PPT&#xff0c;主要是基于开发者的视角去看待Apache SeaTunnel。后续所有的讲解主要是可能…

基于spark的Hive2Pg数据同步组件

一、背景 Hive中的数据需要同步到pg供在线使用&#xff0c;通常sqoop具有数据同步的功能&#xff0c;但是sqoop具有一定的问题&#xff0c;比如对数据的切分碰到数据字段存在异常的情况下&#xff0c;数据字段的空值率高、数据字段重复太多&#xff0c;影响sqoop的分区策略&…

飞塔FortiGate-1000C设备引进助力易天构建网络安全新防线

在当今数字化浪潮的推动下&#xff0c;企业对网络安全的需求日益迫切。为了应对不断升级的网络威胁&#xff0c;给客户提供最为优质的产品&#xff0c;易天引进了最新兼容性测试设备飞塔FortiGate-1000C&#xff0c;为光模块产品交付提供了更强劲的性能保障。 FortiGate-1000C是…

filecoin通过filutils 区块浏览器获取历史收益数据

filecoin 历史收益数据 每天每T平均收益 导出历史每日收益为文档 filutils 区块浏览器 导出历史每日收益为文档 #!/bin/bashfor i in {1..10} doecho $iresult$(curl --location --request POST https://api.filutils.com/api/v2/powerreward \--header User-Agent: Apifox/1.…

fmincon函数求解非线性超越方程的学习记录

最近的算法中用到了fmincon函数&#xff0c;寻找多变量非线性方程最小值的函数&#xff1b;因此学习一下&#xff1b; fmincon函数的基础语法如下所示&#xff1a; fmincon函数是为了求解下列方程的最小值&#xff1b; b 和 beq 是向量&#xff0c;A 和 Aeq 是矩阵&#xff0c…

企业级大数据安全架构(二)安全方案

作者&#xff1a;楼高 1 Knox访问控制 Apache Knox是一个为Apache Hadoop部署提供交互的应用网关&#xff0c;通过其REST API和用户友好的UI&#xff0c;为所有与Hadoop集群的REST和HTTP交互提供了统一的访问点。Knox不仅仅是一个访问网关&#xff0c;它还具备强大的访问控制…

(2024,少样本微调自适应,泛化误差界限,减小泛化误差的措施)多模态基础模型的少样本自适应:综述

Few-shot Adaptation of Multi-modal Foundation Models: A Survey 公和众和号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 多模态基础模型的预训练 3. 多模态基础模…

关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后&#xff0c;会一直运行&#xff0c;除非该线程主动调用do_exit函数&#xff0c;或者其他的进程调用kthread_stop函数&#xff0c;结束线程的运行。 之前找销毁内核线程的接口时&#xff0c;发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程…

JavaScript:构造函数面向对象

JavaScript&#xff1a;构造函数&面向对象 构造函数实例化静态成员实例成员 内置构造函数引用类型基本含义常用属性方法ObjectArray 包装类型基本含义常用属性方法StringNumber 面向对象原型对象constructor对象原型原型链原型继承 构造函数 在讲解构造函数之前&#xff0…