欢迎来到皮皮网网首页

【手机健身软件源码下载】【飞单暗堡源码】【单点登录平台源码】gmp源码下载

来源:stlmap源码 时间:2024-11-25 05:34:06

1.密码学开源库整理
2.Golang GMP 原理
3.GCC 源码编译安装
4.如何在windows下编译GMP软件包
5.OpenFAST | 搭建编译环境(RedHat/CentOS 7)
6.双线性映射在密码学中的码下使用

gmp源码下载

密码学开源库整理

       密码学开源库整理

       维护一个密码学开源列表,旨在促进大家的码下共同学习与交流。持续更新中,码下欢迎投稿,码下贡献宝贵的码下资源。

       基础密码库

       C/C++

       MIRACL Crypto SDK- 一个广泛认可的码下手机健身软件源码下载多精度整数和有理数加密库,被视作椭圆曲线密码学的码下黄金标准。

       OpenSSL- 用于传输层安全协议的码下健壮、商业级、码下功能齐全的码下开源工具包。

       Tongsuo (原BabaSSL)- 提供现代密码学算法和安全通信协议的码下开源基础库,适用于各种业务场景。码下

       NTL- 高性能、码下可移植的码下C++库,提供整数、码下向量、矩阵、多项式和浮点运算的数据结构和算法。

       cryptoPP- 一个开源C++密码学库,包含了众多密码算法。

       PBC- 一个基于GMP库的免费C库,用于执行基于配对的密码系统的数学运算。

       NaCl- 一个易于使用的高效密码库,专为网络通信、加密、解密、签名等设计。

       Sodium- NaCl的一个分支,具有兼容和扩展API,提供构建更高级加密工具所需的核心操作。

       RELIC- 一个面向研究的现代密码原语工具箱,强调效率和灵活性。

       OpenABE- 集成了各种基于属性的加密算法、行业标准加密功能和工具,易于使用。

       cpabe toolkit- 实现基于密文策略的属性加密方案的程序,使用PBC库进行代数运算。

       Paillier- 公钥密码系统,提供加法同态性,适用于保护隐私的应用。

       代理重新加密- 公钥加密的一种形式,允许用户将其解密权委托给另一个用户。

       BGW广播加密- 允许广播者向一组接收者发送加密信息的飞单暗堡源码方案。

       JAVA

       The Java Pairing-Based Cryptography Library (JPBC)- 一个开源密码工具箱,支持国密算法、数字证书和SSL/TLS安全通信协议。

       Python

       pyUmbral- Umbral阈值代理重新加密方案的参考实现,支持密文委托。

       Golang

       The Go Pairing-Based Cryptography Library- 提供不同SOTA函数式加密方案的实现。

       CONIKS- 一个密钥管理系统,提供终端用户加密密钥的透明度和隐私保护。

       隐私增强技术库

       mpc和FHE库- 包括ecc、paillier、elgamal等基础公钥密码算法。

       区块链与零知识证明

       Rust/C++库- 实现zkSNARK方案的零知识证明系统。

       量子安全密码

       liboqs- 一个开放源码C库,包含量子安全加密算法的开源实现。

       可搜索加密

       收集的可搜索加密列表。

       隐私保护机器学习

       收集的Secure Deep Learning代码库列表。

       贡献者:

Golang GMP 原理

       通常语义中的线程,指的是内核级线程,核心点包括:(1)它是操作系统最小调度单元;(2)创建、销毁、调度交由内核完成,cpu 需完成用户态与内核态间的切换;(3)可充分利用多核,实现并行。

       协程,又称为用户级线程,核心点如下:(1)与线程存在映射关系,为 M:1;(2)创建、销毁、调度在用户态完成,对内核透明,所以更轻;(3)从属同一个内核级线程,无法并行;一个协程阻塞会导致从属同一线程的所有协程无法执行。

       Goroutine,经 Golang 优化后的特殊“协程”,核心点包括:(1)与线程存在映射关系,为 M:N;(2)创建、销毁、调度在用户态完成,对内核透明,足够轻便;(3)可利用多个线程,实现并行;(4)通过调度器的斡旋,实现和线程间的单点登录平台源码动态绑定和灵活调度;(5)栈空间大小可动态扩缩,因地制宜。

       对比三个模型的各项能力:综上,goroutine 可说是博采众长之物。

       实际上,“灵活调度” 一词概括得实在过于简要,Golang 在调度 goroutine 时,针对“如何减少加锁行为”,“如何避免资源不均”等问题都给出了精彩的解决方案,这一切都得益于经典的 “gmp” 模型。

       GMP = goroutine + machine + processor(+ 一套有机组合的机制),下面先单独拆出每个组件进行介绍,最后再总览全局,对 GMP 进行总述。

       G = goroutine,是 Golang 中对协程的抽象;(2)g 有自己的运行栈、状态、以及执行的任务函数(用户通过 go func 指定);(3)g 需要绑定到 p 才能执行,在 g 的视角中,p 就是它的 cpu。

       P = processor,是 Golang 中的调度器;(2)p 是 gmp 的中枢,借由 p 承上启下,实现 g 和 m 之间的动态有机结合;(3)对 g 而言,p 是其 cpu,g 只有被 p 调度,才得以执行;(4)对 m 而言,p 是其执行代理,为其提供必要信息的同时(可执行的 g、内存分配情况等),并隐藏了繁杂的调度细节;(5)p 的数量决定了 g 最大并行数量,可由用户通过 GOMAXPROCS 进行设定(超过 CPU 核数时无意义)。

       M = machine,是 Golang 中对线程的抽象;(1)m 不直接执行 g,而是先和 p 绑定,由其实现代理;(3)借由 p 的存在,m 无需和 g 绑死,也无需记录 g 的状态信息,因此 g 在全生命周期中可以实现跨 m 执行。

       全局有多个 M 和多个 P,但同时并行的 G 的最大数量等于 P 的数量。G 的存放队列有三类:P 的本地队列;全局队列;和 wait 队列(图中未展示,为 io 阻塞就绪态 goroutine 队列)。react 微博源码

       M 调度 G 时,优先取 P 本地队列,其次取全局队列,最后取 wait 队列。这样的好处是,取本地队列时,可以接近于无锁化,减少全局锁竞争。为防止不同 P 的闲忙差异过大,设立 work-stealing 机制,本地队列为空的 P 可以尝试从其他 P 本地队列偷取一半的 G 补充到自身队列。

       核心数据结构定义于 runtime/runtime2.go 文件中,各个类的成员属性较多,这里只摘取核心字段进行介绍:g 的生命周期由以下几种状态组成:_Gidle(值为 0,为协程开始创建时的状态,此时尚未初始化完成);_Grunnable(值为 1,协程在待执行队列中,等待被执行);_Grunning(值为 2,协程正在执行,同一时刻一个 p 中只有一个 g 处于此状态);_Gsyscall(值为 3,协程正在执行系统调用);_Gwaiting(值为 4,协程处于挂起态,需要等待被唤醒. gc、channel 通信或者锁操作时经常会进入这种状态);_Gdead(值为 6,协程刚初始化完成或者已经被销毁,会处于此状态);_Gcopystack(值为 8,协程正在栈扩容流程中);_Greempted(值为 9,协程被抢占后的状态)。

       文字性总结难免有些过于含糊和空洞,对一些细节的描述总是不够精确的。下面照旧开启源码走读流程,从代码中寻求理论证明和细节补充。

       gmp 数据结构定义为 runtime/runtime2.go 文件中,由于各个类的成员属性较多,那么只摘取核心字段进行介绍:(1)m:在 p 的代理,负责执行当前 g 的 m;(2)sched.sp:保存 CPU 的 rsp 寄存器的值,指向函数调用栈栈顶;(3)sched.pc:保存 CPU 的 rip 寄存器的值,指向程序下一条执行指令的地址;(4)sched.ret:保存系统调用的返回值;(5)sched.bp:保存 CPU 的 rbp 寄存器的值,存储函数栈帧的起始位置。其中 g 的生命周期由以下几种状态组成:(1)_Gidle(值为 0,为协程开始创建时的状态,此时尚未初始化完成);(2)_Grunnable(值为 1,游资出击 指标源码协程在待执行队列中,等待被执行);(3)_Grunning(值为 2,协程正在执行,同一时刻一个 p 中只有一个 g 处于此状态);(4)_Gsyscall(值为 3,协程正在执行系统调用);(5)_Gwaiting(值为 4,协程处于挂起态,需要等待被唤醒. gc、channel 通信或者锁操作时经常会进入这种状态);(6)_Gdead(值为 6,协程刚初始化完成或者已经被销毁,会处于此状态);(7)_Gcopystack(值为 8,协程正在栈扩容流程中);(8)_Greempted(值为 9,协程被抢占后的状态)。

       其中,goroutine 的类型可分为两类:(1)I 负责调度普通 g 的 g0,执行固定的调度流程,与 m 的关系为一对一;(2)II 负责执行用户函数的普通 g。m 通过 p 调度执行的 goroutine 永远在普通 g 和 g0 之间进行切换。

       主动调度是用户主动执行让渡的方式,主要方式是,用户在执行代码中调用了 runtime.Gosched 方法,此时当前 g 会当让出执行权,主动进行队列等待下次被调度执行。被动调度因当前不满足某种执行条件,g 可能会陷入阻塞态无法被调度,直到关注的条件达成后,g 才从阻塞中被唤醒,重新进入可执行队列等待被调度。

       正常调度指的是 g 中的执行任务已完成,g0 会将当前 g 置为死亡状态,发起新一轮调度。抢占调度指的是 g 执行系统调用超过指定的时长,且全局的 p 资源比较紧缺,此时将 p 和 g 解绑,抢占出来用于其他 g 的调度。

       调度流程的主干方法是位于 runtime/proc.go 中的 schedule 函数。在宏观调度流程中,我们可以尝试对 gmp 的宏观调度流程进行整体串联,包括:(1)以 g0 -> g -> g0 的一轮循环为例进行串联;(2)g0 执行 schedule() 函数,寻找到用于执行的 g;(3)g0 执行 execute() 方法,更新当前 g、p 的状态信息,并调用 gogo() 方法,将执行权交给 g;(4)g 因主动让渡(gosche_m())、被动调度(park_m())、正常结束(goexit0())等原因,调用 m_call 函数,执行权重新回到 g0 手中;(5)g0 执行 schedule() 函数,开启新一轮循环。

       在 Golang 中,调度流程的主干方法是位于 runtime/proc.go 中的 schedule 函数,此时的执行权位于 g0 手中。在 findRunnable 方法中,调度流程中,一个非常核心的步骤就是为 m 寻找到下一个执行的 g。在 execute 方法中,当 g0 为 m 寻找到可执行的 g 之后,接下来就开始执行 g。

       在 g 执行主动让渡时,会调用 mcall 方法将执行权归还给 g0,并由 g0 调用 gosched_m 方法。在 g 需要被动调度时,会调用 mcall 方法切换至 g0,并调用 park_m 方法将 g 置为阻塞态。当 g 执行完成时,会先执行 mcall 方法切换至 g0,然后调用 goexit0 方法。与 g 的系统调用有关的,视角切换回发生系统调用前,与 g 绑定的原 m 当中,此时执行权同样位于 m 的 g0 手中。在 m 需要执行系统调用前,会先执行位于 runtime/proc.go 的 reentersyscall 的方法。当 m 完成了内核态的系统调用之后,此时会步入位于 runtime/proc.go 的 exitsyscall 函数中。

       与 g 的系统调用有关的,视角切换回发生系统调用前,与 g 绑定的原 m 当中,在 m 需要执行系统调用前,会先执行位于 runtime/proc.go 的 reentersyscall 的方法。当 m 完成了内核态的系统调用之后,此时会步入位于 runtime/proc.go 的 exitsyscall 函数中。

       当 g 执行完成时,会先执行 mcall 方法切换至 g0,然后调用 goexit0 方法。当 m 完成了内核态的系统调用之后,此时会步入位于 runtime/proc.go 的 exitsyscall 函数中。

       对于抢占调度的执行者,不是 g0,而是一个全局的 monitor g,代码位于 runtime/proc.go 的 retake 方法中。与 g 的系统调用有关的,视角切换回发生系统调用前,与 g 绑定的原 m 当中,在 m 需要执行系统调用前,会先执行位于 runtime/proc.go 的 reentersyscall 的方法。当 m 完成了内核态的系统调用之后,此时会步入位于 runtime/proc.go 的 exitsyscall 函数中。

       在 Golang 中,调度流程的主干方法是位于 runtime/proc.go 中的 schedule 函数,此时的执行权位于 g0 手中。在 findRunnable 方法中,调度流程中,一个非常核心的步骤就是为 m 寻找到下一个执行的 g。在 execute 方法中,当 g0 为 m 寻找到可执行的 g 之后,接下来就开始执行 g。

       在 g 执行主动让渡时,会调用 mcall 方法将执行权归还给 g0,并由 g0 调用 gosched_m 方法。在 g 需要被动调度时,会调用 mcall 方法切换至 g0,并调用 park_m 方法将 g 置为阻塞态。当 g 执行完成时,会先执行 mcall 方法切换至 g0,然后调用 goexit0 方法。当 m 完成了内核态的系统调用之后,此时会步入位于

GCC 源码编译安装

       前言

       本文主要介绍如何在特定条件下,通过源码编译安装GCC(GNU Compiler Collection)4.8.5版本。在Linux环境下,特别是遇到较老工程代码和低版本GCC适配问题时,网络仓库不可用,可通过下载源码进行本地编译安装。文章总结了该过程的步骤,以期帮助读者解决类似需求。

       Linux系统版本:SUSE Linux Enterprise Server SP5 (aarch) - Kernel \r (\l)

       GCC版本:gcc-4.8.5

       步骤如下:

       1,源码下载

       直接在Linux终端执行:wget ftp.gnu.org/gnu/gcc/gcc...

       或手动下载:ftp://gcc.gnu.org/pub/gcc/infrastructure

       选取对应的gcc版本下载。

       2,解压并进入目录

       解压下载的tar包:tar -jxvf gcc-4.8.5.tar.bz2

       进入解压后的目录:cd gcc-4.8.5

       3,配置依赖库

       联网情况下:cd gcc-4.8.5/

       ./contrib/download_prerequisites

       无法联网时,手动下载依赖库(如mpfr、gmp、mpc)并上传到指定目录,然后分别解压、重命名并链接。

       4,创建编译存放目录

       在gcc-4.8.5目录下执行:mkdir gcc-build-4.8.5

       5,生成Makefile文件

       cd gcc-build-4.8.5

       ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

       推荐配置时,根据环境调整参数,如X_环境下的`--disable-libsanitizer`。

       6,执行编译

       make(可能耗时较长)

       解决可能出现的问题,如libc_name_p和struct ucontext uc,通过参考gcc.gnu.org/git或直接覆盖相关文件。

       7,安装GCC

       在gcc-build-4.8.5目录下执行:make install

       安装完成后,可直接解压并安装。

       8,配置环境变量

       执行命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/gcc-4.8.5/mpc:/root/gcc-4.8.5/gmp:/root/gcc-4.8.5/mpfr

       确保路径一致,执行 source /etc/profile 使环境变量生效。

       9,检查安装情况

       通过`gcc -v`和`g++ -v`验证GCC版本。

       ,库升级

       遇到动态库未找到问题时,需升级gcc库,通过查找和替换最新库文件解决。

       ,卸载系统自带的gcc

       以root用户执行:rpm -qa |grep gcc | xargs rpm -e --nodeps

       ,修改ld.so.conf文件

       编辑文件:vi /etc/ld.so.conf,在最下面添加实际路径,如/usr/local/lib和/usr/local/lib。

       执行 ldconfig /etc/ld.so.conf。

       ,修改GCC链接

       确保GCC及其相关工具的正确链接,使用`ll /usr/bin/gcc*`和`ll /usr/bin/g++*`检查链接结果。

       至此,GCC源码编译安装流程完成,可满足特定环境下的GCC版本需求。

如何在windows下编译GMP软件包

       1、下载GMP源代码,展开到d:/gmp

       /project/showfiles.php?group_id=

       ä¸­çš„AutoMated MinGW Installer下载完后执行,选择下载并安装

       å®‰è£…选项选择第一,二和最后共三个组件,安装在d:/minGW

       3、 /mingw/MSYS-1.0..exe?modtime=&big_mirror=1

       ä¸‹è½½MSYS MinGW的辅助环境

       å®‰è£…到d:/msys,安装时有两个提示,第一个提示输入Y, 第二个提示输入MinGW安装路径d:/MinGW

       å®ŒæˆåŽæ¡Œé¢å‡ºçŽ°msys快捷方式

       4、进入d:/msys/1.0/etc编辑fstab文件

       åŠ å…¥è¡Œ

       d:/gmp /gmp

       5、点击msys进入环境

       cd /gmp进入gmp虚拟路径

       ä¾æ¬¡æ‰§è¡Œï¼ˆæ¯ä¸ªéƒ½ä¼šæ‰§è¡Œå¾ˆé•¿æ—¶é—´ï¼‰

       ./configure

       make

       make install

       åˆ™ç¼–译出静态包

       å¦‚果执行

       ./configure --disable-static --enable-shared

       make

       make install

       åˆ™ç¼–译出dll

OpenFAST | 搭建编译环境(RedHat/CentOS 7)

       在服务器上使用OpenFAST时,若遇到使用RedHat/CentOS 7系统时默认GCC套件版本过旧,无法顺利编译OpenFAST源码的情况,此时需将GCC套件升级至较高版本以解决此问题。本文将详细说明如何在CentOS 7系统上离线编译GCC7.5。

       GCC(GNU编译器集合)是跨平台编译器的事实标准,支持多种编程语言。在CentOS 7系统中,自带的GCC套件版本为4.8,不支持C++。而GCC7.5支持C++,是理想的选择。编译OpenFAST需要依赖GCC中的g++和gfortran两个编译器。

       以下是编译GCC7.5的具体步骤:

       下载GCC7.5源代码并上传至服务器。

       下载GCC的依赖包:gmp-6.1.0.tar.bz2、mpc-1.0.3.tar.gz、mpfr-3.1.4.tar.bz2、isl-0..1.tar.bz2,并上传至服务器的GCC源码根目录。

       生成Makefile,确保配置项包含c、c++、fortran语言支持。

       编译GCC7.5,使用多线程加速编译过程。

       使用root权限安装GCC7.5。

       检查GCC7.5版本。

       更新动态库libstdc++.so.6。

       更新普通用户环境变量。

       测试编译器,确保安装成功。

双线性映射在密码学中的使用

       双线性映射在密码学中的使用

       近年来,双线性映射在身份认证与零知识证明领域的应用日益广泛。基于库PBC的零知识证明流程的实现,将为您详细解析这一过程。本文首先针对库的下载、编译与使用进行说明,针对不同操作系统的实践尝试。考虑到Windows下的编译挑战,Ubuntu被选为实现方案的载体。

       一、库的准备与实践

       在Linux环境下,借助PBC库实现密码学功能较为顺畅。在Windows系统上,需将其编译为适用于操作系统的可执行文件。下载和安装MinGW,利用其集成的命令行工具实现库的依赖安装。接着,通过msys.bat实现Linux式的模拟运行环境。下载GMP源码、配置与编译,生成用于库实现所需的libgmp.a静态库及gmp.h头文件。在指定目录下下载PBC源码,同时将先前准备的lib和头文件放置于其所在目录,确保库的完整集成。尽管PBC编译要求Linux系统,本文转移至Ubuntu下展开实践。

       二、Ubuntu平台下操作指南

       针对Ubuntu环境下的操作,首先确保安装Python 3.x版本,通过apt-get命令实现m4、flex、bison以及ssl-dev的安装。随后,下载GMP库、OpenSSL库、PBC库及最新的charm-crypto源码。经过以上步骤,动态库的构建与成功运行得以实现。

       三、基于双线性映射的承诺方案开发

       本文通过实际代码的编写,展示如何以双线性映射为基础构建一个简单的承诺方案。具体代码段落在此省略,其旨在通过PBC库实现零知识证明流程的构建,为密码学领域提供实操指导。