首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用C openssl AES-GCM加密创建ESP数据包时抛出错误的ICV

在使用C语言和OpenSSL库进行AES-GCM加密以创建ESP(Encapsulating Security Payload)数据包时,如果抛出错误的ICV(Integrity Check Value),这通常意味着在加密过程中完整性校验失败。ICV是GCM模式中用于验证数据完整性和认证加密数据的一部分。

基础概念

AES-GCM(Advanced Encryption Standard - Galois/Counter Mode)是一种加密模式,它结合了AES的块加密和GCM的计数器模式及认证机制。ESP是一种IPsec协议,用于提供数据机密性、数据完整性以及抗重放服务。

可能的原因

  1. 数据长度问题:GCM模式要求明文长度必须是128位的倍数。
  2. 初始化向量(IV)问题:IV的长度必须是96位,且不能重复使用。
  3. 密钥问题:使用的密钥可能不正确或不符合AES的要求。
  4. 数据篡改:在加密过程中或之后,数据可能被篡改。
  5. 库版本问题:使用的OpenSSL库版本可能存在bug或不兼容问题。

解决方法

  1. 检查数据长度:确保明文数据长度是128位的倍数。
  2. 检查数据长度:确保明文数据长度是128位的倍数。
  3. 正确设置IV:确保IV长度为96位,并且每次加密使用唯一的IV。
  4. 正确设置IV:确保IV长度为96位,并且每次加密使用唯一的IV。
  5. 验证密钥:确保使用的密钥是正确的,并且符合AES的要求(例如,AES-128使用16字节密钥)。
  6. 验证密钥:确保使用的密钥是正确的,并且符合AES的要求(例如,AES-128使用16字节密钥)。
  7. 检查数据完整性:在加密和解密过程中,确保数据没有被篡改。
  8. 更新OpenSSL库:确保使用的是最新版本的OpenSSL库,以避免已知的bug。

示例代码

以下是一个简单的AES-GCM加密示例:

代码语言:txt
复制
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <string.h>

int aes_gcm_encrypt(unsigned char *plaintext, int plaintext_len,
                    unsigned char *key, unsigned char *iv,
                    unsigned char *ciphertext, unsigned char *tag) {
    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;

    ctx = EVP_CIPHER_CTX_new();
    if (!ctx) return -1;

    if (EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 12, NULL) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    if (EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    if (EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }
    ciphertext_len = len;

    if (EVP_EncryptFinal_ex(ctx, ciphertext + len, &len) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }
    ciphertext_len += len;

    if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    EVP_CIPHER_CTX_free(ctx);
    return ciphertext_len;
}

参考链接

通过以上步骤和示例代码,您应该能够诊断并解决在使用C OpenSSL AES-GCM加密创建ESP数据包时遇到的ICV错误问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

网络安全——网络层IPSec安全协议(4)

这些目标是通过使用两大传输安全协议,头部认证(AH)和封装安全负载(ESP)以及密钥管理程序和协议的使用来完成的。  ...在实际进行IP通信时,可以根据实际需求同时使用这两种协议或选择使用其中的一种。AH和ESP都可以提供认证服务,不过,AH提供的认证服务要强于ESP。...(6)认证值:这个域的长度可变,它存放IP数据包的完整性校验值ICV。 ICV,全称integrity check value。是在对无格式文本安全列表和补充的计算得到的,用于信息安全的完整性检查。...一般AH为整个数据包提供完整性检查,但是在传输过程中,某些IP头字段会发生变化,且发送方无法预测数据包到达接收端时此字段的值。...图中给出了AH隧道模式中的认证部分。AH隧道模式为整个数据包提供完整性检查和认证,认证功能优于ESP。但在隧道技术中,AH协议很少单独实现,通常与ESP协议组合使用。

51720

learning:MSS application in IPSec tunnel

在《解决 GRE 和 IPsec 中的 IPv4 分段、MTU、MSS和PMTUD 问题》文章中纯ipsec隧道下性能损耗预估:Note:当使用 IPv4sec 进行硬件加密时,确实需要避免在封装后进行分段...通常,在两个安全网关(路由器)之间的数据流量,绝大部分都不是安全网关本身的通讯量,因此在安全网关之间一般不使用传输模式,而总是使用隧道模式。在一个安全网关被加密的报文,只有另一个安全网关能够解密。...58 字节为使用 IPv4sec ESP 和 ESPauth 时的最大 IPv4sec 开销。实际的 IPv4sec 开销可能比该值少 7 个字节。...7.当主机 1 再次重新传输数据时,将使用较小的数据包 (1342)。此数据包不需要分段,并将通过 IPv4sec 隧道成功到达主机 2。...路径:src/vnet/ip/ip_path_mtu.c 基于vpp21.1版本验证 1、基本组网 本文是使用wmware虚拟机创建vm1和vm2来搭建ipsec的基本测试环境:(所有的连接都使用虚拟机的

1.5K20
  • 它是如何工作的?

    通信双方通过IPsec建立一条IPsec隧道,IP数据包通过IPsec隧道进行加密传输,有效保证了数据在不安全的网络环境如Internet中传输的安全性。 什么是IPsec V**?...其协议主要工作在IP层,在IP层对数据包进行加密和验证。 相对于其他V**技术,IPsec V**安全性更高,数据在IPsec隧道中都是加密传输,但相应的IPsec V**在配置和组网部署上更复杂。...SA是通信双方对某些协商要素的约定,比如双方使用的安全协议、数据传输采用的封装模式、协议采用的加密和验证算法、用于数据传输的密钥等,通信双方之间只有建立了SA,才能进行安全的数据传输。...IPsec为了保证数据传输的安全性,在这一阶段需要通过AH或ESP协议对数据进行加密和验证。...如图所示,IPsec发送方会使用加密算法和加密密钥对报文进行加密,即将原始数据“乔装打扮”封装起来。然后发送方和接收方分别通过相同的验证算法和验证密钥对加密后的报文进行处理得到完整性校验值ICV。

    1.3K10

    现代密码学实践指南

    密码学理论艰深,概念繁多,本人知识水平有限,错误难免,如果您发现错误,请务必指出,非常感谢! ---- 下文分类介绍在各种适用场景下,你应该使用的现代密码学算法 1....非对称加密 应该使用NaCl库 适用场景:当你需要加密消息,发给陌生人,并且对方异步接收消息,做离线解密时。...这条是几条之中最难做正确的,不要使用底层的密码学库,比如OpenSSL或者BouncyCastle。...但是绝对不要自己实现Curve25519,也绝对不要自己移植Curve25519的C代码 如果你不能使用第三方ECDH库,但是可以使用DH库,那就使用DH-2048,使用1个标准的2048 bit的群。...AES-GCM AES-GCM是一种AEAD,是目前TLS的主力算法,互联网上https流量的大部分依赖使用AES-GCM。 6.

    1K20

    基于vpp搭建ipsec环境

    ipsec加密流程如下: ipsec使用DPDK Cryptodev IPsec 库加速 VPP的默认实现包括IPsec功能,该功能依赖于OpenSSL库,在ipsec加密和解密流程中存在报文缓存区替换过程...DPDK Cryptodev库提供了用于管理和配置硬件和软件加密轮询模式驱动程序的加密设备框架,并定义了支持多种不同Crypto操作的通用API。...在VPP中启用DPDK Cryptodev可以提升常见IPsec加密和认证算法的性能,包括在VPP默认实现中无法启用的AES-GCM。...2、IPsec库的英特尔®多缓冲加密器,用于大幅优化软件实施。 3、英特尔®智能存储加速库(英特尔®ISA-L),用于大幅优化AES-GCM算法的软件实施。...总结 介绍介绍vpp使用ikev2协议创建ipsec隧道、熟悉其转发流程;使用dpdk_crypto pmd的配置方法及转发流程,在ipsec基础上搭建ipsec over gre流程。

    4.2K20

    JuiceFS 数据加密原理

    加密和解密方法 必须为每个加密的文件系统创建一个全局 RSA 密钥 M。在对象存储中保存的每个对象都将有自己的随机对称密钥 S。...数据用对称密钥 S 进行 AES-GCM 加密,S 用全局 RSA 密钥 M 进行加密,RSA 密钥使用用户指定的口令进行加密。...基于 AES-GCM 使用 S 和 N 对每个块进行加密。 使用 RSA 密钥 M 对对称密钥 S 进行加密得到密文 K 。 将加密后的数据、密文 K 和随机种子 N 组合成对象,然后写入对象存储。...基于 AES-GCM 使用 S 和 N 解密数据得到数据块明文。 对数据块解压缩。 密钥管理 在启用加密功能时,RSA 密钥的安全是极其重要的。如果密钥被泄露,可能会导致数据泄露。...当使用 juicefs format 创建一个新卷时,可以通过 --encrypt-rsa-key 参数指定 RSA 私钥来启用静态加密,该私钥将会被保存到 Redis。

    79020

    Shellcode与加密流量之间的那些事儿

    协议和代码库 当我们在思考加密协议时,第一个想到的很可能是安全传输层协议(TLS),因为它是针对Web安全的工业级标准。...流密码 另外两种针对认证加密的热门算法(AES-GCM的替换)就是ChaCha20和Poly1305了,但是ChaCha20采用的是200字节,而Poly1305为330字节。...置换函数 如果你花了很多时间去测试各种加密算法的话,你最终会发现在构造流密码、分组密码、加密认证模型、加密哈希函数和随机数生成器时,你需要的仅仅只是一个置换函数。...Speck和LightMAC 一开始,我使用的是下面这段代码来对数据包的加密进行验证,它使用了Encrypt-then-MAC (EtM),而且这种方法比其他的方法要更安全,比如说MAC-then-Encrypt...write(c->fdw, c->buf, len);} 在Linux Shell中使用这段代码之前,我们需要声明两个单独的加密上下文来处理输入、输出和128位的静态密钥: //using a

    75020

    HTTPS网络安全与SSL证书相关术语合集

    使用CAA可以避免一些CA签发错误证书的情况。...CSR CSR(Certificate Signing Request),在PKI系统中,CSR文件必须在申请和购买SSL证书之前创建,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件...W3C 的 SRI(Subresource Integrity)规范可以用来解决这个问题。SRI 通过在页面引用资源时指定资源的摘要签名,来实现让浏览器验证资源是否被篡改的目的。...此问题的原因是在实现TLS的心跳扩展时没有对输入进行适当的验证(缺少边界检查),该程序错误属于缓冲区过读,即可以读取的数据比应该允许读取的还多。 RC4 是一种流加密算法,对称加密,密钥长度可变。...AES-GCM是一种AEAD,是目前TLS的主力算法,互联网上https流量的大部分依赖使用AES-GCM。

    1.5K50

    基于 TLS 1.3的微信安全通信协议 mmtls 介绍(下)

    mmtls 经过综合考虑,选择了使用 AES-GCM 这种 AEAD 类算法,作为协议的认证加密组件,而且 AES-GCM 也是 TLS1.3 要求必须实现的算法。...3.3.2 密钥扩展 TLS1.3 明确要求通信双方使用的对称加密 Key 不能完全一样,否则在一些对称加密算法下会被完全攻破,即使是使用 AES-GCM 算法,如果通信双方使用完全相同的加密密钥进行通信...,以及 Server 解密) Server Write Encryption Key(用做 Server 做加密,以及 Client 解密) Client Write IV (Client 加密时使用的初始化向量...) Server Write IV (Server 加密时使用的初始化向量) 当然,使用 AES-GCM 作为对称加密组件,MAC Key 和 Encryption Key 只需要一个就可以了。...四、小结 mmtls 是参考 TLS1.3 草案标准设计与实现的,使用 ECDH 来做密钥协商,ECDSA 进行签名验证,AES-GCM 作为对称加密算法来对业务数据包进行认证加密,使用 HKDF 进行密钥扩展

    9.1K10

    【All In One】一文详解IPsec隧道

    2.5 AH与ESP协议AH协议(Authentication Header,验证头部协议):可以证明数据的起源地、保障数据的完整性以及防止相同数据包在因特网重播,使用IP协议号51。...实际上它是用来标识发送方在处理IP数据包时使用了哪些安全策略,当接收方看到这个字段后就知道如何处理收到的IPsec包。序列号(32位):一个单调递增的计数器,为每个AH包赋予一个序号。...包含完整性验证码,也就是HMAC算法的结果,称为ICV,它的生成算法由SA指定。...ESP通常使用DES,3DES,AES和其他加密算法来加密数据。使用MD5或SHA1。实现数据完整性。安全参数索引SPI(32位):值为[256,232-1]。...但是,这也使得接收端无法检测IP头部被修改的情况(只要保证校验和计算正确),故ESP的验证服务没有AH的验证服务强大。所以,AH主要用于验证IP头部,ESP主要用于加密,通常会将两者嵌套使用。3.

    1.5K10

    网络安全与IP安全网络安全

    提供IPsec服务的两个协议:认证头ah:IP数据报头协议号51,提供源认证和数据完整性检验,不提供机密性;封装安全头esp:IP数据报头协议号50,提供源认证,数据完整性和机密性服务,比ah应用更广泛...web应用安全主动攻击:篡改c/s间信息或站点信息,难防易检;被动攻击:监听或信息量分析,难检易防。...无线局域网安全wep有线等效保密,使用对称秘钥加密,自同步(每个分组单独加密);加密实现过程如下:计算出数据完整校验值icv,附于数据后四位测测,每端有104位共享秘钥,发送端生成24位初始向量附到秘钥上...,发送端附加8位keyid,128位秘钥输入到伪随机数发生器产生秘钥流,利用rc4算法加密数据+icv。...解密过程:提取iviv与共享秘钥输入伪随机数发生器得到秘钥流逐字节异或解密d与icv利用icv校验完整性破解漏洞每帧一个24位的iv导致最终会被重用iv以明文传输,重用的iv易被检测攻击诱使加密已知明文

    1.7K20

    Shiro高版本默认密钥的漏洞利用

    在Shiro反序列化漏洞修复的过程中,如果仅进行Shiro的版本升级,而没有重新生成密钥,那么AES加密的默认密钥扔硬编码在代码里,仍然会存在反序列化风险。...注意:在Shiro1.4.2版本后,Shiro的加密模式由AES-CBC更换为 AES-GCM,Shiro高版本下的漏洞利用,就需要考虑加密模式变化的情况。...02、漏洞利用 为了减少手工构造生成反序列化数据的繁琐,这里,我们使用一个Shiro反序列化利用工具,python编写,而且作者增加了AES-GCM加密方式的漏洞利用支持,可以很方便地进行修改和参数构建...python shiro-exploit.py echo -g CommonsBeanutils2 -v 2 -k 3AvVhmFLUs0KTA3Kprsdag== -c whoami -u http...这样就可以将流量引入BurpSuite,抓取HTTP数据包,手动利用查看回显。

    2.9K70

    Python AES加密详解与实践

    encode('utf-8') # 使用PKCS#7填充明文数据到AES块大小的倍数 padded_data = pad(plain_text, AES.block_size) # 创建AES加密器...(对于AES-GCM,推荐使用128位(16字节)或256位(32字节)的密钥) key = get_random_bytes(32) # 生成一个32字节(256位)的密钥 # 生成随机的nonce...AES-GCM加密!"....encode('utf-8') # AES-GCM不需要传统的填充,但我们可以使用pad函数以确保与可能的其他加密模式兼容(尽管在这里是多余的) # 注意:对于GCM,实际上应该直接加密原始明文,不需要填充...# 由于GCM模式下不需要填充,我们直接加密原始明文 # 创建AES-GCM加密器 cipher = AES.new(key, AES.MODE_GCM, nonce=nonce) # 加密数据并获取密文和认证标签

    51910

    CTP 看穿式监管版本,收集信息为什么会失败?

    新版本中会自动采集使用者电脑的一些信息(例如CPU_ID, Disk_ID, BIOS_ID)。然后把采集的信息通过网络报送给期货公司。...至此得到本文第一个重要结论: 结论1:CTP 库函数 ReqUserLogin 执行时,将采集到的系统信息发送了出去。 这个数据包中的系统信息明显是经过加密的,并不能直接看出其中包含的内容的含义。...至此得到本文第二个重要结论: 结论2:CTP 库函数 ReqUserLogin 采集系统信息,并将采集到的信息经过 RSA 加密后通过网络数据包发送给了期货公司。...那么要执行这条指令,可以先创建一个管道 Pipe,再创建一个进程 S,进程 S 收集系统信息,并写 Pipe,然后我的程序读 Pipe,拿到 S 收集到的信息。...因此当断点停在 CreateProcessA@40 时,表示已经进入了此函数体,此时 esp 中的值为返回地址,esp + 4 中的值为 lpApplicationName,esp + 8 中的值为 lpCommandLine

    6.5K31

    Pandas高级数据处理:数据加密与解密

    性能问题问题描述:加密和解密操作可能会消耗大量计算资源,尤其是在处理大规模数据时。解决方案:只加密必要的敏感数据,而不是整个数据集。使用多线程或分布式计算框架(如Dask)来加速加密和解密过程。...解决方案:确保在加密和解密时使用相同的字符编码(如UTF-8)。在加密前将字符串转换为字节串,在解密后将其转换回字符串。4....数据完整性验证问题描述:加密后的数据可能在传输或存储过程中被篡改,导致解密失败或数据不一致。解决方案:使用带有消息认证码(MAC)的加密算法(如AES-GCM),以确保数据的完整性和真实性。...在加密前计算数据的哈希值,并在解密后进行验证。常见报错及解决方法1. InvalidToken 错误报错描述:解密时抛出InvalidToken错误,表示密钥无效或数据已被篡改。...TypeError: a bytes-like object is required, not 'str'报错描述:在加密或解密时出现类型错误,表示输入的数据类型不匹配。

    8910

    20.7 OpenSSL 套接字SSL加密传输

    在 SSL/TLS 协议中,加密算法是其中最核心的组成部分之一,SSL可以使用各类加密算法进行密钥协商,一般来说会使用RSA等加密算法,使用TLS加密针对服务端来说则需要同时载入公钥与私钥文件,当传输被建立后客户端会自行下载公钥并与服务端完成握手...与RSA实现加密传输一致,使用SSL实现加密传输读者同样需要自行生成对应的密钥对,密钥对的生成可以使用如下命令实现; 生成私钥: openssl genrsa -out privkey.pem 2048...服务端实现代码与原生套接字通信保持高度一致,在连接方式上同样采用了标准API实现,唯一的不同在于当accept函数接收到用于请求时,我们需要通过SSL_new产生一个SSL对象,当需要发送数据时使用SSL_write...,而当需要接收数据时则使用SSL_read函数,通过使用这两个函数即可保证中间的传输流程是安全的,其他流程与标准套接字编程保持一致,如下是服务端完整代码实现。...,至此两者的通信数据包将被加密传输,从而保证了数据的安全性。

    44860

    20.7 OpenSSL 套接字SSL加密传输

    在 SSL/TLS 协议中,加密算法是其中最核心的组成部分之一,SSL可以使用各类加密算法进行密钥协商,一般来说会使用RSA等加密算法,使用TLS加密针对服务端来说则需要同时载入公钥与私钥文件,当传输被建立后客户端会自行下载公钥并与服务端完成握手...与RSA实现加密传输一致,使用SSL实现加密传输读者同样需要自行生成对应的密钥对,密钥对的生成可以使用如下命令实现;生成私钥: openssl genrsa -out privkey.pem 2048生成公钥...服务端实现代码与原生套接字通信保持高度一致,在连接方式上同样采用了标准API实现,唯一的不同在于当accept函数接收到用于请求时,我们需要通过SSL_new产生一个SSL对象,当需要发送数据时使用SSL_write...,而当需要接收数据时则使用SSL_read函数,通过使用这两个函数即可保证中间的传输流程是安全的,其他流程与标准套接字编程保持一致,如下是服务端完整代码实现。...,至此两者的通信数据包将被加密传输,从而保证了数据的安全性。

    40120

    TLS协议分析 (三) record协议

    key做加密/解密 算HMAC,对数据计算HMAC,并且验证收到的数据包的HMAC正确性 发给tcp/ip,把数据发送给 TCP/IP 做传输(或其它ipc机制)。...sequence number在每个record被发送时都增加1。并且传输的第1个Record必须使用0作为sequence number。 此处有几个问题值得思考: (1)....为什么client和server要使用不同的key 如果TLS的双方使用相同的key,那么当使用stream cipher加密应用数据的时候,stream cipher的字节流在两个方向是一样的,如果攻击者知道...还有,当使用 aead 比如 aes-gcm 做加密的时候,aead标准严格要求,绝对不能用相同的 key+nonce 加密不同的明文,故如果TLS双方使用相同的key,又从相同的数字开始给nonce递增...,所以TLS协议规定使用 2.MAC-then-Encrypt,即先计算MAC,然后把 “明文+MAC” 再加密(块加密或者流加密)的方式,做流加密+MAC,和块加密+MAC。

    1.4K30
    领券