当前位置: 首页 > 面试题库 >

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

满勇军
2023-03-14
问题内容

我使用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   ..Z..@.S.....1.B
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()
}

运行此代码,输出如下:52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3e49e9e9

但我认为应该是:

091bcee24b69 …

我哪里错了? 谢谢


问题答案:

除了helmbert的答案中所echo描述的添加的换行符外,OpenSSL
命令还直接对提供的数据进行操作,而Go代码首先使用SHA256对数据进行哈希处理,然后对结果摘要进行签名。rsautl

要与使用OpenSSL的Go代码执行相同的操作,可以将该dgst命令与-sign选项一起使用(请注意,我在此处也包含该-n选项echo):

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

要采用另一种方法并在不对Go代码进行哈希处理的情况下对原始消息进行签名,可以将参数0的值传递hashrsa.SignPKCS1v15

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

s, err := rsa.SignPKCS1v15(nil, privKey, 0, indata)


 类似资料:
  • 问题内容: 我想用Java生成RSA-SHA256签名,但无法在控制台上生成与OpenSSL相同的签名。 这是我对OpenSSL所做的工作: 生成密钥对: 提取公钥: 创建数据哈希: 生成的哈希文件从(stdin)=我手工删除的文件开始(首先忘了提起它,谢谢mata)。 签名哈希: 为了在Java中重现结果,我首先将私钥从PEM转换为DER: 现在,我编写了这个Java类来生成相同的签名: 不幸的

  • 我需要一些使用OpenSSL的帮助,以便使用C(Windows和Linux)生成数据块的签名。该应用程序与谷歌认证有关。谷歌文档中的说明如下: “使用从Google开发者控制台获得的私钥,使用SHA256withRSA(也称为RSASSA-PKCS1-V1_5-Sign,使用SHA-256哈希函数)对输入的UTF-8表示形式进行签名。输出将是字节数组。” 私钥是一个密码。p12包含1660字节二进

  • 我正在进行rpc调用签名,为了使服务器接受我们的API调用,我们需要使用RSAPrivateKey对http mime头进行签名。服务器端代码用JAVA编写,并使用“SHA256withRSA/PSS”验证签名。 我的问题是我从JAVA和c openssl代码得到了不同的签名哈希。所以问题是,openssl是否有可能生成与JAVA相同的签名哈希? JAVA代码: c代码:

  • 我想在JettyDistribution-9.2.9.v20150224上配置SSL 并将ssl和https模块配置为start.ini,Jetty工作正常。 但是,从keystore中提取的证书不能被浏览器信任。所以我想使用Openssl创建自签名证书 我的Openssl版本是0.9.8,我通过以下步骤生成keystore: 但是,这个TrustStore.KeyStore不能工作。Http工作

  • 主要的问题是,我对C相当陌生,OpenSSL留档对我来说不够清晰,我尝试过使用读和写rsa键到C中的pem文件,但我不太明白。例如,函数如何创建私有和公共?而从何而来?pcszPassphrase的意义是什么? 我会解释,好像这是某种伪代码,这就是我想做的,粗体部分是我不知道如何做的: 生成私钥和公钥作为十六进制缓冲区(客户端) 基本上,我知道如何处理AES加密/解密和通信协议,反正他们已经实现了

  • 选择什么-V1签名还是V2?我的应用程序适用于android 4。所以,如果我将使用签名版本V2,我可以在android 4的手机上安装它吗?我知道V2签名是在android 7之后出现的,我认为android 7以上的手机无法安装应用程序,因为V2签名。那么该选择什么呢?我可以同时选择这两个版本吗?如果我同时选择两个签名版本,会怎样?非常感谢。