首页
学习
活动
专区
工具
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数据包完整性校验值ICVICV,全称integrity check value。是在对无格式文本安全列表和补充计算得到,用于信息安全完整性检查。...一般AH为整个数据包提供完整性检查,但是在传输过程中,某些IP头字段会发生变化,且发送方无法预测数据包到达接收端此字段值。...图中给出了AH隧道模式中认证部分。AH隧道模式为整个数据包提供完整性检查和认证,认证功能优于ESP。但在隧道技术中,AH协议很少单独实现,通常与ESP协议组合使用

45620

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.4K20
  • 它是如何工作

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

    1.2K10

    现代密码学实践指南

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

    99920

    基于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流程。

    3.9K20

    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。

    76920

    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

    73020

    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.4K50

    基于 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 进行密钥扩展

    8.8K10

    【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.

    1K10

    网络安全与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.6K20

    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.8K70

    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.3K31

    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函数,通过使用这两个函数即可保证中间传输流程是安全,其他流程与标准套接字编程保持一致,如下是服务端完整代码实现。...,至此两者通信数据包将被加密传输,从而保证了数据安全性。

    42060

    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函数,通过使用这两个函数即可保证中间传输流程是安全,其他流程与标准套接字编程保持一致,如下是服务端完整代码实现。...,至此两者通信数据包将被加密传输,从而保证了数据安全性。

    36420

    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.3K30

    基于TLS1.3微信安全通信协议mmtls介绍

    TLS1.3彻底禁止AEAD以外其他算法。mmtls经过综合考虑,选择了使用AES-GCM这种AEAD类算法,作为协议认证加密组件,而且AES-GCM也是TLS1.3要求必须实现算法。   ...3.3.2 密钥扩展   TLS1.3明确要求通信双方使用对称加密Key不能完全一样,否则在一些对称加密算法下会被完全攻破,即使是使用AES-GCM算法,如果通信双方使用完全相同加密密钥进行通信,在使用时候也要小心翼翼保证一些额外条件...)  Server Write IV (Server加密使用初始化向量)   当然,使用AES-GCM作为对称加密组件,MAC Key和Encryption Key只需要一个就可以了。   ...可以将sequence number作为明文一部分,使用AES-GCM进行认证加密,明文变长了,不可避免会增加一点传输数据长度。...四、小结   mmtls是参考TLS1.3草案标准设计与实现使用ECDH来做密钥协商,ECDSA进行签名验证,AES-GCM作为对称加密算法来对业务数据包进行认证加密使用HKDF进行密钥扩展,摘要算法为

    5.6K111

    深入了解VoWiFi安全性

    这是通过嗅探虚拟接口epdg1获得信息,它包含了SIP服务器 — 用户客户端内信号流量。虚拟接口epdg1以ESP数据包封装在IPSec。此时此刻,这些都还没有进行加密。...当这些数据通过wlan0接口发送到服务器之后才使用 IPSec进行加密。我们仍然在尝试解密wlan0加密数据包过程以祈求能有更多精彩发现。...为了进行Wifi呼叫,电话中创建了一个IPSec信道。其集成了一个V**client后台进程,当进行呼叫操作会在第一间开始运行。...数据包 使用Gcrypt解密ESP数据包后得到SIP数据 在SIP数据包中发起了一个WiFi呼叫,我们可以挖掘出一些诸如私有IP,呼叫者IMEI,供应商等信息。...现下,我们将焦点注视在由V**client后台进程创建虚拟接口,实际上真实数据包由wlan0发送。这些都是加密并且密钥是由IKEv2协议生成。身份验证以及加密密钥都使用到EAP-AKA。

    1.4K100
    领券