V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mathzhaoliang
V2EX  ›  问与答

求助一个 RSA 解密的问题

  •  
  •   mathzhaoliang · 2019-01-15 16:53:41 +08:00 · 1610 次点击
    这是一个创建于 2142 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有这样一段 RSA 公钥加密后的信息(用十六进制字符串表示)

    char * data = 
    "8c4c05b86de3740abff4e6dc498afe1a7fe348cb80f5d7d029f098d315dcc6cf1496f11114ce4a6489b03f322297b71e272e55b9b9e2f0fddf4f0258539018056dbddb5f0e0909013c7ff4988d28b47aaa5896a75997e74af6a25dd02c259f06d0689ba48f42a6093bd6b4b8810cb7458350c6bdcc86c0f2a5f7c4defffba599f5f106054a393ed70c24b7fdc0b2aadb5a8b740dd94b0e3c4520521af873ac110141f978d2fc548e6bc98f03bb59c67415f08bdf52a8135949c0c1e844f5c42c52339b1e6ee93d504d4748fb5ef10ce34fd32cbda578e705e8340a73fd26c263c15d37a8f1d1c57fecb4164bfae460d5f3e61b6d48e37639d351c0ca4df5bd07";
    

    已知私钥的 .pem 文件是

    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEAms015yxDAwiqm3fcg5stTt3P1LDT3daK50rvumLPM32N1eXX
    4IhU65K6ZgZVCHcGmWyUHo4UhXzvt5ozHzNanJCHx1ZPgi/SzaQUJ2jN2g5UuuRz
    PVCJNcTx+l1HCdcTLysULQ+aBvSfWbgXq5Z254ZMvqn22N7ItmpN5OW10R/hQGt3
    kQAi+z672kSWBn5vcBK7rEp0PfDj0pYL1i5x56jwqW/OPaEcr5qHGQWjxcnqEoVn
    pRkFuj6Wx222+jnfgw0UsCFGkaYYUmROWpokE38QzvEUcQELi+s6GPqFRDbRcGtV
    Jb2/aX/tr4QYwE85wXrMi6e9ZTVhqvXqwsdllQIDAQABAoIBAAeFUMkabWcIVMGY
    4S3DrD/YpvA+ZwywD6+NBHiZtFdcEjgCIqrV9Mo9JrEuPZNbtQZfMBML9BNILp1M
    8I7jf9N7ch1NJC+/Aw7ameAQR3AAoj0yPCcOcpwaJWd0gK8Js/TmsuQ9jc4otFU3
    jG7ZsI0vCSt6NnPy3u193KryPhMa1gu+x8gzh47oDjzIlQcxHyUfe6C1oebQrmJX
    p/ih7F1OwmccM5SwYVdWB9mgwqvw+cLZuTKrsw1K0yxrcrivncDeGWPqrhBVEWPU
    jwQG5STPpciW1Ar22u1r2ZjjquEDyvrcFWIbUBJhvXFfGlB7G3Z8N2l3rJywJv5y
    JHOxSUECgYEAwCcLwOl16NECF0/D62h9ppkTJ3E4wvuRcQvDif36QIs8dF3vyj/B
    ZJErbTLYwAwHLu3em64cn3QEbxm6Xh90F8WHtlsUHvJKKWi7RNaUqfhLFF9FF9IE
    xDuPPDBnWBAWacBk1hRq7mggnOUOFdsQtQU6fP7OhXy52N8uQFwHdDcCgYEAzj0B
    hTVsqJowAg++RQHZrpvuy4gnWhFH3+FaCi7ivu4uwpOnCRDaFrHH7jAYmqoHvWiN
    YsRr2+czr3U1WIWuG1HLTCj8RZyI0eVSng0xw8czIl3vJu3eN4hq3V3cM0JiVckv
    pIUL4zNlwwh8ylNxA/bPRhaR+c8DmaHhKUn8ppMCgYABMLy75zZZyOGwb0gRb0ZH
    /+7EcckePBy8jIwbkL06JSKsveA8aoSyMMwKEySQnAJ3YfXdFQkMW9WjMo+bAarg
    ctLSaGIJhwq6kvGGDaZCH02nxKdS7HQnGw9aGhqpyv+4i/6T7PB0paR+FFUwAXlr
    BatFFvcEkK8+DrPkpi1NpQKBgAD9xBMa1aHd09s+riBwyNYRA83QorfJG3pU//TK
    kuZuCKWAxi3B+fpf8mEPtB6SMKVValCONyKAcvwl6RK62cJh20NLcyL2hKXVn1cJ
    IzMYswM4Rlz+ibHkovbba6KHcCePZv44cX0vEw8j7E2gpwto1Ug19Y+o0hCb+ZQU
    OfWnAoGANmcWVE7QNcvshIHR0GrlXWmjK/l/TZTh1DVRkfri6eltAFaTbSs03fdL
    AEGcbKVurGbdbXgGzpdVmL2+vqe54B07RLTsPvGvkak6E8s4/c5U6x5RLLA0ZZMn
    +cyn6yxAcAemW0dc90YqVkGYjCefPw5CDbcgRK8DIPyInIVWYYY=
    -----END RSA PRIVATE KEY-----
    
    

    请问这个用 C 语言怎么解密呢?注意这里的密文是以字符数组的形式出现的,我是不是要先把它转换为二进制的 char 类型呢?

    6 条回复    2019-01-16 10:28:48 +08:00
    aheadlead
        1
    aheadlead  
       2019-01-15 17:00:55 +08:00
    解密后:
    00000000 7f a7 93 21 e4 69 c6 7d e2 6e c1 ed b7 50 b9 6b |...!.i.}.n...P.k|
    00000010 32 94 e2 c2 91 68 9e 85 07 5e 61 3b cd 09 d5 d9 |2....h...^a;....|
    00000020

    C 的话,可以调用 openssl 的 lib。

    人工操作: https://stackoverflow.com/questions/42300795/openssl-decrypting-with-a-private-key
    mathzhaoliang
        2
    mathzhaoliang  
    OP
       2019-01-15 17:04:35 +08:00
    @aheadlead 原始信息作为十六进制字符串是

    ```
    7fa79321e469c67de26ec1edb750b96b3294e2c291689e85075e613bcd09d5d9
    ```

    你的答案好像是对的,但多了一些莫名的符号。

    请问您是怎么解密的呢?
    hx1997
        3
    hx1997  
       2019-01-15 18:28:44 +08:00 via Android
    装 OpenSSL 后用这个解密
    rsautl -decrypt -inkey 私钥.pem -in 密文文件 -out 明文文件

    编程的话先十六进制串转二进制,再用 .pem 提取的私钥按公式解密,当然用库也行。
    yuikns
        4
    yuikns  
       2019-01-16 00:16:46 +08:00 via iPhone
    @mathzhaoliang 一楼是 hexdump 的输出…
    分别是一地址,内容,尝试转义为 ascii 码后结果

    哪里有“奇怪的字符”
    mathzhaoliang
        5
    mathzhaoliang  
    OP
       2019-01-16 09:14:26 +08:00
    @yuikns 不太懂,开头的 000000x0 和后面的 |...!.i.}.n...P.k| 分别是什么意思,可否解释下?
    Yanni0507
        6
    Yanni0507  
       2019-01-16 10:28:48 +08:00   ❤️ 1
    @mathzhaoliang
    开头的 000000x0 是该行第一个字节的十六进制序号,一行 16 个字节,所以第二行第一字节序号是 00000010
    两个|中间的内容是把解密的各个字节内容尝试转成可以打印显示的字符结果,真正的解密结果只有中间的十六进制字符部分
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3574 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.