Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用openssl以特定格式创建RSA密钥_Openssl_Rsa - Fatal编程技术网

使用openssl以特定格式创建RSA密钥

使用openssl以特定格式创建RSA密钥,openssl,rsa,Openssl,Rsa,我们在大型机中使用ICSF创建了一个RSA密钥对。以十六进制格式生成的公钥大小为580个字符,结构分为 前缀-18字符(9字节)-3082010A02820100 公共模数-512字符(256字节) 5.一个数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据

我们在大型机中使用ICSF创建了一个RSA密钥对。以十六进制格式生成的公钥大小为580个字符,结构分为

前缀-18字符(9字节)-3082010A02820100

公共模数-512字符(256字节) 5.一个数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的数据层的292EB905EA050E2DC503AB92E9FE3C6CDACFCDE0D243A40F7E1578E097D65D7848387D1A33374AF93EEF3906CB07E5160BF5927E9B49FA68BE27D86AAFCD81EA12E83194BBD1CDEB5E52EB96DD63D0CA9

指数-10字符(5字节)-020301001

SHA1哈希-40个字符(20个字节)-CDC0B4A4253110D6E4A15DF536257A7B89B4231D

我们必须创建一个RSA密钥对,公钥的格式必须与上面相同。我们使用openssl尝试了这一点,但是创建的公钥的格式不同

  • 生成密钥对$openssl genrsa-out priv1.key 2048
  • 以pem格式$openssl rsa提取公钥-在priv1.key-text>priv1.pem中
  • 将base64 pem转换为十六进制

  • 这种格式叫什么?使用openssl,我们如何生成rsa密钥对以使公钥采用上述格式?

    除了SHA1哈希之外的所有内容都只是ASN.1编码的PKCS#1公钥。如果您有openssl 1.0.0或更高版本,则可以按如下方式创建:

    crow@mac:~$ openssl genrsa 2048 -out key.pem
    crow@mac:~$ openssl rsa -in key.pem -RSAPublicKey_out -outform DER 2> /dev/null | xxd -p > hex.txt
    crow@mac:~$ cat hex.txt
    3082010a0282010100be4a968090c6f608a4151fcf65dfe842e818a8cf56
    33e31ad1a912bfd5c453a89360a71b8d72786fbda131ebc3cc03cc742b5c
    cbb1b9621cdee34e8c1c25ca125961dc7c5fd1cb18832402ecfb4b0b1bf7
    c1b3dd666c0a789d9d721bfc13d4affb2bab0c0122a695ac3288786cb3f3
    1a3d56969dbc164e4ef5f4a0319b175e5de29525a84816bbc837d892b9ba
    6e3e462fe7a0ca0820ece4148cc76764c978ae2d41159fc4bb55cff31c53
    de55511d825b59e07767ee90d184aa0017e99077c09a9badeab7770a401e
    afec27f3abc98d141b50a7e4ba8c1c232af0df4ea83c8377f3ad360c17fd
    fe762d4ec4502cc4c0dd81ba1df6fc499b490332f21ab511910203010001
    crow@mac:~$ 
    
    请注意,前9个字节和后5个字节与问题中的“前缀”和“指数”相同

    然后将散列添加到末尾,它只是一个SHA1散列,与您刚刚使用十六进制编码的DER编码公钥相同(即,采用原始ASN.1的散列,而不是十六进制编码的文本文件的散列),例如


    | openssl dgst
    将在所需十六进制之前输出文本
    (stdin)=
    ,因此需要类似于
    sed
    cut
    awk
    的内容来删除它。Q中的数据显然是“编辑”的,因为正常的RSA生成不会产生n,其高阶字节在80-FF之外,如果是这样,ASN.1编码就不会有“额外”00;而SHA1散列将在万亿次中只结束一次。@dave_thompson_085:你是对的,编辑成管道通过
    cut
    @Crowman。非常感谢。我们按照建议在windows机器中进行了尝试。1.openssl genrsa-out key.pem 2048 2。openssl rsa-in key.pem-pubout-out pub.pem-记录大小为392字节。3.base 64到十六进制格式-记录大小为588字节。4.使用powershell&executed cat hex.txt | openssl dgst-sha1>>hex1.txt从hex数据中获取哈希值。5.手动仅连接十六进制数据末尾的哈希值。现在记录的大小是628字节。我们期望最终大小为580字节。我们做错了什么。@phoenix:好吧,你没有按照答案中的说明去做,这是最明显的问题。您正在执行的是
    openssl rsa-in-key.pem-pubout
    ,但是根据答案,您需要执行
    openssl rsa-in-key.pem-RSAPublicKey\u out-outform DER
    ,这(有意地)为您提供二进制输出,而不是base64编码的输出。这些差异很重要。@phoenix:更新了答案以显示如何重新计算哈希,现在您已经提供了实际值。
    crow@mac:~$ openssl rsa -in key.pem -RSAPublicKey_out -outform DER | openssl dgst -sha1 | cut -f 2 -d ' ' >> hex.txt