Ruby RSA public key encryption to Golang
我目前正在做一个项目,在这个项目中,我必须将一些代码从Ruby(1.9.3P194版本)转换为Golang(1.7版本)。在Ruby使用RSA公钥加密的部分中,每次执行它时,我总是得到一致的结果。这是使用的功能:
编辑:我忽略了公钥加密之后,还有一个base 64编码
1 2 3 4 5 | public_key = OpenSSL::PKey::RSA.new(public_encryption_key) public_encrypted_text = public_key.public_encrypt(text, OpenSSL::PKey::RSA::NO_PADDING) base64_encrypted_text = Base64.encode64(public_encrypted_text).gsub(" ","") escaped_encrypted_text = URI.escape(encrypted_key,"/+=") |
然而,在golang中,由于RSA库的存在,我无法得到一致的结果,因为要加密的函数每次都使用一个随机参数来生成不同的结果。我理解为什么每次都需要不同,但我不能得到任何和Ruby生成的东西类似的东西。以下是Golang中使用的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //keyBytes is the public key as []byte block, _ := pem.Decode(keyBytes) key, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return nil, err } pubKey, ok := key.(*rsa.PublicKey) if !ok { return nil, errors.New("Cannot convert to rsa.PublicKey") } result, err := rsa.EncryptPKCS1v15(cryptorand.Reader, pubKey, text) encryptedText := base64.URLEncoding.EncodeToString(result) encryptedText = strings.TrimRight(encryptedText,"=") |
号
其中一个问题是Ruby可以毫无问题地加密文本,在Golang中,我得到一个错误,即密钥太短,无法加密所有内容。
如果我加密其他东西,比如"你好"。解密时,我从Ruby中得到错误"padding check failed"。解密处理如下:
1 | private_key.private_decrypt(Base64.decode64(text)) |
编辑:多亏了古斯塔2的回答,我现在更清楚发生了什么,因为我对RSA没有太多了解。
现在在Golang,我可以使用pkcs1 v1.5对文本进行加密,只是为了确保我也能解密它,在Golang,没有问题。
但是在Ruby中,我仍然无法使用私钥解密。所以我认为Golang中使用的base64编码是问题所在。所以我把这部分改成了:
1 | encryptedText := base64.StdEncoding.EncodeToString(result) |
。
我也删除了最后一行的等号被修剪。
这样一来,它就像一个魅力。
我对Golang不太了解,但是我可能对RSA有所了解。
差别似乎在填充物上。
对于Ruby-不使用填充
对于Golang-使用pkcs1v15填充
在rubye示例中,使用
RSA使用了两种填充类型:
pkcs1 v1(通常称为pkcs1)-这是一个确定性填充(输出总是相同的),许多加密程序认为此选项已过时,因为在未正确使用时发现了一些弱点,但它仍在使用中,并且未被视为已损坏。
pkcs1 v2(通常称为OAEP或PSS)是随机(随机)填充。您可以区分最后两个,因为OAEP的输出总是不同的。
One of the problems is that ruby can encrypt the text with no problem, and in golang I'm getting an error that the key is too short to encrypt everything
号
您只提供了golang示例的一小部分,所以在这里我只能假设许多事情。
正如您所声称的,golang示例输出随机输出,并且根据参数pkcs1 v1.5使用,我假设该实现正在进行混合加密,这是用rsa加密数据的一种好的、更安全的方法(使用随机密钥的对称加密和用rsa包装/加密密钥)。