AEAD(Authenticated Encryption with Associated Data) 认证加密之 AES-GCM-程序员宅基地

技术标签: 安全相关  Go  AEAD  AES-GCM  加密和认证  

AEAD(Authenticated Encryption with Associated Data) 认证加密之 AES-GCM

1. 什么是AEAD

AEAD(Authenticated Encryption with Associated Data)模式是一个密码学的规范和标准。它规定了一种同时提供认证和加密的算法模式。

AEAD模式是现代加密算法和协议的基石,它提供了更高的安全性。许多标准都采用了AEAD模式,如:

  • TLS 1.3使用AES-GCM作为AEAD算法

  • SSH也有采用AEAD的加密方式,如[email protected]

  • IPsec也有AEAD算法,如AES-GCM-ESP

  • QUIC也使用了AEAD,如AES-GCM和Chacha20-Poly1305

可以说AEAD模式已经成为主流的安全通信协议和标准中广泛采用的加密规范。它提供了更高的安全性,同时具有更高的效率。

结论:AEAD模式是一个密码学的规范和标准。它定义了一种同时提供认证和加密的算法模式,已经被广泛采用于各种主流的安全通讯协议和标准中。

2. 什么是aes-gcm

AES-GCM是高级加密标准(AES)的一种工作模式,全称是Galois/Counter Mode。

它是一种有效的authenticated encryption算法,无需额外的认证算法,AES-GCM自带认证功能,可以同时完成加密和认证

AES-GCM模式的主要特点有:

  1. 基于AES算法,使用AES的密码块进行加密操作
  2. 使用Galois字段上的乘法进行认证,可以有效防止修改和重放攻击
  3. 使用计数器(Counter)来避免在加密相同的明文时产生相同的密文,增强安全性
  4. 认证标签长度较短(只有16字节),性能和带宽开销小

AES-GCM模式是目前比较流行和高效的authenticated encryption算法,已被TLS、IPsec、MACsec等大量安全协议采用,在云计算、物联网和5G等领域有广泛的应用。

AES加密 GCM和CBC模式的区别

AES加密 GCM和CBC模式的区别
参考URL: https://www.bilibili.com/video/BV1Pp4y1H7Cs/

  1. 认证功能
    AES-GCM模式带有认证功能,可以同时进行加密和认证,防止数据被篡改。
    AES-CBC模式仅提供加密,需要额外的HMAC算法进行认证。
  2. 序号使用
    AES-GCM模式使用顺序计数器作为初始化向量,可以有效防止重放攻击。
    AES-CBC模式使用随机初始化向量,需要其他机制防止重放攻击。
  3. 性能影响
    AES-GCM模式的认证只增加了16字节的认证标签,性能影响较小。
    AES-CBC模式需要HMAC算法进行认证,会产生更大的性能开销。
  4. 带宽开销
    AES-GCM模式只需携带16字节的认证标签,带宽开销较小。
    AES-CBC模式需要同时携带HMAC产生的认证值,带宽开销较大。
  5. 标准支持
    AES-GCM已被TLS 1.2/1.3、IPsec、MACsec等大量标准和协议支持和采用。
    AES-CBC逐渐被新的AES-GCM模式替代,标准支持度较差。
    总之,AES-GCM模式具有如下主要优势:
  • 带有认证功能,安全性高,可以防范修改和重放攻击
  • 认证机制简单高效,性能和带宽开销小
  • 序号使用可以有效防止重放攻击
  • 已广泛被安全标准和协议采用
    所以,AES-GCM模式是目前得到广泛支持和应用的高安全加密模式,相比之下AES-CBC模式安全性和标准支持度较差。

当需要同时进行加密和认证时,AES-GCM模式是一个很好的选择。

伽罗瓦计数器模式 GCM 原理

TODO

3. 使用AES-GCM对数据加密与解密的Go代码示例

// Encrypt 加密 使用AES-GCM
func Encrypt(plaintext string, key []byte) (string, []byte) {
    
    // Create AES-GCM
    block, err := aes.NewCipher(key)
    if err != nil {
    
        panic(err)
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
    
        panic(err)
    }

    // Create nonce
    nonce := make([]byte, gcm.NonceSize())
    if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
    
        panic(err)
    }

    // Encrypt and seal data
    ciphertext := gcm.Seal(nil, nonce, []byte(plaintext), nil)

    return hex.EncodeToString(ciphertext), nonce  // 返回nonce
}

// Decrypt 解密 使用AES-GCM
func Decrypt(ciphertext string, nonce []byte, key []byte) (string, error) {
    
    // Decode hex
    ciphertextByte, _ := hex.DecodeString(ciphertext)

    // Create AES-GCM
    block, err := aes.NewCipher(key)
    if err != nil {
    
        panic(err)
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
    
        panic(err) 
    }

    // Decrypt 
    plaintext, err := gcm.Open(nil, nonce, ciphertextByte, nil)
    if err != nil {
    
        return "", err
    }

    return string(plaintext), nil
}
  • 在Encrypt()中生成随机Nonce,并将其与密文一起返回。
  • 在Decrypt()中使用Encrypt()返回的Nonce进行解密。
    这样可以确保在每次加密解密时都使用不同的Nonce,有效地防止重放攻击,提高安全性。

解密数据报错:panic: cipher: message authentication failed

AES-GCM模式同时提供数据的保密性和完整性。在解密数据时,需要验证认证标签来确认数据完整性。如果验证失败,会产生这个panic错误。
这个错误的常见原因有:

  1. 非法Nonce。AES-GCM需要使用与加密相同的Nonce来解密,如果Nonce不同会导致认证失败。
  2. 数据被篡改。如果密文的数据被篡改过,解密时会验证认证失败并panic。
  3. 错误密钥。使用错误的密钥解密数据也会导致认证失败。

重点先确认:确认输入的Nonce与加密时使用的相同
4. 在加密和解密时生成并使用相同的随机Nonce。
5. 如果Nonce不能提前生成,则在加密时将其与密文一起返回,解密时从输入中获取正确的Nonce。
6. 无论何种情况,必须保证解密使用的Nonce与加密相同,否则会导致认证失败并panic。

gcm.NonceSize()

在AES-GCM模式中,Nonce的大小是可配置的,并不一定相同。
gcm.NonceSize()方法会返回对应AES-GCM实例配置的Nonce大小。在创建AES-GCM实例时,可以指定Nonce的大小,例如:
go

block, err := aes.NewCipher(key)
if err != nil {
    
   panic(err)
}
// 指定Nonce大小为12字节
gcm, err := cipher.NewGCM(block, 12) 

所以,不同的AES-GCM实例可以有不同的Nonce大小,gcm.NonceSize()返回对应实例配置的值。

因此,为了成功解密,客户端必须提前知晓nonce的大小,并在解密时使用相同大小的nonce。

4. AES-GCM模式中的消息认证与HMAC区别

AES-GCM使用的认证机制并不是HMAC,两者有以下主要区别:

  1. HMAC使用专门的Hash算法(如SHA-256)计算MAC,AES-GCM使用AES算法本身产生认证值。
  2. AES-GCM的认证是通过Galois/Counter Mode(GCM)模式产生的,而HMAC直接使用Hash算法计算HMAC值。
  3. AES-GCM的认证使用了一个附加的Nonce值,而HMAC直接使用共享密钥和消息。
  4. AES-GCM同时提供了数据的机密性和完整性保护,HMAC只提供完整性保护。

AES-GCM通过其模式(GCM)和Nonce为每条消息生成认证值,并利用AES算法实现机密性保护

在AES-GCM中,收发双方生成相同的Nonce和认证值可以证明双方知晓相同的Nonce。但是,这只是实现过程的一部分,Nonce的主要目的是用于防止重放攻击和区分不同消息,认证值才是真正用来验证消息完整性的凭证。

总之,AES-GCM和HMAC都是基于共享密钥的消息认证机制,但两者的具体实现方式不同。AES-GCM提供了认证与加密的全套解决方案,其安全性也高于HMAC。

就是说AES-GCM不光有认证,还有加密的功效。两者的实现原理完全不同。

5. aec-cgm 知道密文、nonce ,不知道私钥,有安全风险吗?

在AES-GCM加密模式下,如果攻击者知道密文和Nonce,但不知道私钥,仍存在一定的安全风险。
这是因为AES-GCM模式下使用的Nonce如果在加密不同的密文时重复使用,会导致重放攻击的安全风险。

攻击者可以使用被加密的原始密文与其对应的Nonce来伪造新的有效密文。
例如,如果使用相同的Nonce加密两个不同的密文得到:
Ciphertext1 = Encrypt(Plaintext1, Nonce, Key)
Ciphertext2 = Encrypt(Plaintext2, Nonce, Key)
那么攻击者可以将Ciphertext1解密得到Plaintext1, 然后使用相同的Nonce和Key重新加密Plaintext2得到Ciphertext1’。
Ciphertext1’ 也是一个有效的密文,也可以正确解密。这样就造成了重放攻击。

为了防止这种攻击,AES-GCM模式下必须要使用不同的随机Nonce对不同的明文进行加密。

所以,如果攻击者知道某个密文和其对应的Nonce,就可以使用这个Nonce重新加密其他的明文,伪造新的密文,这是一定的安全风险。
不过,如果除Nonce外,攻击者还不知道私钥,那么他仍然无法解密阅读原始的密文,或是解密伪造出的新的有效密文。私钥的安全仍然是最重要的一环。

总结:在AES-GCM模式下,如果攻击者知道某个密文与其Nonce,由于存在重放攻击的风险,理论上可以伪造新的有效密文。
但如果私钥仍然安全,他们无法解密任何密文,安全性仍然可以得到基本保障。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/inthat/article/details/131105960

智能推荐

彻底扒光 通过智能路由器拆解看其本质-程序员宅基地

文章浏览阅读1.7k次。可以看到很多联发科的MT芯片摘自:https://net.zol.com.cn/531/5312999.html彻底扒光 通过智能路由器拆解看其本质2015-07-23 00:40:00[中关村在线 原创] 作者:陈赫|责编:白宁收藏文章 分享到 评论(24)关注智能路由器拆解的朋友们注意啦!我们已经将这五款产品彻底扒开,将主板的真容展现在了大家的眼前。网友们可以看见这些智能路由器主板的做工和用料,我们还为网友们展示了主要的电子元器件,供大家品评观赏。..._路由器拆解

Java--深入JDK和hotspot底层源码剖析Thread的run()、start()方法执行过程_jdk的源码hotspot跟jdk是分开的-程序员宅基地

文章浏览阅读2.1k次,点赞101次,收藏78次。【学习背景】今天主要是来了解Java线程Thread中的run()、start()两个方法的执行有哪些区别,会给出一个简单的测试代码样例,快速理解两者的区别,再从源码层面去追溯start()底层是如何最终调用Thread#run()方法的,个人觉得这样的学习不论对面试,还是实际编程来说都是比较有帮助的。进入正文~学习目录一、代码测试二、源码分析2.1 run()方法2.2 start()方法三、使用总结一、代码测试执行Thread的run()、start()方法的测试代码如下:public_jdk的源码hotspot跟jdk是分开的

透视俄乌网络战之一:数据擦除软件_俄乌网络战观察(一)-程序员宅基地

文章浏览阅读4.4k次,点赞90次,收藏85次。俄乌冲突中,各方势力通过数据擦除恶意软件破坏关键信息基础设施计算机的数据,达到深度致瘫的效果,同时窃取重要敏感信息。_俄乌网络战观察(一)

Maven私服仓库配置-Nexus详解_nexus maven-程序员宅基地

文章浏览阅读1.7w次,点赞23次,收藏139次。Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。当然也并不是说私服只能建立在局域网,也有很多公司会直接把私服部署到公网,具体还是得看公司业务的性质是否是保密的等等,因为局域网的话只能在公司用,部署到公网的话员工在家里也可以办公使用。_nexus maven

基于AI的计算机视觉识别在Java项目中的使用 (四) —— 准备训练数据_java ocr ai识别训练-程序员宅基地

文章浏览阅读934次。我先用所有的样本数据对模型做几轮初步训练,让深度神经模型基本拟合(数万条记录的训练集,识别率到99%左右),具备初步的识别能力,这时的模型就是“直男”。相较于训练很多轮、拟合程度很高的“油腻男”,它的拟合程度较低,还是“直男愣头青”。..............._java ocr ai识别训练

hibernate 数据库类型 date没有时分秒解决_hibernate解析時間只有年月日沒有時分秒-程序员宅基地

文章浏览阅读688次。一、问题现象:  在数据库表中日期字段中存的日期光有年月日,没有时分秒。二、产生原因:三 解决办法   检查表的相应映射xml文件。 <property name="operateDate" type="Date">如果同上面所写,那问题出在 type类型上了正确写法 :<property name="operateDate" type="java.util..._hibernate解析時間只有年月日沒有時分秒

随便推点

springbbot运行无法编译成功,找不到jar包报错:Error:(3, 46) java: 程序包org.springframework.context.annotation不存在-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏2次。文章目录问题描述:解决方案:问题描述:提示:idea springbbot运行无法编译成功,找不到jar包报错E:\ideaProject\demokkkk\src\main\java\com\example\demo\config\WebSocketConfig.javaError:(3, 46) java: 程序包org.springframework.context.annotation不存在Error:(4, 46) java: 程序包org.springframework.conte_error:(3, 46) java: 程序包org.springframework.context.annotation不存在

react常见面试题_recate面试-程序员宅基地

文章浏览阅读6.4k次,点赞6次,收藏36次。1、redux中间件中间件提供第三方插件的模式,自定义拦截 action -&gt; reducer 的过程。变为 action -&gt; middlewares -&gt; reducer 。这种机制可以让我们改变数据流,实现如异步 action ,action 过滤,日志输出,异常报告等功能。常见的中间件:redux-logger:提供日志输出redux-thunk:处理异步操作..._recate面试

交叉编译jpeglib遇到的问题-程序员宅基地

文章浏览阅读405次。由于要在开发板中加载libjpeg,不能使用gcc编译的库文件给以使用,需要自己配置使用另外的编译器编译该库文件。/usr/bin/ld:.libs/jaricom.o:RelocationsingenericELF(EM:40)/usr/bin/ld:.libs/jaricom.o:RelocationsingenericELF(EM:40)...._jpeg_utils.lo: relocations in generic elf (em: 8) error adding symbols: file

【办公类-22-06】周计划系列(1)“信息窗” (2024年调整版本)-程序员宅基地

文章浏览阅读578次,点赞10次,收藏17次。【办公类-22-06】周计划系列(1)“信息窗” (2024年调整版本)

SEO优化_百度seo resetful-程序员宅基地

文章浏览阅读309次。SEO全称为Search Engine Optimization,中文解释为搜索引擎优化。一般指通过对网站内部调整优化及站外优化,使网站满足搜索引擎收录排名需求,在搜索引擎中提高关键词排名,从而把精准..._百度seo resetful

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测_猎食者优化算法-程序员宅基地

文章浏览阅读438次。回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测_猎食者优化算法

推荐文章

热门文章

相关标签