为什么我用 openssl 和 golang 生成的 RSA 签名不同?

2023-12-02

我使用 openssl 命令对消息“Test.”进行签名,用 hexdump 输出

# echo "Test." | openssl rsautl -inkey privite.key -sign -hexdump
0000 - 09 1b ce e2 4b 69 86 be-d7 b1 fb f0 ec e4 53 0e   ....Ki........S.
0010 - ef 9c a4 7b db d3 21 d5-3e 78 23 61 89 34 7e bc   ...{..!.>x#a.4~.
0020 - e9 1e 5a e9 f4 40 e6 53-07 e4 dd 1a fe 31 ec 42   [email protected]
0030 - 98 a5 07 d4 7e d9 f4 01-2f ba a3 65 18 b7 69 a4   ....~.../..e..i. 

十六进制字符串是 091bcee24b69...

我的私钥

# cat private.Key
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
-----END RSA PRIVATE KEY-----

使用 Golang 生成签名

var prvKeyPem = `-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
-----END RSA PRIVATE KEY-----`

func GenerateSignature() {
    block, _ := pem.Decode([]byte(prvKeyPem))
    if block == nil {
        panic("failed to parse root certificate PEM")
    }
    privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) //x509.ParseCertificate(block.Bytes)
    if err != nil {
        panic("failed to parse certificate: " + err.Error())
    }
    indata := "Test."
    h := sha256.New()
    h.Write([]byte(indata))
    digest := h.Sum(nil)

    s, err := rsa.SignPKCS1v15(rand.Reader, privKey, crypto.SHA256, digest)
    if err != nil {
        panic("failed to sign:" + err.Error())
    }
    fmt.Printf("%x\n", s)
}

func main() {
    GenerateSignature()
}

运行这段代码,输出如下: 52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3e49e9

但我认为应该是:

091bcee24b69...

我的错在哪里?谢谢


除了添加的换行符之外echo描述于赫尔伯特的回答、OpenSSLrsautl命令直接对提供的数据进行操作,而 Go 代码首先使用 SHA256 对数据进行哈希处理,然后对生成的摘要进行签名。

要使用 OpenSSL 执行与 Go 代码相同的操作,您可以使用dgst command-sign选项(注意我已经包括了-n选项echo这里也):

$ echo -n "Test." | openssl dgst -sha256 -sign private.key -hex
52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3e49e9

要以另一种方式对原始消息进行签名而不用 Go 代码进行哈希处理,您可以通过0作为的值hash论证rsa.SignPKCS1v15:

indata := []byte("Test.")

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

为什么我用 openssl 和 golang 生成的 RSA 签名不同? 的相关文章

随机推荐

  • 类变量函数

    Say this gt varname等于一个字符串 其中is callable 返回真 要调用它我必须做 temp this gt varname temp 或者 有另一种方法可以调用它而不必创建两行吗 只做的问题 temp this g
  • 当对象确实是字符串时,强制转换与将对象转换为字符串

    这并不是一个真正的问题 但我很好奇 当我将字符串保存在 DataRow 中时 它会被转换为 Object 当我想使用它时 我必须将它转换为ToString 据我所知有几种方法可以做到这一点 第一种是 string name string D
  • 如果类是在带有元注释的组件之后定义的,则该类不可注入

    我刚刚开始 Angular2 快速启动项目 让一个简单的应用程序运行起来 我添加了DataService类 这样代码就会有关注点分离 最初我添加了DataService类在我的应用程序主要组件之后编写 即MyAppComponent像下面这
  • Android开发-getMenuInflater(R.menu.main, menu)

    我正在学习 android 并遵循简单的相机应用程序教程 我复制了一段代码 但出现错误 我不知道为什么 我正在使用的教程是 http iwearshorts com blog android development 102 代码片段是 Ov
  • Windows Phone 7 用户扩展属性

    被引导到这里后 http msdn microsoft com en us library microsoft phone info userextendedproperties getvalue 28v VS 92 29 aspx 我在侧
  • Azure Active Directory 发布注销 URL

    我希望在用户注销 Azure AD Office 365 时将他们重定向到我的应用程序网页 虽然根据来自的文档https greeneyeits com p 520 我们可以在那里编辑注销后链接 URL 并在用户注销 Azure AD Of
  • 如何在PowerShell中使用Windows API AuditEnumerateCategories函数?

    我想得到当前的高级安全审核策略使用 PowerShell 我可以用auditpol exe 但其输出因操作系统语言而异 这使得解析变得困难 The settings存储在 REG NONE 值中HKEY Local Machine Secu
  • 用于计算某些值在多行中出现的次数的 SQL 查询

    假设我有一个选举数据表 将其称为 选举 每次选举每个选民一行 如下所示 VoterID ElectionID A 1 A 2 B 1 C 2 D 3 E 1 E 2 我想知道在选举 1 和选举 2 中都投票的选民人数 我不关心其他人 该数字
  • 如何将 Laravel 变量传递到我的 AngularJS 视图中?

    我正在构建一个小型照片应用程序来学习 AngularJS 1 3 我有 PHP 背景 所以从概念上来说这对我来说是相当不同的 我想将一个变量 我的照片文件夹的 URL 传递到我的 AngularJS 视图 一个 html 文件 中 我怎样才
  • 更新站点时 git hook 出现问题

    我在服务器上建立了一个网站并使用git来维护它 为此 我创建了两个 git 存储库 其中一个位于 HOME site我推向一个非裸的 var www每次进行更改时都应该从裸存储库中提取 为了自动更新非裸存储库 我创建了一个并授予执行权限po
  • android 在 ndk/JNI 的 cc/c++ 中获取 IMEI

    我会尝试得到imei使用 C C 使用 ndk 获取设备的数据并使用 JNI 检索结果 const char res exec get out service call iphonesubinfo 3 在 shell 中工作 但在我的应用程
  • 如何进行git克隆并进入创建的目录

    How to git clone一个项目 然后cd一次进入新创建的目录 git clone http xxx optional folder name cd
  • Z3是否支持优化问题

    我在去年八月份的一篇文章中看到Z3不支持优化 但它也表示 开发人员正计划添加此类支持 我在来源中找不到任何表明发生这种情况的内容 谁能告诉我我关于没有支持的假设是否正确 或者是否已添加但我不知何故错过了它 谢谢 奥马尔 如果您的优化具有整数
  • 函数打印正确的输出和无

    我定义了这个函数 它接受一个单词和一串必需的字母 并且如果该单词至少使用一次所有必需的字母 则返回 True 当我运行它时 它给出了正确的输出 但我不明白为什么它也输出 无 这是我的代码 def uses all word allused
  • 在 Parse 中保存多个对象并接受超过 1 个 API 请求?

    据我从 Parse 文档可以看出堆栈溢出 the PFObject saveAllInBackground只需要 1 个 API 请求即可保存所有对象 我的方法保存一个对象 然后返回并saveAll还有 2 个物体 这看起来应该只需要 2
  • Android 操作栏中 Activity 的中心标题

    现在我的活动标题在左侧显示为 lt Title然后另一个菜单项显示在右侧 我想将标题居中并省略 lt 我怎么做 我正在使用典型的菜单 我称之为使用 public boolean onOptionsItemSelected MenuItem
  • 在 POI 中合并后为单元格设置值

    我想在 POI 中形成如下的 excel 输出 从图像中可以清楚地看出 我分别在 Header3 Header4 和 Header5 下各有 3 个子列 名单如下 ListA 包含 A 列的值 列表 包含 B 列的值 List1 是数据库行
  • 如何在 C++ 中对向量进行排序和排名(不使用 C++11)

    我正在尝试构建一个函数 它接受一个向量 对其进行排序 对其进行排序 并输出排序和排序的向量以及值的原始定位 例如 输入 10 332 42 0 9 0 输出 3 5 4 2 1 我使用了这个堆栈溢出question 特别是马吕斯的答案 作为
  • 使用自定义 DataAnnotationsModelValidatorProvider 进行服务器端验证

    我已经设置了一个自定义提供程序 以允许从数据存储而不是静态代码中设置验证属性 在我的 NET MVC 4 项目中与客户端验证配合得很好 但我无法让服务器端验证工作 CustomModelValidatorProvider cs public
  • 为什么我用 openssl 和 golang 生成的 RSA 签名不同?

    我使用 openssl 命令对消息 Test 进行签名 用 hexdump 输出 echo Test openssl rsautl inkey privite key sign hexdump 0000 09 1b ce e2 4b 69