- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已将其归结为最简单的测试用例。我需要采用在 Python 中生成的 RSASSA-PSS 签名并在 Go 中验证它们。创建 RSA key 对并用它签名的 Python 代码如下:
>>> from tuf import pycrypto_keys as k
>>> pub, priv = k.generate_rsa_public_and_private()
>>> sig, method = k.create_rsa_signature(priv, "The quick brown fox jumps over the lazy dog.")
>>> sig.encode("hex")
'4e05ee9e435653549ac4eddbc43e1a6868636e8ea6dbec2564435afcb0de47e0824cddbd88776ddb20728c53ecc90b5d543d5c37575fda8bd0317025fc07de62ee8084b1a75203b1a23d1ef4ac285da3d1fc63317d5b2cf1aafa3e522acedd366ccd5fe4a7f02a42922237426ca3dc154c57408638b9bfaf0d0213855d4e9ee621db204151bcb13d4dbb18f930ec601469c992c84b14e9e0b6f91ac9517bb3b749dd117e1cbac2e4acb0e549f44558a2005898a226d5b6c8b9291d7abae0d9e0a16858b89662a085f74a202deb867acab792bdbd2c36731217caea8b17bd210c29b890472f11e5afdd1dd7b69004db070e04201778f2c49f5758643881403d45a58d08f51b5c63910c6185892f0b590f191d760b669eff2464456f130239bba94acf54a0cb98f6939ff84ae26a37f9b890be259d9b5d636f6eb367b53e895227d7d79a3a88afd6d28c198ee80f6527437c5fbf63accb81709925c4e03d1c9eaee86f58e4bd1c669d6af042dbd412de0d13b98b1111e2fadbe34b45de52125e9a'
里面引用的pycrypto_keys库可以在here中找到generate_rsa_public_and_private
和create_rsa_signature
函数的具体实现引用。
我的 Go 测试由 2 个仅依赖核心包的简单文件组成。首先是验证函数,在 verify.go 中:
package example
import (
"crypto"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"fmt"
)
func Verify(key []byte, sig []byte, msg []byte) error {
digest := sha256.Sum256(msg)
pub, err := x509.ParsePKIXPublicKey(key)
if err != nil {
return fmt.Errorf("Failed to parse key")
}
rsaPub, ok := pub.(*rsa.PublicKey)
if !ok {
return fmt.Errorf("Invalid value returned from ParsePKIXPublicKey")
}
opts := rsa.PSSOptions{SaltLength: 16, Hash: crypto.SHA256}
if err = rsa.VerifyPSS(rsaPub, crypto.SHA256, digest[:], sig, &opts); err != nil {
return fmt.Errorf("Failed Verification")
}
return nil
}
其次,一个测试用例。 key 对和签名是使用顶部的 Python 命令生成的,并复制到此处以创建一组用于兼容性测试的静态参数。
package example
import (
"encoding/hex"
"encoding/pem"
"testing"
)
func TestPyCryptoRSACompatVerify(t *testing.T) {
pubPem := "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAnKuXZeefa2LmgxaL5NsM\nzKOHNe+x/nL6ik+lDBCTV6OdcwAhHQS+PONGhrChIUVR6Vth3hUCrreLzPO73Oo5\nVSCuRJ53UronENl6lsa5mFKP8StYLvIDITNvkoT3j52BJIjyNUK9UKY9As2TNqDf\nBEPIRp28ev/NViwGOEkBu2UAbwCIdnDXm8JQErCZA0Ydm7PKGgjLbFsFGrVzqXHK\n6pdzJXlhr9yap3UpgQ/iO9JtoEYB2EXsnSrPc9JRjR30bNHHtnVql3fvinXrAEwq\n3xmN4p+R4VGzfdQN+8Kl/IPjqWB535twhFYEG/B7Ze8IwbygBjK3co/KnOPqMUrM\nBI8ztvPiogz+MvXb8WvarZ6TMTh8ifZI96r7zzqyzjR1hJulEy3IsMGvz8XS2J0X\n7sXoaqszEtXdq5ef5zKVxkiyIQZcbPgmpHLq4MgfdryuVVc/RPASoRIXG4lKaTJj\n1ANMFPxDQpHudCLxwCzjCb+sVa20HBRPTnzo8LSZkI6jAgMBAAE=\n-----END PUBLIC KEY-----"
//privPem := "-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----"
testStr := "The quick brown fox jumps over the lazy dog."
sigHex := "4e05ee9e435653549ac4eddbc43e1a6868636e8ea6dbec2564435afcb0de47e0824cddbd88776ddb20728c53ecc90b5d543d5c37575fda8bd0317025fc07de62ee8084b1a75203b1a23d1ef4ac285da3d1fc63317d5b2cf1aafa3e522acedd366ccd5fe4a7f02a42922237426ca3dc154c57408638b9bfaf0d0213855d4e9ee621db204151bcb13d4dbb18f930ec601469c992c84b14e9e0b6f91ac9517bb3b749dd117e1cbac2e4acb0e549f44558a2005898a226d5b6c8b9291d7abae0d9e0a16858b89662a085f74a202deb867acab792bdbd2c36731217caea8b17bd210c29b890472f11e5afdd1dd7b69004db070e04201778f2c49f5758643881403d45a58d08f51b5c63910c6185892f0b590f191d760b669eff2464456f130239bba94acf54a0cb98f6939ff84ae26a37f9b890be259d9b5d636f6eb367b53e895227d7d79a3a88afd6d28c198ee80f6527437c5fbf63accb81709925c4e03d1c9eaee86f58e4bd1c669d6af042dbd412de0d13b98b1111e2fadbe34b45de52125e9a"
testKey, _ := pem.Decode([]byte(pubPem))
sigBytes, err := hex.DecodeString(sigHex)
if err != nil {
t.Fatal(err)
}
err = Verify(testKey.Bytes, sigBytes, []byte(testStr))
if err != nil {
t.Fatal(err)
}
}
代码在 Verify 函数的最终检查中失败,输出错误 Failed verification
。我查看了 Go PSS 验证代码,如果出现任何问题,将返回一般验证错误,因此它没有多大帮助。即使它更具体,要么这里存在兼容性问题,一种语言实现中存在错误,要么我的代码有误。
非常感谢您的帮助。
最佳答案
看来我误解了 Python 代码中的 _SALT_SIZE
。在 TUF 开发人员的帮助下(即他们告诉我),我发现 PyCrypto 的 RSA PSS 代码将盐大小推断为等于所用散列算法的散列摘要的大小。在这种情况下,它是 32 个字节,因为散列算法是 Sha256。只需更改 opts := rsa.PSSOptions{SaltLength: 32, Hash: crypto.SHA256}
代码即可。
关于python - 无法跨 Python 验证 RSASSA-PSS 签名 -> Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495284/
谁能告诉我如何在 Java 中为 RSASSA-PKCS1-v1.5 生成签名? 实际上,我想知道如何使用 java.security.Signature 类。 我必须使用任何第三方库吗? 最佳答案
有谁知道RSACryptoServiceProvider.SignHash用的是什么签名算法? ?我相信它是 RSAPKCS1,它仍然安全吗? 有没有人想过在不使用 BouncyCaSTLe 等第三方
我正在尝试插入并实现以下语句。 Digitally sign the payload with Private Key using RSASSA-PKCS1-V1_5 signature scheme
我正在尝试使用 PKCS#11 使用 JarSigner 对 JAR 文件进行 RSA-PSS 签名。 JarSigner 使用 sigalg 标志来指定签名算法。 JDK 14 Docs of th
我正在研究 PKSC1V2.2 RSASSA-PSS 签名方案。我得到了一些用于最终结果测试的标准测试 vector ,但我的结果不匹配。要检查我的代码哪里出了问题,我需要一些具有中间结果的测试 ve
我需要使用带有 EMSA-PSS 编码的 RSASSA-PSS 对数据进行签名。openssl 不支持此算法。可以告诉我是否有任何其他开源库可用于执行此操作......? 最佳答案 Crypto++提
我已将其归结为最简单的测试用例。我需要采用在 Python 中生成的 RSASSA-PSS 签名并在 Go 中验证它们。创建 RSA key 对并用它签名的 Python 代码如下: >>> from
我需要使用 SHA256 HASH 函数和带有 RSA EMSA-PSS 编码的 RSASSA-PSS 创建数据字符串的签名。openssl 支持这个吗? 我正在使用 API 创建签名 int RSA
我正在开发一个移动应用程序,它必须验证它收到的一些签名。我拥有我需要的一切——输入数据、公钥和签名。但有一个问题。我使用方法 SHA256withRSA 进行签名验证,其中包含以下几行代码来验证签名:
我正在尝试使用 System.Security.Cryptography(目标框架 .NET 4.5)创建 xml 数字签名,到目前为止,我设法使用以下方案创建和验证签名:RSA PKCS#1 v1.
我想分 2 个步骤使用 SHA256withRSA/PSS 签名,首先我散列一条消息,然后用 RSASSA-PSS 签署摘要 byte[] document = {0, 1, 2, 3,
在这个库上花费了无数个小时之后,我仍然无法让它工作。 我想用 bouncy caSTLe 库发送 smime 消息,用 RSASSA-PSS 签名,用 AES 加密,其中 key 传输应该是 RSAE
我是一名优秀的程序员,十分优秀!