当前位置: 首页 > news >正文

常见的同态加密算法收集

随着对crypten与密码学的了解,我们将逐渐深入学习相关知识。今天,我们将跟随同态加密的发展历程对相关算法进行简单的收集整理 。

目录

同态加密概念

RSA算法

ElGamal算法

ELGamal签名算法

Paillier算法

BGN方案

Gentry 方案

BGV 方案

BFV 方案

GSW 方案

CKKS方案


同态加密概念

同态加密是基于数学难题与计算复杂性理论的密码学技术。

它是指密文状态下对加密信息进行计算得到一个输出,将这一输出进行解密,其结果与用同一方法处理未加密的明文信息计算得到的输出结果是一致的。

同态加密分为半同态加密和全同态加密。其中:

半同态加密:允许在加密数据上执行特定的算术运算,加法乘法。

全同态加密:支持对密文进行任意形式的加法乘法运算。

半同态加密

全同态加密

乘法同态

加法同态

有限次数全同态

第一代

第二代

第二代

第三代

可实现浮点数近似计算,适合机器学习建模场景

RSA算法

ElGamal算法

Paillier算法

Boneh-Goh-Nissim方案

Gentry方案

BGV方案

BFV方案

GSW方案

CKKS方案

RSA算法

RSA算法是一种公钥算法体制,即每一位用户都有一对密钥,一个是可以公开的,另一个则是秘密的,(分为加密密钥Ka和解密密钥Kd)。加密密钥控制加密,解密密钥控制解密,由计算复杂性原理保证加密钥Ka不能通过计算推出解密钥。这样,就实现了即使将Ka公开也不会暴露Kd。

RSA算法描述:

  1. 任意选取两个不同的大素数p和q(经典值为1024位)计算乘积n=pq,z=(p-1)(q-1);
  2. 任意选取一个大整数e,满足gcd(e,z)=1,即e和z互质。整数e用作加密钥。(注意:e的选取是很容易,例如,所有大于p和q的素数都可用)
  3. 确定解密钥d。满足(de)modz=1,即de=kz+1,(因此,若知道e和z,则很容易计算出d)
  4. 公开整数n和e,秘密保存d。

加密算法(明文m,m为小于n的整数,加密为密文c)

c=m^emodn

解密算法(将密文c解密为明文m)

m=c^dmodn

代码示例:

import randomdef fastExpMod(b, n, m):'''return : b^n mod m'''result = 1while n != 0:if (n & 1) == 1:  # 按位与操作result = (result * b) % mb = (b * b) % mn = n >> 1  # 位数右移操作return resultdef Euclid(a, b):'''欧几里得算法 ax + by = gcd(a,b)Return : [x , y , gcd(a,b)]'''X = [1, 0, a]Y = [0, 1, b]while Y[2] != 0:Q = X[2] // Y[2]NEW_Y = [i * Q for i in Y]T = list(map(lambda x: x[0] - x[1], zip(X, NEW_Y)))X = Y.copy()Y = T.copy()return Xdef fermatPrimeTest(m, k):'''费马素性检验算法m : 给定整数k : 安全参数,重复K次'''if m % 2 == 0:return Falsefor i in range(k):a = random.randint(2, m - 2)g = Euclid(a, m)if g[2] == 1:r = fastExpMod(a, m - 1, m)if r == 1:continueelse:return Falseelse:return Falsereturn Truedef findPrime(lower, upper):'''return : 一个位于upper和lower之间的素数'''while True:n = random.randint(lower, upper)if fermatPrimeTest(n, 6) == True:return ndef selectE(fn):'''fn : euler functionReturn : e'''while True:e = random.randint(1, fn)temp = Euclid(e, fn)if temp[2] == 1:return edef keyGenerate(lower, upper):'''给定两个素数p和q生成的区间return : e,n,d'''p = findPrime(lower, upper)q = findPrime(lower, upper)print("p:" + str(p) + "   q:" + str(q))# print("q:"+str(q))n = p * qfn = (p - 1) * (q - 1)e = selectE(fn)temp = Euclid(e, fn)  # 欧几里得算法求逆元d = temp[0]if d < 0:  # 由于e和fn互素故一定存在逆元d = d + fn  # 保证d为正数return e, n, ddef Encryption_Decryption():e, n, d = keyGenerate(1000, 10000)  # 密钥生成# 更改keyGenerate函数的两个参数,可以改变生成素数的位数大小。print("public key (e,n):", end="")print("(" + str(e) + "  ,  " + str(n) + ")\n")print("private key d: " + str(d) + "\n")m = random.randint(1, n)  # m < n m为明文print("Plaintext: " + str(m))c = fastExpMod(m, e, n)  # 加密  c为密文 m^e mod nprint("\nEncryption of PlainText: " + str(c))x = fastExpMod(c, d, n)  # 解密 c^d mod nprint("\nDecryption of CipherText: " + str(x))if x == m:print("\nThe plaintext and ciphertext are the same.")if __name__ == "__main__":Encryption_Decryption()

运行结果:

这段代码通过生成RSA密钥对,加密一个随机生成的明文,然后解密密文,验证了加密和解密的正确性。具体步骤包括生成素数、计算 n 和 ϕ(n)、选择公钥 e、计算私钥 d、加密明文、解密密文,并最终验证解密后的明文与原始明文是否相同。

ElGamal算法

EIGamal密码是除了RSA密码之外最有代表性的公开密钥密码。

与RSA算法不同,RSA是基于因数分解的公钥体制密码,而EIGamal是建立在离散对数的困难问题上的一种公钥体制密码。

EIGamal算法描述

  1. 选取一个素数p,以及小于p的两个随机数g和x;
  2. 计算y=g^xmodp;
  3. 公钥为(y,g,p),私钥为x;

加密算法 M为明文

  1. 选取一个与p-1互质的整数k;
  2. C1=g^kmodp
  3. C2=y^kMmodp
  4. (C1,C2)即为密文

解密算法

C2/C1^x modp=Mmodp

举例:

取p=11, g=5, x=2

则 y = g^xmodp = 3

取 k 为 7, m为10

则C1 = g^kmodp = 3

C2 = y^k*m mod p = 2

则C1^xmodp= 9

9在模11下的逆元为5

所以 C 2 /C 1^ x=2∗5mod10 =10mod10,所以解密成功

示例代码:

import random# 判断一个数是否为素数def is_prime(n):if n <= 1:return Falseif n <= 3:return Trueif n % 2 == 0 or n % 3 == 0:return Falsei = 5while i * i <= n:if n % i == 0 or n % (i + 2) == 0:return Falsei += 6return True# 生成一个随机的素数def generate_prime():while True:p = random.randint(100, 1000)if is_prime(p):return p# 生成一个原根def generate_generator(p):phi = p - 1factors = []for i in range(2, int(phi ** 0.5) + 1):if phi % i == 0:factors.append(i)while phi % i == 0:phi //= iif phi > 1:factors.append(phi)for g in range(2, p):is_generator = Truefor factor in factors:if pow(g, phi // factor, p) == 1:is_generator = Falsebreakif is_generator:return g# 生成ElGamal公私钥对def generate_keys():p = generate_prime()g = generate_generator(p)a = random.randint(2, p - 1)h = pow(g, a, p)return (p, g, h, a)keys = generate_keys()print("公钥:(p, g, h) =", keys[0], ",", keys[1], ",", keys[2])print("私钥:a =", keys[3])

运行结果:

这段代码实现了 ElGamal 密码体制的公私钥对生成,包括生成随机素数、原根和计算公私钥。生成的公钥 (p, g, h) 和私钥 a 可以用于后续的加密和解密操作。

ELGamal签名算法

密钥产生

确定一个大素数p

取p的一个本原根g

在Zp域上选择一个随机数x

y = gxmodp

(y, g, p)为公钥,x为私钥

签名算法

设待签名的消息为m

取一个与p-1互质的k

C1=gkmodp

C2=(H(m)-x*C1) * k-1mod(p-1)

输出签名(C1,C2)和消息m

代码示例

import randomfrom sympy import isprime, mod_inverse# 选择一个素数p和生成元gdef generate_prime_and_generator():while True:p = random.randint(2 ** 10, 2 ** 11)  # p的范围if isprime(p):breakwhile True:g = random.randint(2, p - 2)if pow(g, (p - 1), p) == 1:breakreturn p, g# 生成密钥对def generate_key_pair(p, g):x = random.randint(2, p - 2)y = pow(g, x, p)return x, y# 签署消息def sign_message(p, g, x, m):k = random.randint(1, p - 2)r = pow(g, k, p)s = (m - x * r) * mod_inverse(k, p - 1) % (p - 1)return (r, s)# 验证签名def verify_signature(p, g, y, m, r, s):if not (0 < r < p and 0 < s < p - 1):return Falseleft = pow(y, r, p) * pow(r, s, p) % pright = pow(g, m, p)return left == right# 输出签名详细过程def print_signature_process(p, g, x, m, r, s):print("--------------------签名过程--------------------")print(f"签名消息为: {m}")print(f"私钥x为: {x}")print(f"随机数k为: {k}")print(f"签名结果r为: {r}")print(f"签名结果s为: {s}")# 主程序if __name__ == "__main__":# 生成素数和生成元p, g = generate_prime_and_generator()# Alice生成密钥对x_alice, y_alice = generate_key_pair(p, g)# 输出参数print("--------------------参数生成过程--------------------")print(f"素数p为: {p}")print(f"生成元g为: {g}")print(f"Alice的公钥y为: {y_alice}")# Alice签署消息message = 20240301k = random.randint(1, p - 2)r, s = sign_message(p, g, x_alice, message)# 输出签名详细过程print_signature_process(p, g, x_alice, message, r, s)# 用户输入签名print("--------------------验证签名过程--------------------")user_r = int(input("请输入r的值: "))user_s = int(input("请输入s的值: "))# 验证签名if verify_signature(p, g, y_alice, message, user_r, user_s):print("签名有效")else:print("签名无效")

运行结果:

这段代码实现了 ElGamal 签名方案的生成、签署和验证过程。通过生成素数 p 和生成元 g,生成密钥对,签署消息,并验证签名,确保了数字签名的安全性和有效性。

Paillier算法

Paillier 同态加密算法是一种非对称加密算法,该算法利用了数论中的复合剩余类的数学性质。

Paillier算法描述

1.随机选择两个大质数p和q满足gcd(pq,(p-1)(q-1))=1。 这个属性是保证两个质数长度相等。

2.计算 n = pq和λ= lcm (p - 1,q-1)。

3.选择随机整数g(g属于Z*n^2),使得满足n整除g的阶。

4.公钥为(n,g)

5.私钥为λ。

加密算法

m属于Zn,r为[1,n-1]的随机数,转换成密文:

C=g^m·r^n modn^2;

解密算法

代码示例:

from phe import paillierimport gmpy2 as gy# 生成 Paillier 密钥对public_key, private_key = paillier.generate_paillier_keypair(n_length=128)print("n: ", public_key.n)print("g: ", public_key.g)print("p: ",private_key.p)print("q: ",private_key.q)a = 15b = 20print("a: ",a)print("b: ",b)# 加密 a 和 ba_enc = public_key.encrypt(a)print("a_enc: ",a_enc.ciphertext())b_enc = public_key.encrypt(b)print("b_enc: ",b_enc.ciphertext())print("同态加")print("a + b = ",a+b)c_enc = a_enc + b_encprint("c_enc = a_enc + b_enc: ",c_enc.ciphertext())c_dec = private_key.decrypt(c_enc)print("c_dec = a + b: ",c_dec)print("同态数乘")print("a * b = ",a*b)c1_enc = a * b_encprint("c1_enc = a * b_enc: ",c1_enc.ciphertext())c2_enc = b * a_encprint("c2_enc = b * a_enc: ",c2_enc.ciphertext())c1_dec = private_key.decrypt(c1_enc)c2_dec = private_key.decrypt(c2_enc)print("c1_dec = a * b: ",c1_dec)print("c2_dec = b * a: ",c2_dec)

运行结果:

这段代码展示了如何使用 Paillier 同态加密算法进行基本的同态加法和数乘操作。Paillier 同态加密算法是一种加法同态加密算法,支持对密文的加法和数乘操作。

BGN方案

BGN是一种同态加密方案,是Bonel h等人在2005提出的一种具有全同态性质的加密方案。和传统的仅能支持单同态的elgamal和paillier加密方案不一样,BGN能够同时支持加同态和一次乘同态运算。

1.选择椭圆曲线和生成元

2.选择一个椭圆曲线 E 和一个生成元 P,使得 E 的阶为 q,且 q 是一个大素数。

3.选择一个随机的私钥 s,范围在 1 到 q−1 之间。

4.计算公钥 Ppub=sP

生成密钥对

公钥(E,P,Ppub)

私钥s

加密算法

选择随机数

选择一个随机数 r,范围在 1 到 q−1 之间。

加密消息

对于消息 m,计算密文 C

C=(rP,rPpub+mP)

其中,C 是一个二元组,第一个元素是 rP,第二个元素是 rPpub+mP解密算法

解密密文

对于密文 C=(C1,C2),计算:mP=C2sC1

由于 C1=rP 和 C2=rPpub+mP,可以推导出:

mP=(rPpub+mP)−s(rP)=r(sP)+mPs(rP)=mP

通过椭圆曲线上的点 mP 恢复消息 m

 同态加法

同态加法

对于两个密文 C1=(C11,C12) 和 C2=(C21,C22),计算:

C1+C2=(C11+C21,C12+C22)

解密结果为:

m1+m2=(C12+C22)−s(C11+C21)=(m1P+m2P)=(m1+m2)P

同态数乘

同态数乘

对于一个密文 C=(C1,C2) 和一个标量 k,计算:

kC=(kC1,kC2)

解密结果为:

km=k(C2sC1)=k(mP)=(km)P

代码示例:

from ecdsa import NIST384p, SigningKey, VerifyingKeyfrom ecdsa.util import randrange_from_seed__trytryagainimport os# 生成密钥对def generate_keys():sk = SigningKey.generate(curve=NIST384p)vk = sk.verifying_keyreturn sk, vk# 加密消息def encrypt(vk, m):# 生成一个在有效范围内的随机数 rr = randrange_from_seed__trytryagain(os.urandom(32), NIST384p.order)C1 = r * NIST384p.generatorC2 = (r * vk.pubkey.point) + (m * NIST384p.generator)return C1, C2# 解密消息def decrypt(sk, C1, C2):# 计算 -sC1neg_sC1 = -(sk.privkey.secret_multiplier * C1)# 计算 C2 + (-sC1)mP = C2 + neg_sC1# 通过椭圆曲线上的点 mP 恢复消息 mm = mP.x() % NIST384p.orderreturn m# 同态加法def homomorphic_add(C1, C2, D1, D2):return C1 + D1, C2 + D2# 同态数乘def homomorphic_mul(C1, C2, k):return k * C1, k * C2# 主程序if __name__ == "__main__":# 生成密钥对sk, vk = generate_keys()print("公钥:", vk.to_string().hex())print("私钥:", sk.to_string().hex())# 加密消息m1 = 15m2 = 20C1, C2 = encrypt(vk, m1)D1, D2 = encrypt(vk, m2)print("C1:", C1.x(), C1.y())print("C2:", C2.x(), C2.y())print("D1:", D1.x(), D1.y())print("D2:", D2.x(), D2.y())# 同态加法E1, E2 = homomorphic_add(C1, C2, D1, D2)m3 = decrypt(sk, E1, E2)print("同态加法结果:", m3)# 同态数乘k = 3F1, F2 = homomorphic_mul(C1, C2, k)m4 = decrypt(sk, F1, F2)print("同态数乘结果:", m4)

运行结果:

BGN 同态加密方案通过椭圆曲线上的点运算实现了对密文的加法和数乘操作。通过生成密钥对、加密消息、解密消息、同态加法和同态数乘,可以实现对密文的高效计算。

Gentry 方案

提出者及背景:2009 年,由 Craig Gentry提出,这是全同态加密领域的重要突破,解决了自公钥加密发明以来一直困扰科学家们的难题。

(在传统加密中,数据一旦加密,就很难在密文状态下进行各种类型的计算。例如,对于常规的 RSA 或 AES 加密,加密后的数据只能进行有限的操作,如存储、传输等。而全同态加密允许在密文上直接进行任意次数的加法和乘法等计算,并且解密后的结果与在明文上进行相同计算再解密的结果相同。)

Gentry 方案之前,全同态加密的概念虽然被提出,但一直没有有效的实现方式。Gentry 利用基于理想格的复杂数学结构,设计出了首个可行的全同态加密方案。

核心原理:基于理想格的数学对象,利用 “双盲” 设计,可以检测加密漏洞并进行修复,而不会造成信息泄露。

方案特点:最初的方案依赖矩阵和矢量进行加密,计算复杂,实用性不强。但它为后续全同态加密方案的研究奠定了基础,具有开创性意义。

局限性:随着计算步骤的增加,连续加密的计算结果质量下降,需要系统实现一定量的计算来进行数据清理实现全同态,且计算复杂。

BGV 方案

提出者及背景:由 Brakerski、Gentry 和 Vaikuntanathan 提出,是第二代全同态加密方案中的重要代表。

核心原理:基于更弱的假设来提高性能和安全性,使用 LWE 或 RLWE 问题构建一个基本的 GLWE 加密方案,再利用 “重线性化” 和 “维度缩减” 技术进行改进,还使用了 “模数切换” 技术来实现同态加法和同态乘法操作并有效减少计算复杂度和存储需求。

方案特点:不需要 Gentry 的自举过程,提供了基于 LWE 或 RLWE 问题的 FHE 方案选择,在选择适当的方案时具有更大灵活性,其安全性和效率都有一定的提升。

局限性:虽然避免了自举过程,但在实际应用中,对于大规模数据和复杂计算,其性能仍有待进一步提高。

BFV 方案

提出者及背景:最初的 LWE 形式由 Brakerski 给出,后在此基础上给出了更实用的 RLWE 形式,是第二代同态加密中的核心方案之一,微软的全同态加密软件 SEAL 最初就是实现的 BFV 方案。

核心原理:在明文空间的高 bit 位编码信息,使用的编码结构,通过密钥生成、加密、解密和同态运算等算法来实现同态加密。

方案特点:同态加法相对简单,就是向量加法。同态乘法较为复杂,需要引入 “重线性化” 技术将乘法破坏的解密结构恢复成线性结构。

局限性:乘法运算的复杂性导致其在处理复杂计算时效率可能较低,且重线性化过程可能会引入一定的误差和计算开销。

GSW 方案

提出者及背景:由 Gentry、Sahai 和 Waters 提出,是一种基于近似特征向量的全同态加密方案。

核心原理:利用近似特征向量的相关性质,将加密、解密和同态运算等操作与矩阵的运算相结合,通过对密文进行特定的矩阵变换来实现同态计算。

方案特点:同态运算更加高效,为矩阵的加、乘运算,且不会引起密文维度的膨胀,无需借助其他技术来控制密文维度的增长,密文噪声的控制更加简洁、有效。

局限性:不支持 SIMD 同态操作,自举实现依赖的安全假设强度较第二代有所弱化,且困难问题的近似因子仅为维度 n 的多项式。

这些方案在同态加密领域的发展中逐代递进,从Gentry的首次证明FHE的存在性,到BGV、BFV和GSW方案的不断优化和简化,逐步提高了同态加密的效率和实用性。每个方案都在前一个方案的基础上进行了改进,引入了新的技术和方法。

CKKS方案

CKKS方案是由Jung Hee Cheon、Kyoohyung Han、Duhyeong Kim、Moon Sung Lee和Yongsoo Song在2019年提出的一种同态加密方案。

它是第一个支持复数运算的同态加密方案。这使得它在处理复数和多项式运算时非常高效,特别适用于需要进行复数运算的应用场景,如信号处理、图像处理和机器学习。CKKS方案基于环上学习带误差问题(Ring-LWE),这是一种高效的构造方法,减少了密文的大小和计算复杂度。同时,CKKS方案引入了多模数技术,支持在不同模数下进行同态操作,提高了灵活性和效率。

算法步骤

1.选择参数:

选择一个合适的环 R 和一个模数 q

选择一个生成元 g 和一个随机的私钥 s

2.生成公钥

计算公钥 h=gsmodq

生成密钥对 (h,s)。

加密算法

选择一个随机数 r

加密消息

对于消息 m,计算密文 C

C=(r·g,r·h+m)modq

解密算法

解密密文

对于密文 C=(C1,C2),计算:

m=C2s·C1modq

同态加法

同态加法

对于两个密文 C1=(C11,C12) 和 C2=(C21,C22),计算:

C1+C2=(C11+C21,C12+C22)modq

同态数乘

同态数乘

对于一个密文 C=(C1,C2) 和一个标量 k,计算:

kC=(k·C1,k·C2)modq

代码示例:

import tenseal as ts# 生成密钥对def generate_keys():# 创建 CKKS 上下文context = ts.context(ts.SCHEME_TYPE.CKKS, poly_modulus_degree=8192, coeff_mod_bit_sizes=[60, 40, 40, 60])# 生成密钥context.generate_galois_keys()context.global_scale = 2 ** 40return context# 加密消息def encrypt(context, message):# 创建张量tensor = ts.plain_tensor(message)# 加密张量encrypted_tensor = ts.ckks_tensor(context, tensor)return encrypted_tensor# 解密消息def decrypt(context, encrypted_tensor):# 解密张量decrypted_tensor = encrypted_tensor.decrypt()return decrypted_tensor# 同态加法def homomorphic_add(encrypted_tensor1, encrypted_tensor2):return encrypted_tensor1 + encrypted_tensor2# 同态数乘def homomorphic_mul(encrypted_tensor, scalar):return encrypted_tensor * scalar# 主程序if __name__ == "__main__":# 生成密钥对context = generate_keys()print("密钥生成完成")# 加密消息message1 = [1, 2, 3, 4]message2 = [5, 6, 7, 8]encrypted_tensor1 = encrypt(context, message1)encrypted_tensor2 = encrypt(context, message2)print("消息加密完成")# 同态加法encrypted_sum = homomorphic_add(encrypted_tensor1, encrypted_tensor2)decrypted_sum = decrypt(context, encrypted_sum)print("同态加法结果:", decrypted_sum.tolist())# 同态数乘scalar = 3encrypted_mul = homomorphic_mul(encrypted_tensor1, scalar)decrypted_mul = decrypt(context, encrypted_mul)print("同态数乘结果:", decrypted_mul.tolist())

运行结果:

这段代码实现了一个基于 CKKS 同态加密方案的示例,支持对密文的加法和数乘操作。通过生成密钥对、加密消息、解密消息、同态加法和同态数乘,可以实现对密文的高效计算。


 本篇简单介绍了随着同态加密的发展而产生的几种同态加密算法,同态加密的发展是向着高效化、功能化的方向前进的,其应用前景十分广阔。通过对同态加密的了解,我们一定能够实现更高效的技术。

本篇借鉴来源于Kimi 是一个有着超大“内存”的智能助手,可以一口气读完二十万字的小说,还会上网冲浪,快来跟他聊聊吧

同态加密技术概览-CSDN博客 

相关文章:

常见的同态加密算法收集

随着对crypten与密码学的了解&#xff0c;我们将逐渐深入学习相关知识。今天&#xff0c;我们将跟随同态加密的发展历程对相关算法进行简单的收集整理 。 目录 同态加密概念 RSA算法 ElGamal算法 ELGamal签名算法 Paillier算法 BGN方案 Gentry 方案 BGV 方案 BFV 方案…...

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…...

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1&#xff1a;命令行下载方式2&#xff1a;离线包下载 二、Docker Desktop更新时间 前言 参考文章&#xff1a;Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频&#xff1a;一个视频解决D…...

AI智慧社区--生成验证码

接口文档&#xff1a; 从接口文档中可以得知的信息&#xff1a; 代码的返回格式为json格式&#xff0c;可以将Controlller换为RestController前端发起的请求为Get请求&#xff0c;使用注解GetMapping通过返回的数据类型&#xff0c;定义一个返回类型Result package com.qcby.…...

2501,20个窗口常用操作

窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的"非客户区"和应用绘画的"客户区". 在MFC中,CWnd类为各种窗口提供了基类. 1,通过窗柄取得CWnd指针 可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针. void CD…...

【gopher的java学习笔记】一文讲懂controller,service,mapper,entity是什么

刚开始上手Java和Spring时&#xff0c;就被controller&#xff0c;service&#xff0c;mapper&#xff0c;entity这几个词搞懵了&#xff0c;搞不懂这些究竟代表什么&#xff0c;感觉使用golang开发的时候也没太接触过这些名词啊~ 经过两三个月的开发后&#xff0c;逐渐搞懂了这…...

消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)

STOMP&#xff08;Simple Text Oriented Messaging Protocol&#xff0c;简单面向文本的消息传递协议&#xff09;是一种轻量级、基于文本的协议&#xff0c;旨在为消息代理&#xff08;消息队列&#xff09;和客户端之间的通信&#xff08;websocket&#xff09;提供一种简单的…...

基于SpringBoot的租房管理系统(含论文)

基于SpringBoot的租房管理系统是一个集订单管理、房源信息管理、屋主申诉处理、用户反馈等多项功能于一体的系统。该系统通过SpringBoot框架开发&#xff0c;拥有完善的管理员后台、屋主管理模块、用户功能模块等&#xff0c;适用于房地产租赁平台或中介公司进行日常管理与运营…...

提升企业内部协作的在线知识库架构与实施策略

内容概要 在当前快速变化的商业环境中&#xff0c;企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台&#xff0c;成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库&#xff0c;强调架构设计、知识资产分类管理及…...

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...

Jackson中@JsonTypeId的妙用与实例解析

在日常的Java开发中&#xff0c;Jackson库是处理JSON数据的常用工具。其中&#xff0c;JsonTypeId注解是一个非常实用的功能&#xff0c;它可以帮助我们更好地控制多态类型信息在序列化过程中的表现。今天&#xff0c;我们就来深入探讨一下JsonTypeId的用法&#xff0c;并通过具…...

Ubuntu 顶部状态栏 配置,gnu扩展程序

顶部状态栏 默认没有配置、隐藏的地方 安装使用Hide Top Bar 或Just Perfection等进行配置 1 安装 sudo apt install gnome-shell-extension-manager2 打开 安装的“扩展管理器” 3. 对顶部状态栏进行配置 使用Hide Top Bar 智能隐藏&#xff0c;或者使用Just Perfection 直…...

Java---入门基础篇(上)

前言 本片文章主要讲了刚学Java的一些基础内容,例如注释,标识符,数据类型和变量,运算符,还有逻辑控制等,记录的很详细,带你从简单的知识点再到练习题.如果学习了c语言的小伙伴会发现,这篇文章的内容和c语言大致相同. 而在下一篇文章里,我会讲解方法和数组的使用,也是Java中基础…...

Linux C++

一、引言 冯诺依曼架构是现代计算机系统的基础&#xff0c;它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时&#xff0c;理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的&#xff0c;包括程序的存储、执行和资源管理。这对于编写高效、可靠的…...

gradio 合集

知识点 1&#xff1a;基本 Chatbot 创建 import gradio as gr 定义历史记录 history [gr.ChatMessage(role“assistant”, content“How can I help you?”), gr.ChatMessage(role“user”, content“What is the weather today?”)] 使用历史记录创建 Chatbot 组件 ch…...

996引擎 - NPC-动态创建NPC

996引擎 - NPC-动态创建NPC 创建脚本服务端脚本客户端脚本添加自定义音效添加音效文件修改配置参考资料有个小问题,创建NPC时没有控制朝向的参数。所以。。。自己考虑怎么找补吧。 多重影分身 创建脚本 服务端脚本 Mir200\Envir\Market_Def\test\test001-3.lua -- NPC八门名…...

论文阅读(十三):复杂表型关联的贝叶斯、基于系统的多层次分析:从解释到决策

1.论文链接&#xff1a;Bayesian, Systems-based, Multilevel Analysis of Associations for Complex Phenotypes: from Interpretation to Decision 摘要&#xff1a; 遗传关联研究&#xff08;GAS&#xff09;报告的结果相对稀缺&#xff0c;促使许多研究方向。尽管关联概念…...

代码随想录算法训练营第三十九天-动态规划-198. 打家劫舍

动规五部曲 dp[i]表示在下标为i的房间偷或不偷与前面所偷之和所能获得的最大价值递推公式&#xff1a;dp[i] std::max(dp[i - 2] nums[i], dp[i - 1])初始化&#xff1a;要给dp[0]与dp[1]来给定初始值&#xff0c;因为递推公式有-1与-2。dp[0] nums[0], dp[1] std::max(num…...

CF1098F Ж-function

【题意】 给你一个字符串 s s s&#xff0c;每次询问给你 l , r l, r l,r&#xff0c;让你输出 s s s l , r sss_{l,r} sssl,r​中 ∑ i 1 r − l 1 L C P ( s s i , s s 1 ) \sum_{i1}^{r-l1}LCP(ss_i,ss_1) ∑i1r−l1​LCP(ssi​,ss1​)。 【思路】 和前一道题一样&#…...

Python 函数魔法书:基础、范例、避坑、测验与项目实战

Python 函数魔法书&#xff1a;基础、范例、避坑、测验与项目实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南&#xff0c;旨在帮助读者从基础入门到项目实战&#xff0c;全面提升编程能力。文章结构由 5 个版块组成&#xff0c;内容层层递进…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...