golang rsa解密没有填充?

时间:2016-11-29 15:55:24

标签: encryption go rsa

Golang rsa没有NO_PADDING?
但openssl还可以。 对于加密数据对接和其他语言,使用Golang加密数据无法正常解密,但使用PHP和Openssl可以正常,后来发现像Golang不支持NO_PADDING解密,似乎只有PKCS1。
Openssl增加参数 - raw可以正常解密。私钥在上面,是一个密码和解密的正确值 有人可以帮我看一下如何解决?

$ 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

2 个答案:

答案 0 :(得分:2)

使用没有填充的rsa解密密文块是单模数指数运算。

c := new(big.Int).SetBytes(cipherText)
plainText := c.Exp(c, privateKey.D, privateKey.N).Bytes()

使用输入数据的完整示例如下:https://play.golang.org/p/CgLYgLR61t

如果您需要完整版本的解密功能,使用侧通道盲区并使用预先计算的CRT值以获得更快的性能,您可以从decrypt源复制crypto/rsa/rsa.go功能。

如果您有选择,则不应以这种方式使用rsa。有一个很好的discussion on the Crypto StackExchange site解释了使用这种方法的细节和缺点。

答案 1 :(得分:0)

实际上并没有回答这个问题,但是我将其放在此处,供那些希望使用rsa加密无填充文本的人使用。

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)