Golang rsa没有NO_PADDING?
但是openssl可以。
对于加密数据对接和其他语言,使用Golang加密的数据无法正常解密,但是可以正常使用PHP和Openssl,后来发现类似Golang的代码不支持NO_PADDING解密,似乎只有PKCS1。
Openssl增加参数-原始可以正常解密。私有密钥在上面,是加密和解密后的正确值。
有人可以帮我看看如何解决吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $ cat private.pem -----BEGIN RSA PRIVATE KEY----- MIIBOgIBAAJBANJS/xu+NtmDqobnhCdLjWk46aYbBk/mQrLcozAIbQLFG2mgkrxf B5+CgtISKpKfmRfCO2NhceK+YedaMMBUxn8CAQMCQQCMN1S9KXnmV8cEmlgaMl5G JfEZZ1mKmYHMkxd1WvNXLNuke9ntKwti8zG1lAFcOVHnm/uYsNdua+lvvQlEgBUL AiEA/c8ezGaNUFwEAltwTEFtFItT5PyOXlWIdPAZ7j160lkCIQDUI8f/chEmLxG1 5kPcRtyJsQRdAcnQZ5QOz6S0nBnUlwIhAKk0vzLvCOA9WAGSSt2A82MHjUNTCZQ5 BaNKu/Qo/Iw7AiEAjW0v/6FgxB9hI+7X6C89sSCtk1aGiu+4Cd/DIxK74w8CIB4q rA1k247JrqKTGlqSHVr1Ta+h3BPbwFKCi5CiDOjV -----END RSA PRIVATE KEY----- $ xxd data.txt 00000000: 6d4b 5dab 6d64 45e1 e4cb 0ea8 20df b724 mK].mdE..... ..$ 00000010: cfe5 db3e 75c4 e80e 2337 4f08 1b36 87b4 ...>u...#7O..6.. 00000020: 7550 47d4 ed60 576a a160 2d01 3cf7 4c50 uPG..`Wj.`-.<.LP 00000030: 7e44 6432 1f9d cfe2 2e9f 4f89 f815 ae01 ~Dd2......O..... $ base64 -i data.txt bUtdq21kReHkyw6oIN+3JM/l2z51xOgOIzdPCBs2h7R1UEfU7WBXaqFgLQE890xQfkRkMh+dz+Iun0+J+BWuAQ== $ cat data.txt | openssl rsautl -decrypt -inkey private.pem -raw qYnYKT2mxuXR5XB615gOenqxOnIUjWs7 |
- 您到底想说什么..请使用英语使其更易于理解。
-
我认为我们应该重新讨论这个问题:语言不太好,但是1)据说作者不是母语。 2)问题的实质是可识别的,可以表述为"为什么Go的
cryptorsa 包仅支持OAEP和PKCS#1填充方案,并且不允许对没有填充的数据使用RSA操作?"。我认为,答案可能是由于此处概述的原因(基本上等于"不要做"),但是OP仍可能需要处理遗留数据/协议,并且它们的关注是有效的。 - @ohko,您可能想在项目Bugtracker中提交错误。如果要执行此操作,请确保1)尝试阐明为什么需要不加填充的RSA操作支持-不要仅在此处张贴此讨论的链接; 2)请发布指向您将在此处提出的问题的链接(作为评论),以备将来参考。
- 我怀疑这会添加到stdlib中,因为其用法相当可疑。如果重新打开,我现在可以发布答案,因为这只需要执行一次模幂运算。如果希望完全遮盖和使用预先计算的CRT值,则可以将整个函数复制到标准库之外。
使用rsa解密密文块而无填充是一个模指数运算。
1 2 | c := new(big.Int).SetBytes(cipherText) plainText := c.Exp(c, privateKey.D, privateKey.N).Bytes() |
使用输入数据的完整示例在这里:https://play.golang.org/p/CgLYgLR61t
如果您想要完整版的解密功能,并带有旁通道盲区并使用预先计算的CRT值以获得更快的性能,则可以从
如果可以选择,则不应以这种方式使用rsa。 在Crypto StackExchange网站上进行了很好的讨论,解释了使用此方法的细节和缺点。
- 非常感谢你!完成!
并未真正回答问题,但我将其放在此处,供那些正在寻求使用rsa加密而不填充的纯文本用户使用。
1 2 3 4 5 6 7 8 9 | var publicKey *rsa.PublicKey // ... // ... c := new(big.Int).SetBytes([]byte(text)) encryptedBytes := c.Exp(c, big.NewInt(int64(publicKey.E)), publicKey.N).Bytes() encryptedBase64 := base64.StdEncoding.EncodeToString(encryptedBytes) |