charm实现非对称加密中的循环群
非对称加密
非对称加密(也叫公钥加密)系统的密钥始终以(公钥 , 私钥)对的形式出现。公钥密码系统提供数学框架和算法来生成公钥+私钥对, 公钥通常与所有人共享,而私钥则保密。对于一般加解密而言,通常明文使用公钥加密后,只有私钥拥有者才能解密获得明文消息。公钥密码系统在设计时就确保了几乎不可能从其公开的公钥逆向演算出对应的私钥。
比较著名的非对称加密算法包括:RSA、ECC(椭圆曲线密码学)、ElGamal、Diffie-Hellman、ECDH、ECDSA 和 EdDSA等。主要用于加密和解密,签名与验证,密钥交换。目前流行的公钥密码系统基本都依赖于 IFP(整数分解问题)、DLP(离散对数问题)或者 ECDLP(椭圆曲线离散对数问题)
文章主要介绍DLP问题,以及如何在charm中实现循环群的运算
DLP问题
离散对数问题指的是,,在已知x与a的情况下求b是好求的;若是已知x与b,求a是困难的。如果给定整数x、a、b,则求就是离散对数问题。离散对数问题是定义在一个群上的,这里取,这里p是素数,关于乘法构成循环群(具体证明不多介绍)
证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP) - ffl - 博客园
这篇博客对于循环群怎么计算,有比较清楚的解释。
charm下实现循环群定义
我们一般将循环群同构于域,循环群G,至少有一个生成元<g>,循环群中的每个元素都可以用表示。
import numpy as np
from charm.toolbox.integergroup import IntegerGroup
import charm
from charm.core.math.integer import getMod
import math
import random
IntegerGroupElement = charm.core.math.integer.integerdef generate_group(sec_param):"""Generates a Schnorr mod p where p is a prime ofbit-size equal to sec_param生成一个随机的循环群,其中sec_param是安全参数Args:sec_param (int): security parameter, bit-size of pReturns:Tuple(): _description_"""group = IntegerGroup()group.paramgen(sec_param)return groupdef get_random_generator(group):'''生成随机的循环群的生成元'''return group.randomGen()def get_modulus(element: IntegerGroupElement) -> int:"""From a mod N returns N从一个循环群生成元取出模的数Args:element (IntegerGroupElement): Group element of form a mod NReturns:int: Modulus of modular expression, a mod N -> N"""mod = int(getMod(element))return mod
运行上面定义的函数生成循环群,并返回生成元g与模p
sec_param = 127
group = generate_group(sec_param)
g = get_random_generator(group)
p = get_modulus(g)
print("p={}, g={}".format(p, g))
将任意整数映射到循环群中
def encode_vector_to_group_elements(vector, group: IntegerGroup):encoded_vector = []for i in range(len(vector)):encoded_vector.append(encode_as_group_element(vector[i], group))return encoded_vectordef encode_as_group_element(x: int, group: IntegerGroup):return group.encode(int_to_bytes(x))def int_to_bytes(x: int) -> bytes:return x.to_bytes((x.bit_length() + 7) // 8, byteorder='big')x = random.randint(1, 256)
a = encode_as_group_element(x, group)
a_decode = decode_from_group_element(a, group)
print("x={}, x_encode={}, x_decode={}".format(x, a, a_decode))
测试定义的编码解码函数可不可以把任意整数映射到循环群中
def enoder_decoder_vector(sec_param):group = generate_group(sec_param)g = get_random_generator(group)p = get_modulus(g)print(g, '\n', p)A = np.random.randint(1, 256, size=(2, 2))# print(A, '\n', A.dtype)A_int = []for i in range(2):for j in range(2):A_int.append(A[i][j].item())# print(A_int, '\n', type(A_int[0]))print(A_int)A_encode = encode_vector_to_group_elements(A_int, group)# print(len(A_encode))print(A_encode, type(A_encode))A_decode = decode_vector_from_group_elements(A_encode, group)print(A_decode)# decode_A = decode_vector_from_group_elements(A_encode, group)# print(decode_A)return Trueev = enoder_decoder_vector(127)
结果显示成功了
charm实现非对称加密中的循环群相关推荐
- 非对称加密和证书总结
转载请注明文章来源:https://tlanyan.me/asymmetric... 前几日做支付对接时,被对方文档中的加密方式搞晕乎了一会.意识到证书加密方面的理解不够深入,事后查阅参考资料补习一波 ...
- [转载] 对称加密与非对称加密
标签 PostgreSQL , 对称加密 , 非对称加密 , Symmetric , ASymmetric , public , private , pgcrypto , 区块链 背景 转载: htt ...
- 密码篇——非对称加密
目录 非对称密码介绍 公钥通信流程: 公钥密码无法解决的问题: 公钥密码算法: 针对RSA的攻击 其他公钥密码: 总结: 非对称密码介绍 在对称加密中,加密与解密使用的密钥是相同的,因此必须向接收者配 ...
- 对称加密与非对称加密的区别_https原理及对称加密、非对称加密、数字证书、数字签名的含义...
一.为什么要使用https 使用https的原因其实很简单,就是因为http的不安全. 当我们往服务器发送比较隐私的数据(比如说你的银行卡,身份证)时,如果使用http进行通信.那么安全性将得不到保障 ...
- mysql对称连接什么意思_对称加密与非对称加密的区别是什么
区别:1.对称加密中加密和解密使用的秘钥是同一个:非对称加密中采用两个密钥,一般使用公钥进行加密,私钥进行解密.2.对称加密解密的速度比较快,非对称加密和解密花费的时间长.速度相对较慢.3.对称加密的 ...
- Java非对称加密KeyPairGenerator类
Java加密的常用的加密算法类型有三种 1单向加密: 也就是不可逆的加密,例如MD5,SHA,HMAC 2对称加密: 也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等 3 ...
- 网络协议从入门到底层原理(7)网络安全 - 常见攻击、单向散列函数、对称加密、非对称加密、混合密码系统、数字签名、证书
网络安全 网络层 - ARP欺骗 DoS.DDoS 介绍与防御 传输层 - SYN洪水攻击(SYN flooding attack) 传输层 - LAND攻击 应用层 - DNS劫持.HTTP劫持 H ...
- 理解区块链的“非对称加密”
区块链和密码学的关系,就像是鱼和水,可以说没有密码学,就没有区块链.比特币最早诞生的来源,正是中本聪当时所在的'"密码学邮件组".在所有的加密技术中,非对称加密又是加密术之中的皇冠 ...
- API接口加密—非对称加密解密之分段加解密
引言: 对称加密:双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密. 优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开.计算量小.加密速度 ...
最新文章
- R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图、混淆矩阵、准确率、精确度、召回率、ROC、AUC)、PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)
- JQuery 模糊匹配
- golang 代码格式化工具 gofmt
- 浅入 spring ioc 单例容器
- PyTorch官方教程中文版:Pytorch之图像篇
- 迈向电商认知智能时代的基石:阿里电商认知图谱揭秘
- 矩阵相乘Java版(第一个java程序)
- Go框架 gin 源码学习--路由的实现原理剖析
- 测试文档模板_学会word2007创建自定义模板的方法,让你新建的文档结构都一致...
- HCIE-Security Day16:防火墙双机热备实验(四)防火墙直路部署,上行连接路由器(OSPF),下行连接交换机
- 转载——关于bp神经网络
- 程序员背锅救星-docker
- Pm2 部署 Nuxt 项目
- c语言用数组发送大写字母怎么读,【C语言】(数组)C语言字符串中的小写字母转换为大写字母...
- Nginx实现虚拟主机
- 复盘2020年全球医疗行业:新冠疫苗争分夺秒、跨国药企押注中国、药企整合并购不断 | 医药观察...
- 华为商城抢购插件_有赞商城社群接龙全面上线,社群营销玩法升级
- IE编程1(.net)——读取IE窗口信息
- 基于C++和QT实现的简单数独游戏软件
- Openssh7.4p1更换为8.2
热门文章
- 数字电路实验怎么接线视频讲解_卡思数据:2020短视频内容营销趋势报告(把企业怎么用短视频来新时代的营销获客讲解最好的报告)99页...
- 【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
- 人机协同,当下是我们要的太多?还是机器能给的太少?
- 蓝牙AirTag防丢findmy
- 南京的java与苏州相比_苏州和南京各有什么优势?
- 转:人际交往过程中不能触碰的18条铁律
- 【智能路由器】基于netfilter的高效广告植入(非代理方式)
- java 实现的电话号码查询程序 优化版(课程设计)
- 转载电话号码正则表达式
- [转载]正则表达式匹配电话号码