1.密码学开源库整理
2.Golang GMP 原理
3.GCC 源码编译安装
4.å¦ä½å¨windowsä¸ç¼è¯GMP软件å
5.OpenFAST | 搭建编译环境(RedHat/CentOS 7)
6.双线性映射在密码学中的码下使用
密码学开源库整理
密码学开源库整理 维护一个密码学开源列表,旨在促进大家的码下共同学习与交流。持续更新中,码下欢迎投稿,码下贡献宝贵的码下资源。基础密码库
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广播加密- 允许广播者向一组接收者发送加密信息的ngx源码分析方案。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 队列)。bi分析源码
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,yshop源码交流协程在待执行队列中,等待被执行);(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库实现零知识证明流程的构建,为密码学领域提供实操指导。