Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

2024-05-22

对于下面的RSA加密代码,每次对同一条消息进行加密时,结果都会不同。我发现这是由于rand.Reader in the rsa.EncryptOAEP功能使其更加安全doc https://pkg.go.dev/crypto/rsa#EncryptOAEP。但每次进行 RSA 加密时,我都希望同一条消息得到相同的结果。如何使用 Golang 来做到这一点?有一个类似的问题 https://stackoverflow.com/questions/43796080/how-do-i-do-deterministic-rsa-in-go但似乎答案并不是如何实现这一目标。谢谢你!

package main

import (
    "crypto"
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "fmt"
)

func main() {
    privateKey, err := rsa.GenerateKey(rand.Reader, 1024)
    if err != nil {
        panic(err)
    }
    publicKey := privateKey.PublicKey  
    message := "super secret message"
    encryptedBytes, err := rsa.EncryptOAEP(
        sha256.New(),
        rand.Reader,
        &publicKey,
        []byte(message),
        nil)
    if err != nil {
        panic(err)
    }
    fmt.Println("encrypted bytes: ", encryptedBytes)   
}

Update:我想做确定性 RSA,因为在使用需要确定性输出的 Hyperledger Fabric 链码(区块链智能合约)时我想要确定性加密结果。谢谢大家的警告。那么我想我应该关注如何在链码中启用这些加密算法。相关问题 https://stackoverflow.com/questions/72022612/encrypting-data-using-hyperledger-fabric-chaincode-smart-contract如果有帮助的话,供后来者参考:)


正如您所读到的,这种方法破坏了算法非常重要的安全功能,并且绝不能用于保护任何类型的实时系统。但是,对于某些类型的测试和开发来说,它可能很有用。我假设这就是你的意思。

关键是rsa.EncryptOAEP接受任意的io.Reader为其熵。它不是require这是一个rand.Reader。如果你不关心系统的安全性,它可以是任何你喜欢的。例如,您可以构建一个永远返回零的“零读取器”:

type zeroReader struct{}
func (z zeroReader) Read(p []byte) (n int, err error) {
    for i, _ := range p {
        p[i] = 0
    }
    n = len(p)
    return
}

这样你就可以通过zeroReader{}作为你的熵:

// !!! The security of this call is completely broken !!!
// !!! It must never be used on live data             !!!
encryptedBytes, err := rsa.EncryptOAEP(
    sha256.New(),
    zeroReader{}, // !!! I am intentionally breaking the security here !!!
    &publicKey,
    []byte(message),
    nil)

如果您确实打算将其用于任何类型的实时数据,那么您必须重新设计系统以不需要此功能。就像您链接的问题一样,人们常常尝试这样做,因为他们误解了 RSA。不要那样做。

操场 https://go.dev/play/p/8C8qg3F9See

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

Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果 的相关文章

  • 在函数中将通道作为参数传递的不同方法

    我正在阅读一些Go代码 并说了几种传递Go通道的不同方法 也许它们是相同的 但我想知道是否有任何区别 因为我无法在线找到文档 1 func serve ch lt chan interface do stuff 2 func serve c
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • Java - 使用数组中的值的replace()方法正在更改数组值?

    我正在做类似的事情 public static String list a b c d It gives me a NullPointeException if I didn t use static public String encry
  • 静态加密数据时 ElasticSearch 的工作原理

    我的数据存在于 DynamoDB 中 为了启用全文搜索 我使用 Lambda 函数将其转发到 ES 索引 但如果可能的话 我希望在不影响搜索效率的情况下对数据进行加密 但我不确定我的搜索在这里如何进行 我找不到任何文档 文章来说明当数据静态
  • 在 ruby​​ 中读/写受密码保护和加密的文件

    我想加密一个 ruby 程序将从中加载数据的文件 此外 我需要程序在启动时提示输入密码 该密码将用于解密文件 换句话说 该文件需要加密地驻留在计算机上 只有拥有密码的用户才能运行该应用程序 我已经开始研究 openpgp 但据我了解 这仍然
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle
  • golang mongodb (mgo) 没有插入文档

    我在使用 mgo 在 mongodb 中保存 golang 结构时遇到问题 type AN Track Log struct Id bson ObjectId bson id omitempty user session id str st
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • 使用 Gorilla 会话自定义后端有什么优势?

    我想使用 Redis 进行会话管理 但我不明白使用 Redis 作为 Gorilla 会话包的自定义后端比直接使用它有什么优势 Gorilla 会话包的链接 http www gorillatoolkit org pkg sessions
  • RSA 已处置对象错误 - 所有其他测试

    我们有几个测试生成 jwt 请求来调用服务器来检索令牌 我们有 6 个测试 使用相同的数据对相同的方法进行相同的调用 方法如下 private static string GenerateSignedTokenRequest string
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio

随机推荐