Go AES CFB 兼容性

2024-01-04

我正在 Go 中开发一个依赖 AES CFB 的客户端应用程序。服务器端是用 C 编写的。我的问题是 Go 的 AES CFB 实现似乎与许多其他实现(包括 OpenSSL)不同。我写这篇文章是为了测试我的理论:-

package main

import (
  "fmt"
  "encoding/hex"
  "crypto/cipher"
  "crypto/aes"
)

func encrypt_aes_cfb(plain, key, iv []byte) (encrypted []byte) {
  block, err := aes.NewCipher(key)
  if err != nil {
    panic(err)
  }
  encrypted = make([]byte, len(plain))
  stream := cipher.NewCFBEncrypter(block, iv)
  stream.XORKeyStream(encrypted, plain)
  return
}

func decrypt_aes_cfb(encrypted, key, iv []byte) (plain []byte) {
  block, err := aes.NewCipher(key)
  if err != nil {
    panic(err)
  }
  plain = make([]byte, len(encrypted))
  stream := cipher.NewCFBDecrypter(block, iv)
  stream.XORKeyStream(plain, encrypted)
  return
}

func main() {
  plain := []byte("Hello world.....")
  key := []byte("01234567890123456789012345678901")
  iv := []byte("0123456789012345")
  enc := encrypt_aes_cfb(plain, key, iv)
  dec := decrypt_aes_cfb(enc, key, iv)
  fmt.Println("Key: ", hex.EncodeToString(key))
  fmt.Println("IV:  ", hex.EncodeToString(iv))
  fmt.Println("Enc: ", hex.EncodeToString(enc))
  fmt.Println("In:  ", hex.EncodeToString(plain))
  fmt.Println("Out: ", hex.EncodeToString(dec))
}

当它运行时,它似乎工作得很好,但是,如果将加密的字节粘贴到另一个 AES 实现中并使用相同的密钥和 IV 进行解密,则明文会被损坏(第一个字节除外)。http://aes.online-domain-tools.com/ http://aes.online-domain-tools.com/提供了一种简单的方法来测试这一点。对于为什么会发生这种情况以及如何解决它有什么建议吗?

谢谢 史蒂夫


(首先,强制性警告:CFB 模式是本土加密货币的标志。除非您正在实现 OpenPGP,否则您应该使用 AE 模式,如 AES-GCM 或 NaCl 的 Secretbox。如果您被迫使用 CFB 模式,我希望您至少使用 HMAC 来验证密文。)

除此之外,Go 中的 CFB 模式可以支持 OpenPGP。 (OpenPGP 使用一种称为 OCFB 的调整后的 CFB 模式,and标准 CFB 模式在不同的地方。)Go OpenPGP 代码似乎至少可以与其他实现进行互操作。

Nick 是正确的,Go 中缺少测试向量crypto包裹。测试来自 OpenPGP 代码,但包应该独立,所以我将添加测试crypto/cipher使用 [1] 的 F.3.13 节中的测试向量。

我对任何差异来源的最佳猜测是 CFB 由块大小参数化。这通常是底层密码的块大小的两位数的幂。如果未指定块大小,则通常将其视为密码块大小,这就是 Go 代码的作用。参见 [1],第 6.3 节。 [2]给出了更友好的解释。

小块大小在黑暗时代(90 年代末)使用,当时人们担心密文丢失时的密码重新同步等问题。如果另一个实现使用 CFB1 或 CFB8,那么它将与 Go 的 CFB 模式和许多其他模式非常不同。 (Go 的代码不支持较小的块大小。)

[1] http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf

[2] http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go AES CFB 兼容性 的相关文章

  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • Android 中的 AES 解密速度慢

    我尝试使用 AES 128 位密钥解密 4 2 MB dcf 文件 但解密需要 33 秒 在函数 cipher doFinal data 上 这正常吗 这是一个代码片段 long start System currentTimeMillis
  • 如何将接口转换为接口切片?

    我的输入是interface 而且我知道它可以是任何类型的数组 我想读取我输入的元素之一 所以我尝试将我的interface 进入一个 interface 但是 go 会给我以下错误 恐慌 接口转换 interface 是 map stri
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • 如何改进 kubernetes 集群容器中的随机数生成?

    我发现运行的容器内的随机数生成存在一些问题 在 kubernetes 集群中 重复值 可能是缺乏熵 在容器内部 或者它可能是更高级别的其他东西 但是 我想研究熵角 我有几个问题 很难找到答案 proc sys kernel random e
  • 实现具有更广泛方法签名的接口

    在Go中 是否有一种方法可以使用方法来实现接口 其中实现中相应方法的返回类型 比 预期返回类型 更宽 这很难解释 所以这里有一个例子 在 Go Playground 中运行以下示例代码时出现此错误 prog go 36 14 cannot
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • 使用 mgo 驱动程序进行 mongo 聚合查询

    我在 mongodb 中有以下查询 db devices aggregate match userId v73TuQqZykbxFXsWo state true project userId 1 categorySlug 1 weight
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • iOS SecKeyRef(公钥)将其发送到服务器[重复]

    这个问题在这里已经有答案了 现在我的公钥有问题 我使用 SecKeyGeneratePair 来生成公钥和私钥 现在我必须将我的公钥发送到服务器 我使用下面的方法将 SecKeyRef 转换为 NSData 我总是得到相同的公钥 不过我将其
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • 字节数组的快速位移 - CMAC 子键

    我需要尽可能快地实现 16 字节数组的左移JavaCard 我尝试了这段代码 private static final void rotateLeft final byte output final byte input short car
  • AES BadPaddingException

    如果我使用错误的密钥或错误的盐进行解密 则会引发 BadPaddingException 我希望返回一个不正确的字符串 doFinal 导致解密方法出现异常 信息 This is just an example Unfug S F V s
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录
  • 如何在 Go 中获取给定月份的第一个星期一?

    我正在尝试获取给定月份的第一个星期一 我能想到的最好方法是循环前 7 天 然后返回 Weekday Monday 有一个更好的方法吗 通过查看时间的 Weekday 您可以计算出第一个星期一 package main import fmt

随机推荐

  • 选择查询中 geo.distance 函数的返回值

    我正在使用 select 来查询索引 我想返回索引中 GeographyPoint 的距离 我正在尝试这样的事情 其中 GeoPoint 是位置字段 select ID geo distance GeoPoint geography POI
  • MySQL DELETE FROM 与 IN 条件的 UNION 子查询

    我遇到了一个奇怪的 SQL 错误 最后一个查询不起作用 当然 我可以将 DELETE 拆分为三个查询 但我真的想知道为什么 MySQL 不允许我这样做 一个小例子 SELECT id FROM stairs WHERE building 1
  • 如何测试某些程序集是否已加载到内存中? [复制]

    这个问题在这里已经有答案了 我有一些代码使用 Crystal Reports 运行时库来生成和丢弃一个小虚拟报告 以确保在用户创建真实报告之前将库及时加载到内存中 这是一个 感知性能 问题 当用户生成报告时 性能得到显着改善 因此显然一切正
  • 如何在日历日视图中添加圆形装饰器?

    我在用npanigrahy Custom Calendar View显示我的自定义日历 但我的问题是如何在日历中创建的事件上添加圆形项目符号 这是最好的使用方式this https github com prolificinteractiv
  • 无法为 iOS 编译 LAME

    我正在尝试将 lame mp3 编码器编译为 iOS 的静态库 我想支持所有架构 包括 i686 armv6 armv7 armv7s 和 arm64 这是我的构建脚本 bin bash DEVELOPER xcode select pri
  • 使用 Cocoa 遵循渐变路径

    我希望找到一种方法来遵循带有渐变的路径 以便渐变沿着路径的切线变化 Sorta like this 然而 到目前为止 我在搜索中找到的解决方案都使用了使用形状图层来掩盖渐变图层的变体 Which results in an unwanted
  • 没有 XmlRootElement 注释的 JAXB 解组?

    有没有什么方法可以在没有 XmlRootElement 注释的情况下对类进行解组 或者我们有义务输入注释吗 例如 public class Customer private String name private int age priva
  • 经典 ASP - 解析 JSON XMLHTTP 返回

    我无法找到一种好方法来解析从 XMLHTTP 获得的返回值 返回的是 JSON 用于获取 JSON 的 ASP 代码
  • 当我进行ajax调用时,尝试使用角度添加加载轮?

    我试图在进行 ajax 调用时实现加载轮指令 因此在响应时间内我想显示加载时间 使用下面的代码我没有看到任何错误 加载轮也没有 有没有更好的方法使用 angularJs 实现加载轮 or 下面的代码中实现了什么错误 主要 html
  • 缺少基础 SDK?

    我终于下载了新版本的 Xcode 和 iOS4 并最终尝试将我的第一个应用程序放到设备上 我正在查看配置文件并到达需要打开 Xcode 的地步 然后 设备 下拉菜单中只显示 Base SDK Missing 如果我进入 项目 gt 设置活动
  • TYPO3 TCA 类型在 FLUID 中选择?

    我在 T3 后端使用 TCA 类型选择 renderType selectMultipleSideBySide 这里是 TCA 代码 features gt array label gt Zusatz config gt array typ
  • 如何从 java.util.date 转换为 JodaTime 并获得相同的日期

    我关注这个问题 从 java util date 转换为 JodaTime https stackoverflow com questions 5042587 convert from java util date to jodatime
  • 为什么Java中的Float.MIN_VALUE是正值? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您认为 Float MIN VALU
  • CALayer:单个像素线看起来像 2 个像素

    这是我的代码 int columns 3 int columnWidth self layer bounds size width 3 for int c 1 c lt columns c CALayer layer CALayer lay
  • 与私有接口比较

    我有两个对象 key1属于类型 rsa PublicKey key2属于类型 ssh PublicKey这是一个隐藏了一个接口 ssh rsaPublicKey目的 ssh rsaPublicKey定义为 type ssh rsaPubli
  • 使用 rvest 提交表单时出现“错误:与 STRSXP 不兼容”

    我已经在 stackoverflow 和 github 上搜索过 但还没有看到这个问题的解决方案 session lt read html http www whitepages com form1 lt html form session
  • 在 Browserify 应用程序中注入数据

    这里有人知道如何将数据注入 Browserify 应用程序吗 我的意思是 我使用 Browserify 创建一个大的捆绑 app js 文件 但是当我的单页应用程序启动时 服务器还会将一些引导数据添加到加载应用程序的 HTML 页面中 以便
  • 使用 JPA 将某些字段的值设置为 null

    在jpa合并中 是所有列都更新还是仅更新具有新值的列 在更新时 如果我将某些属性的值设置为空 空值将存储在数据库的该列中 还是会保留以前的值 当合并实体X时 整个州X 的将被 合并 当然 如果 X 是有效的 候选者 JPA 1 0 规范是这
  • 具有 GridLayoutManager 的 RecyclerView 和具有不同 viewHolder 的第一个元素

    I need to create a recyclerView with a GridLayoutManager on two lines and the first element to be bigger than the rest T
  • Go AES CFB 兼容性

    我正在 Go 中开发一个依赖 AES CFB 的客户端应用程序 服务器端是用 C 编写的 我的问题是 Go 的 AES CFB 实现似乎与许多其他实现 包括 OpenSSL 不同 我写这篇文章是为了测试我的理论 package main i