Tongsuo 支持半同态加密算法 Paillier

支持国密ssl的curl编译和测试验证(上) 本文详细描述了支持国密ssl和http2的curl的编译和测试验证的过程。 阅读详情

753617f5045aba45d559c233cd340998.gif

文|王祖熙(花名:金九 )

蚂蚁集团开发工程师

负责国产化密码库 Tongsuo 的开发和维护

专注于密码学、高性能网络、网络安全等领域

本文 4316 字 阅读 10 分钟

1. 背景


在《Tongsuo 支持半同态加密算法 EC-ElGamal》中,已经阐述了同态和半同态加密算法的背景和原理,可以移步查阅。总之,同态算法在隐私计算领域有着重要的作用,目前应用比较广泛的是 Paillier 和 EC-ElGamal 半同态加密算法,它们接口类似且只支持加法同态。

但是它们两者的性能和原理有很大的差异:

原理方面,Paillier 是基于复合剩余类的困难性问题(大数分解难题)的公钥加密算法,有点类似 RSA;而 EC-ElGamal 是基于椭圆曲线数学理论的公钥加密算法,其安全性理论上要比 Paillier 要更好。

性能方面,EC-ElGamal 的加密和密文加法性能要比 Paillier 好;而 Paillier 的解密和密文标量乘法性能要比起 EC-ElGamal 要更好更稳定(EC-ElGamal 的解密性能与解密的数字大小有关系,数字越大可能需要解密的时间越长,这与 EC-ElGamal 解密用到的解密表有关系,而 Paillier 的解密就没有这个问题。)。

所以这两个产品各有优劣,大家可以根据自己的业务特点选择使用 Paillier 还是 EC-ElGamal。

2. Paillier 原理

2.1 密钥生成

1.随机选择两个大素数 p、q,满足 9fc356ff0f944dfc9d7e28d1300aa611.png,且满足 p 和 q 的长度相等;

2. 计算f18107a0de9a1457e4b3bf474c17635f.png以及 08a43303d25bee4221d71865902f47ab.png,fe6e169b1d8ea62882a2c2020304e9b1.png表示最小公倍数;

3. 随机选择整数cc908c856af59cae5f9da04175fe8572.png,一般 g 的计算公式如下:

    a. 随机选择整数1f426b2ad425a6cb88e130d8a7a0481d.png;

    b. 计算:bab499aef6e93363811327296c209d45.png,为了简化和提高性能,k 一般选 1,g=1+n;

4. 定义 L 函数:fa4a1f5d4c4e46839af2e12c8a3745b6.png,计算:b206b24ee4e769687144ba38803c2cc5.png;

5. 公钥:(n, g),私钥:(λ, μ)。

2.2 加密

1. 明文 m,满足 −n<m<n;

2. 选择随机数 r,满足  0≤r<n  且  151b8679af5d7def40a3e1f98edf6af3.png;

3. 计算密文:360ffe78aee5463a4591dd3897e2d3ec.png。

2.3 解密

1. 密文 c,满足1700a2d32ab96500eff7c7ed93eabe1d.png;

2. 计算明文:48433f1aa004dbe8b9c463e12a519602.png。

2.4 密文加法

1. 密文:c1 和 c2,155dea34c7670f663e2c7964f1dcadce.png,c 就是密文加法的结果。

2.5 密文减法

1. 密文:c1 和 c2,计算:953261f51b283f1deeaa3a5a7682327a.jpeg,c 就是密文减法的结果。

2.6 密文标量乘法

1. 密文:c1,明文标量:a,计算:bc060599ed94dfc7de825dae2e30edbe.jpeg,c 就是密文标量乘法的结果。

3. 正确性

3.1 加解密正确性

公式推导需要用到 Carmichael 函数和确定合数剩余的公式,下面简单说明一下:


● Carmichael 函数
a. 设 n=pq,其中:p、q 为大素数;

b. 欧拉函数:ϕ(n) ,Carmichael 函数:λ(n);

c. 当 ba18e5ee613fd3491cf19e3031930671.jpeg和9ba2b6c53360adff2292f8f1ea898e5f.jpeg 时,

其中:96dcc73641d386c3e76b0e2ab6214dc6.png 。

对于任意 637f0eb1c55c947ef7fcb4e4289f989b.jpeg,有如下性质:3cb5ace513a4966fab48549a8a291928.png。

1

●判定合数剩余

a. 判定合数剩余类问题是指 n=pq,其中:p、q 为大素数,任意给定91c1f9c23d8575e5f7c7faa2e6c7cf8b.png,使得bafec98d65447b8f0c692f44e9e6ed37.png,则说 z 是模 808bc7634183db445af79032c1123391.png 的第 n 次剩余;

b. 第 n 项剩余的集合是 a3f882191de2bdf0ac529cf23317b039.png 的一个3055e251ea45da2dac8b2abe936fec7f.png 阶乘法子集;

c. 每个第 n 项剩余 z 都正好拥有 n 个 n 阶的根,其中只有一个是严格小于 n 的(即55f90d48164aef115d40f980677debf8.png);

d. 第n项剩余都可以写成 ba0ff4ca8395b65970f19c63b544c56f.png的形式。

●正确性验证

fd64296f6a9c5e5735c7f6adfced6eda.png


解密:

fba6a2ba820becb6b7fc6c5c09952bfb.png

3.2 密文加法正确性

587c9218de6945cd46b571942caa6b6b.png

3.3 密文减法正确性

7722a5329cec96067532ec7e6fcca3fa.png

3.4 密文标量乘法正确性

c8fc20703bf54ecb3b161df8fb5fccf7.png

4. 算法实现

4.1 接口定义

●对象相关接口
○公/私钥对象:PAILLIER_KEY ,该对象用来保存 Paillier 公钥和私钥的基本信息,比如 p、q、n、g、λ、μ 等信息,私钥保存所有字段,公钥只保存 n、g,其他字段为空或者 0。相关接口如下:

// 创建 PAILLIER_KEY 对象
PAILLIER_KEY *PAILLIER_KEY_new(void);


// 释放 PAILLIER_KEY 对象
void PAILLIER_KEY_free(PAILLIER_KEY *key);


// 拷贝 PAILLIER_KEY 对象,将 src 拷贝到 dest 中
PAILLIER_KEY *PAILLIER_KEY_copy(PAILLIER_KEY *dest, PAILLIER_KEY *src);


// 复制 PAILLIER_KEY 对象
PAILLIER_KEY *PAILLIER_KEY_dup(PAILLIER_KEY *key);


// 将 PAILLIER_KEY 对象引用计数加1,释放 PAILLIER_KEY 对象时若引用计数不为0则不能释放其内存
int PAILLIER_KEY_up_ref(PAILLIER_KEY *key);


// 生成 PAILLIER_KEY 对象中的参数,bits 为随机大素数 p、q 的二进制位长度
int PAILLIER_KEY_generate_key(PAILLIER_KEY *key, int bits);


// 获取 key 的类型:公钥 or 私钥
// PAILLIER_KEY_TYPE_PUBLIC 为私钥,PAILLIER_KEY_TYPE_PRIVATE 为私钥
int PAILLIER_KEY_type(PAILLIER_KEY *key);

○上下文对象:PAILLIER_CTX,该对象用来保存公私钥对象以及一些其他内部用到的信息,是 Paillier 算法其他接口的第一个参数。相关接口如下:

// 创建 PAILLIER_CTX 对象,key 为 paillier 公钥或者私钥,threshold 为支持最大的数字阈值,加密场景可设置为 0,解密场景可使用默认值:PAILLIER_MAX_THRESHOLD
PAILLIER_CTX *PAILLIER_CTX_new(PAILLIER_KEY *key, int64_t threshold);


// 释放 PAILLIER_CTX 对象
void PAILLIER_CTX_free(PAILLIER_CTX *ctx);


// 拷贝 PAILLIER_CTX 对象,将 src 拷贝到 dest 中
PAILLIER_CTX *PAILLIER_CTX_copy(PAILLIER_CTX *dest, PAILLIER_CTX *src);


// 复制 PAILLIER_CTX 对象
PAILLIER_CTX *PAILLIER_CTX_dup(PAILLIER_CTX *src);

○密文对象: PAILLIER_CIPHERTEXT ,该对象是用来保存 Paillier 加密后的结果信息,用到 PAILLIER_CIPHERTEXT 的地方,可调用如下接口:

// 创建 PAILLIER_CIPHERTEXT 对象
PAILLIER_CIPHERTEXT *PAILLIER_CIPHERTEXT_new(PAILLIER_CTX *ctx);


// 释放 PAILLIER_CIPHERTEXT 对象
void PAILLIER_CIPHERTEXT_free(PAILLIER_CIPHERTEXT *ciphertext);

●加密/解密接口

// 加密,将明文 m 进行加密,结果保存到 PAILLIER_CIPHERTEXT 对象指针 out 中
int PAILLIER_encrypt(PAILLIER_CTX *ctx, PAILLIER_CIPHERTEXT *out, int32_t m);


// 解密,将密文 c 进行解密,结果保存到 int32_t 指针 out 中
int PAILLIER_decrypt(PAILLIER_CTX *ctx, int32_t *out, PAILLIER_CIPHERTEXT *c);

●密文加/减/标量乘运算接口

// 密文加,r = c1 + c2
int PAILLIER_add(PAILLIER_CTX *ctx, PAILLIER_CIPHERTEXT *r,
                 PAILLIER_CIPHERTEXT *c1, PAILLIER_CIPHERTEXT *c2);


// 密文标量加,r = c1 * m
int PAILLIER_add_plain(PAILLIER_CTX *ctx, PAILLIER_CIPHERTEXT *r,
                       PAILLIER_CIPHERTEXT *c1, int32_t m);


// 密文减,r = c1 - c2
int PAILLIER_sub(PAILLIER_CTX *ctx, PAILLIER_CIPHERTEXT *r,
                 PAILLIER_CIPHERTEXT *c1, PAILLIER_CIPHERTEXT *c2);


// 密文标量乘,r = c * m
int PAILLIER_mul(PAILLIER_CTX *ctx, PAILLIER_CIPHERTEXT *r,
                 PAILLIER_CIPHERTEXT *c, int32_t m);

●编码/解码接口
同态加密涉及到多方参与,可能会需要网络传输,这就需要将密文对象 PAILLIER_CIPHERTEXT 编码后才能传递给对方,对方也需要解码得到 PAILLIER_CIPHERTEXT 对象后才能调用其他接口进行运算。
接口如下:

// 编码,将密文 ciphertext 编码后保存到 out 指针中,out 指针的内存需要提前分配好;
// 如果 out 为 NULL,则返回编码所需的内存大小;
// flag:标志位,预留,暂时没有用
size_t PAILLIER_CIPHERTEXT_encode(PAILLIER_CTX *ctx, unsigned char *out,
                                  size_t size,
                                  const PAILLIER_CIPHERTEXT *ciphertext,
                                  int flag);


// 解码,将长度为 size 的内存数据 in 解码后保存到密文对象 r 中
int PAILLIER_CIPHERTEXT_decode(PAILLIER_CTX *ctx, PAILLIER_CIPHERTEXT *r,
                               unsigned char *in, size_t size);

以上所有接口详细说明请参考 Paillier API 文档:

https://www.yuque.com/tsdoc/api/slgr6f

4.2 核心实现

●Paillier Key
Paillier 不像 EC-ElGamal,EC-ElGamal 在 Tongsuo 里面直接复用 EC_KEY 即可,Paillier Key 在 Tongsuo 里面则需要实现一遍,主要功能有:公/私钥的生成、PEM 格式存储、公/私钥解析和文本展示,详情请查阅代码:

crypto/paillier/paillier_key.c、

crypto/paillier/paillier_asn1.c、

crypto/paillier/paillier_prn.c。

●Paillier 加解密、密文运算

Paillier 的加解密和密文运算算法非常简单,主要是大数的模幂运算,使用 Tongsuo 里面的 BN 相关接口就可以,需要注意的是,负数的加密/解密用到模逆运算,不能直接按公式计算(1ff80405005d882bad90e0dd1a87a64c.png),这是因为 OpenSSL 的接口 BN_mod_exp 没有关注指数(上面公式的 m )是不是负数,如果是负数的话需要做一次模逆运算:

76f9b025364bcac328d4afeb0256a16e.png

,这里计算出 4a4d9df6a65168eacae9334664ea1113.png 之后做一次模逆运算( BN_mod_inverse )再与f3fc4320ab74a7b83048ab8bd086759b.png相乘;解密的时候,需要确认是否检查了阈值( PAILLIER_MAX_THRESHOLD ),超出则说明是负数,需要减去 n 才得到真正的结果。密文减法也需要用到模逆运算,通过密文减法的公式(173157f15cc69a201ba637f693d3419b.png)得知,d48f11177bfe8f9ff5c85637b7c3286f.png 需要进行模逆运算( BN_mod_inverse )再与 ec26a9b25a2d8268a00f5706c799c6a3.png相乘。

详情请查阅代码:

crypto/paillier/paillier_crypt.c

●Paillier 命令行
为了提高 Paillier 的易用性,Tongsuo 实现了如下 Paillier 子命令:

$ /opt/tongsuo-debug/bin/openssl paillier -help
Usage: paillier [action options] [input/output options] [arg1] [arg2]


General options:
-help         Display this summary


Action options:
-keygen       Generate a paillier private key
-pubgen       Generate a paillier public key
-key          Display/Parse a paillier private key
-pub          Display/Parse a paillier public key
-encrypt      Encrypt a number with the paillier public key, usage: -encrypt 99, 99 is an example number
-decrypt      Decrypt a ciphertext using the paillier private key, usage: -decrypt c1, c1 is an example ciphertext
-add          Paillier homomorphic addition: add two ciphertexts, usage: -add c1 c2, c1 and c2 are tow example ciphertexts, result: E(c1) + E(c2)
-add_plain    Paillier homomorphic addition: add a ciphertext to a plaintext, usage: -add_plain c1 99, c1 is an example ciphertext, 99 is an example number, result: E(c1) + 99
-sub          Paillier homomorphic subtraction: sub two ciphertexts, usage: -sub c1 c2, c1 and c2 are tow example ciphertexts, result: E(c1) - E(c2)
-mul          Paillier homomorphic scalar multiplication: multiply a ciphertext by a known plaintext, usage: -mul c1 99, c1 is an example ciphertext, 99 is an example number, result: E(c1) * 99


Input options:
-in val       Input file
-key_in val   Input is a paillier private key used to generate public key


Output options:
-out outfile  Output the paillier key to specified file
-noout        Don't print paillier key out
-text         Print the paillier key in text
-verbose      Verbose output


Parameters:
arg1          Argument for encryption/decryption, or the first argument of a homomorphic operation
arg2          The second argument of a homomorphic operation

主要命令有:
- keygen:生成 Paillier 私钥;
- pubgen:用 Paillier 私钥生成公钥;
- key:文本显示 Paillier 私钥;
- pub:文本显示 Paillier 公钥;
- encrypt:对数字进行加密,输出 Paillier 加密的结果,需要通过参数 -key_in 参数指定 Paillier 公钥文件路径,如果加密负数则需要将 - 用 _ 代替,因为 - 会被 OpenSSL 解析成预定义参数了(下同);

- decrypt:对 Paillier 密文进行解密,输出解密结果,需要通过-key_in参数指定 Paillier 私钥文件路径;
- add:对两个 Paillier 密文进行同态加法操作,输出同态加法密文结果,需要通过参数 -key_in 参数指定 Paillier 公钥文件路径;
- add_plain:将 Paillier 密文和明文相加,输出同态加法密文结果,需要通过参数 -key_in 参数指定 Paillier 公钥文件路径;
- sub:对两个 Paillier 密文进行同态减法操作,输出同态减法密文结果,需要通过参数 -key_in 参数指定 Paillier 公钥文件路径;
- mul:将 Paillier 密文和明文相乘,输出同态标量乘法密文结果,需要通过参数 -key_in 参数指定 Paillier 公钥文件路径。


通过以上命令即可在命令行进行 Paillier 算法实验,降低入门门槛,详情请查阅代码:apps/paillier.c。


另外还实现了 Paillier 的 speed 命令,可以进行性能测试,详情请查阅代码:apps/speed.c。

5. 用法&例子

5.1 demo 程序

#include <stdio.h>
#include <time.h>
#include <openssl/paillier.h>
#include <openssl/pem.h>


#define CLOCKS_PER_MSEC (CLOCKS_PER_SEC/1000)


int main(int argc, char *argv[])
{
    int ret = -1;
    int32_t r;
    clock_t begin, end;
    PAILLIER_KEY *pail_key = NULL, *pail_pub = NULL;
    PAILLIER_CTX *ctx1 = NULL, *ctx2 = NULL;
    PAILLIER_CIPHERTEXT *c1 = NULL, *c2 = NULL, *c3 = NULL;
    FILE *pk_file = fopen("pail-pub.pem", "rb");
    FILE *sk_file = fopen("pail-key.pem", "rb");


    if ((pail_pub = PEM_read_PAILLIER_PublicKey(pk_file, NULL, NULL, NULL)) == NULL)
        goto err;
    if ((pail_key = PEM_read_PAILLIER_PrivateKey(sk_file, NULL, NULL, NULL)) == NULL)
        goto err;


    if ((ctx1 = PAILLIER_CTX_new(pail_pub, PAILLIER_MAX_THRESHOLD)) == NULL)
        goto err;
    if ((ctx2 = PAILLIER_CTX_new(pail_key, PAILLIER_MAX_THRESHOLD)) == NULL)
        goto err;


    if ((c1 = PAILLIER_CIPHERTEXT_new(ctx1)) == NULL)
        goto err;
    if ((c2 = PAILLIER_CIPHERTEXT_new(ctx1)) == NULL)
        goto err;


    begin = clock();
    if (!PAILLIER_encrypt(ctx1, c1, 20000021))
        goto err;
    end = clock();
    printf("PAILLIER_encrypt(20000021) cost: %lfms\n", (double)(end - begin)/CLOCKS_PER_MSEC);


    begin = clock();
    if (!PAILLIER_encrypt(ctx1, c2, 500))
        goto err;
    end = clock();
    printf("PAILLIER_encrypt(500) cost: %lfms\n", (double)(end - begin)/CLOCKS_PER_MSEC);


    if ((c3 = PAILLIER_CIPHERTEXT_new(ctx1)) == NULL)
        goto err;


    begin = clock();
    if (!PAILLIER_add(ctx1, c3, c1, c2))
        goto err;
    end = clock();
    printf("PAILLIER_add(C2000021,C500) cost: %lfms\n", (double)(end - begin)/CLOCKS_PER_MSEC);


    begin = clock();
    if (!(PAILLIER_decrypt(ctx2, &r, c3)))
        goto err;
    end = clock();
    printf("PAILLIER_decrypt(C20000021,C500) result: %d, cost: %lfms\n", r, (double)(end - begin)/CLOCKS_PER_MSEC);


    begin = clock();
    if (!PAILLIER_mul(ctx1, c3, c2, 800))
        goto err;
    end = clock();
    printf("PAILLIER_mul(C500,800) cost: %lfms\n", (double)(end - begin)/CLOCKS_PER_MSEC);


    begin = clock();
    if (!(PAILLIER_decrypt(ctx2, &r, c3)))
        goto err;
    end = clock();
    printf("PAILLIER_decrypt(C500,800) result: %d, cost: %lfms\n", r, (double)(end - begin)/CLOCKS_PER_MSEC);




    printf("PAILLIER_CIPHERTEXT_encode size: %zu\n", PAILLIER_CIPHERTEXT_encode(ctx2, NULL, 0, NULL, 1));


    ret = 0;
err:
    PAILLIER_KEY_free(pail_key);
    PAILLIER_KEY_free(pail_pub);
    PAILLIER_CIPHERTEXT_free(c1);
    PAILLIER_CIPHERTEXT_free(c2);
    PAILLIER_CIPHERTEXT_free(c3);
    PAILLIER_CTX_free(ctx1);
    PAILLIER_CTX_free(ctx2);
    fclose(sk_file);
    fclose(pk_file);
    return ret;
}

5.2 编译和运行

先确保 Tongsuo 开启 Paillier,如果是手工编译 Tongsuo,可参考如下编译步骤:

# 下载代码
git clone git@github.com:Tongsuo-Project/Tongsuo.git


# 编译参数需要加上:enable-paillier
./config  --debug no-shared no-threads enable-paillier --strict-warnings -fPIC --prefix=/opt/tongsuo


# 编译
make -j


# 安装到目录 /opt/tongsuo 
sudo make install

5.3 编译 demo 程序

gcc -Wall -g -o paillier_test ./paillier_test.c -I/opt/tongsuo/include -L/opt/tongsuo/lib -lssl -lcrypto

5.4 生成 Paillier 公私钥

# 先生成私钥
/opt/tongsuo/bin/openssl paillier -keygen -out pail-key.pem
# 用私钥生成公钥
/opt/tongsuo/bin/openssl paillier -pubgen -key_in ./pail-key.pem -out pail-pub.pem

5.5 运行结果

$ ./paillier_test
PAILLIER_encrypt(20000021) cost: 3.202000ms
PAILLIER_encrypt(500) cost: 0.442000ms
PAILLIER_add(C2000021,C500) cost: 0.047000ms
PAILLIER_decrypt(C20000021,C500) result: 20000521, cost: 0.471000ms
PAILLIER_mul(C500,800) cost: 0.056000ms
PAILLIER_decrypt(C500,800) result: 400000, cost: 0.464000ms
PAILLIER_CIPHERTEXT_encode size: 0

   本周推荐阅读  

b5d9c04611b76e9035fc73c8a5d54cae.jpeg

你好,我的新名字叫“铜锁/Tongsuo”

3f18330c1ad714aef0f0235b38202c11.png

BabaSSL:支持半同态加密算法 EC-ElGamal

158d58b25f0cbd53769973ad600fbc5b.png

BabaSSL 发布 8.3.0|实现相应隐私计算的需求

35a7145e88bc002018c59cdc295ae20d.png

开源项目文档社区化!Tongsuo/铜锁实践

bf3af762c6c10f1c118372c363ce4cea.jpeg

Tongsuo(铜锁)项目介绍 - 实现国密SSL协议 本文章主要介绍了铜锁项目的编译,以及使用铜锁项目实现国密SSL通信、搭建支持国密SSL协议的Nginx服务器、支持国密SSL协议的libcurl的使用。 阅读详情

相关推荐

【Godot4自学手册】第一节配置Godot运行环境

Godot是一款自由开源、由社区驱动的 2D 和 3D 游戏引擎!它是一款功能丰富的跨平台游戏引擎,可以通过统一的界面创建 2D 和 3D 游戏。它提供了一套全面的通用工具,因此用户可以专注于制作游戏,而无需重新发明轮子。游戏可以一键导出到多个平台,包括主流的桌面平台(Linux、macOS、Windows)、移动平台(Android、iOS)、基于 Web 的平台以及主机平台。

zhaoyang314的博客 5984

开放原子训练营(第一季)铜锁探索国密及简单应用

其次,现阶段java项目开发都是基于前后端分离的模式进行的,因此,需要设计一个开发框架,即前端基于vue,后端基于springboot,这种模式也是当前非常流行的web开发模式。在科学技术飞速发展的今天,加解密在数据传输的过程中非常重要,因此,了解并合理使用加解密算法对于程序员而言是非常重要的。以下,简短的描述一下学习中新的感悟和体会,总体而言,整个国密的探索由浅入深,由表及里,涉及面非常全面,同时提供的tongsuo原代码中还包含了多种加解密源代码,对于研究加解密的程序员而言,用处非常大。

qq_41429436的博客 5490

WPS接入DeepSeek,实现AI辅助功能

总的来说,借助 WPS 中宏功能与 DeepSeek 大模型的结合,文档处理、内容创作和数据分析等任务都能更加智能化、自动化。这不仅大幅提升了工作效率,也为办公场景带来了全新的智能化办公体验。

运维老生常谈 3805

Netty集成国密开源基础密码库Tongsuo

本次完成了Tongsuo TLCP协议的四种国密套件;X86架构的编译。TLSv1.3的TLS_SM4_GCM_SM3套件的支持。ARM架构、PPC架构、Windows的编译。mac系统一般服务器环境没有应用场景,有能力的小伙伴可以帮忙测试一下。时代的车轮在加速的运转,在有限的视野里也要不断地追赶。铜锁开源密码库 · 语雀铜锁/Tongsuo(原BabaSSL)是一个提供现代...https://www.yuque.com/tsdoc。

x1075339587的博客 1万+

【Zemax光学设计实训一】---单透镜光学设计

建立一个焦距为100mm、入瞳直径为25mm的单透镜系统,该透镜中心厚度为4mm,其两个面的曲率半径分别为100mm、-100mm,全视场2w=10°。该系统在可见光下工作,采用BK7玻璃,光阑设置在人射光线遇到的透镜的第一个光学表面;并对其展开优化。

yh的博客 3618

关于使用EB tresos出现无法激活的情况解决

我在安装eb studio时就是在激活方面有问题导致无法使用,下面讲解出现了什么问题以及我如何去解除的。EB安装完成时需要激活才能使用的,不然都打开或者建立不了工程,一直都是报的dns服务器错误,好的,那我改dns服务器地址。填写dns服务器地址,也可以换成别的,自己百度一下适合自己的。这是解决方案哈哈哈哈。

weixin_43673603的博客 6182

Delphi-Cross-Socket 项目教程

Delphi-Cross-Socket 项目教程 1. 项目的目录结构及介绍 Delphi-Cross-Socket 项目的目录结构如下: Delphi-Cross-Socket/ ├── src/ │ ├── Core/ │ ├── Examples/ │ ├── Sockets/ │ └── Utils/ ├── tests/ ├── docs/ ├── README.md └...

gitblog_00756的博客 1038

[南大ICS]PA1 - 开天辟地的篇章: 最简单的计算机

task PA1.1: 实现单步执行, 打印寄存器状态, 扫描内存 task PA1.2: 实现算术表达式求值 task PA1.3: 实现所有要求, 提交完整的实验报告

qq_42474104的博客 1570

Tongsuo 8.4.0-pre3 发布!

铜锁的 8.4.0 是一个大版本发布,其中包括了对多种半同态算法、零知识证明算法和硬件加速能力的支持,并删除了不常用的算法以及进行了漏洞的修复。

u19967317326的博客 442

量子化学仿真软件:VASP_(9).磁性材料计算

在量子化学仿真软件 VASP 中,磁性材料的计算是一个复杂但重要的过程。通过正确设置磁性状态、分析磁性性质、优化计算参数以及研究磁性相变和磁动力学,可以更准确地描述和预测磁性材料的性能。希望本节的内容能够为研究磁性材料的科研人员提供有用的参考和指导。

kkchenjj的博客 1375

AWR2243的等效相位中心与虚拟通道

在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离

qq_50974341的博客 1981

铜锁 (Tongsuo) 8.4.0-pre2 发布,开源基础密码库

铜锁 / Tongsuo(原 BabaSSL)是一个提供现代密码学算法和安全通信协议的开源基础密码库,为存储、网络、密钥管理、隐私计算等诸多业务场景提供底层的密码学基础能力,实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性,为数据生命周期中的隐私和安全提供保护能力。发布内容:Tongsuo 8.4.0-pre2。发布时间:2023 年 8 月 17 日。

Jdjdjjdjdjdje的博客 787

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

关于ECC-Elgamal同态加密

建议有一点基础的小伙伴看看,当然你不懂也可以提出来

qq_43582628的博客 5585

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

BabaSSL:支持半同态加密算法 EC-ElGamal

文|王祖熙(花名:金九)蚂蚁集团开发工程师负责国产化密码库BabaSSL的开发和维护专注于密码学、高性能网络、网络安全等领域本文3063字 阅读 5分钟—— 数据不出域、可用不可见...

金融级分布式架构 1573

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

你好,我的新名字叫“铜锁/Tongsuo”

文|杨洋(花名:凯申)铜锁开源密码库创始人蚂蚁集团高级技术专家本文2816字 阅读8分钟再见 BabaSSL ,你好 Tongsuo!BabaSSL 这个名字由于其历史上的若干特殊原因,导致了其看起来是主要 SSL/TLS 协议的密码学产品,这其实并不符合整个产品的功能特性,名字本身也不够中立,这会让用户产生一定程度的误解。目前 BabaSSL 在积极推进向开放...

金融级分布式架构 1039

Apache APISIX 玩转 Tongsuo 国密插件

文|罗泽轩Apache APISIX PMC本文通过解读国密的相关内容与标准,呈现了当下国内技术环境中对于国密功能支持的现状。并从 API 网关 Apache APISIX 的角度,带来有关国密的探索与功能呈现。本文3446字 阅读11分钟1. 什么是国密顾名思义,国密就是国产化的密码算法。在我们日常开发过程中会接触到各种各样的密码算法,如 RSA、SHA256 等等。为了达到更高的安...

金融级分布式架构 2133

超详细铜锁/Tongsuo配置教程:Configure参数全解析

你是否还在为铜锁/Tongsuo的编译配置感到困惑?本文将带你全面解析Configure脚本的核心参数,从基础安装到高级功能配置,让你轻松掌握铜锁的定制化编译流程。读完本文后,你将能够: - 理解铜锁配置系统的工作原理 - 掌握关键配置参数的使用方法 - 定制符合需求的加密算法组合 - 启用硬件加速和高级安全特性 - 解决常见的配置问题 ## 项目简介与配置工具概述 铜锁/Tongsuo是一...

gitblog_00374的博客 1294

你好,我的新名字叫 “铜锁 / Tongsuo”

再见 BabaSSL ,你好 Tongsuo!

金融级分布式架构 928

Scalable and Privacy-Preserving Data Sharing Based on Blockchain

一、

weixin_43783865的博客 950

Tongsuo学习(一)

可以发现,优化的sm2算法和未优化的sm2算法在签名和验签性能上差别不大,没有达到理论的性能提升。图中,可见在目录中编译了4个文件夹分别为bin,include,lib64,ssl。发现出现报错,这是因为并没有在环境变量中导入openssl的两个共享库。首先解压源码文件,并在进入源码文件的终端,通过如下的代码进行编译。解决之后再次测试,tongsuo二进制程序正确运行,配置成功。, 这里可以根据自己的不同需求去进行安装。从图中可见,该优化特性未被打开。命令,然后编译安装过程同上。配置过程同1,不过加入了。

dwh1094723584的博客 3572

开源项目文档社区化!Tongsuo/铜锁实践

文|杨洋(花名:凯申)铜锁开源密码库创始人蚂蚁集团高级技术专家本文1284字 阅读5分钟1前言如大家所见,针对铜锁开源密码库(https://github.com/Tongsuo-Project)的文档,我们正在逐步地进行一些改革。其中,最大的一个变化是:我们把原来放在 readthedocs.org(简记 rtfd.io)上的教程和说明文档转移到了语雀上。为此有必要和大家解释一下,这其...

金融级分布式架构 1525

Tongsuo项目:打造智能合约的安全守护者

是一个专注于智能合约安全审计和防护的开源项目,它以提高区块链应用的安全性为目标,为开发者提供了一套强大的工具和服务。 ## 项目简介 Tongsuo 项目的核心在于其智能合约安全性检测引擎,通过静态代码分析、动态运行时监测等多种技术手段,对智能合约进行深度扫描,找出可能存在的漏洞和风险。不仅如此,项目还提供了详尽的漏洞报告和修复建议,帮助开发者及时修复问题,提升智能合约的安全标准。 ## 技

gitblog_00017的博客 595

ImPlot与Dear ImGui完美集成:从零开始的完整实战教程

ImPlot是专为Dear ImGui设计的即时模式GPU加速绘图库,为数据可视化提供了强大而直观的解决方案。无论您是开发实时数据分析应用还是创建交互式图表,ImPlot都能以最少的代码实现专业的绘图效果。💫 ## 为什么选择ImPlot? ImPlot继承了Dear ImGui的所有优点 - 轻量级、高性能、无状态管理,让开发者能够专注于数据本身而非界面细节。与传统的绘图库相比,ImPlo

gitblog_01120的博客 475

安全攻防 - 国密 SSL / TLCP 接入手把手系列

本文介绍了一套面向国密SSL/TLCP协议初学者的开发指南系列博客。该系列以Spring Boot+Forest+OkHttp客户端接入TLCP服务端为主线,系统性地讲解了国密SSL相关知识体系,包括:SSL/TLS基础概念、国密算法标准背景、TLCP双证书机制等理论内容,以及证书配置、Provider集成、SSLContext构建等实践环节。系列采用渐进式教学,包含10篇技术文章,从基础概念到代码实现再到生产配置,并提供了Web联调页面和错误排查手册。特别强调理解协议原理而非单纯代码实现,帮助开发者规避国

小工匠 611

深入解析ElGamal加密算法及其实现

在现代密码学中,非对称加密算法扮演着至关重要的角色。ElGamal加密算法作为其中一种经典的非对称加密方案,基于离散对数问题的难解性,为信息安全提供了坚实的理论基础和实际应用价值。本文将全面解析ElGamal加密算法的工作原理、实现细节以及安全考量。 ## 预备知识 在深入理解ElGamal加密算法前,需要掌握以下数学基础: 1. **循环群与生成元**:理解群论中循环群的概念及其生成元的性...

gitblog_00991的博客 663
上一篇: 活动延期 | Triton Meetup 2022
下一篇: 这100件年度精选案例,讲透了技术公司的创新逻辑
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值