我目前正在做一个项目,我必须将一些代码从 Ruby(版本 1.9.3p194)“转换”到 Golang(版本 1.7)。这部分 Ruby 使用 RSA 公钥加密,每次执行时我总是得到一致的结果。这是使用的函数:
编辑:我忽略了公钥加密后还有base 64编码
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("\n", "")
escaped_encrypted_text = URI.escape(encrypted_key, "/+=")
但是在 Golang 中,由于 rsa 库,我无法获得一致的结果,因为加密函数采用随机参数每次生成不同的结果。我明白为什么它每次都需要不同,但我无法得到任何与 ruby 生成的东西相似的东西。这些是 Golang 中使用的函数:
//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 中我收到一个错误,提示 key 太短而无法加密所有内容。
如果我加密其他内容,例如“Hello”。解密时我从 ruby 得到错误“填充检查失败”。解密过程如下:
private_key.private_decrypt(Base64.decode64(text))
编辑: 感谢 gusto2 的回答由于我对 RSA 了解不多,我现在更清楚发生了什么。
现在在 Golang 中,我能够使用 PKCS1 v1.5 加密文本,只是为了确保我也尝试解密它,同样在 Golang 中,没有问题。
但是在 Ruby 中,我仍然无法使用私钥解密。所以我认为 Golang 中使用的 base64 编码是问题所在。所以我将那部分更改为:
encryptedText := base64.StdEncoding.EncodeToString(result)
我还删除了最后一行,因为等号被修剪了。
完成后,它就像一个魅力。
最佳答案
我对golang一无所知,但我可能对RSA有所了解。
不同之处似乎在于 padding .
对于 ruby - 不使用填充
对于 golang - 使用 PKCS1v15 填充
在 ruby 示例中,您使用了 OpenSSL::PKey::RSA::NO_PADDING,它非常非常不安全。它被称为 教科书 RSA 并且不适合实际使用,因为它有很多弱点和危险的陷阱。所以 ruby 示例是非常危险的不安全 因为使用教科书 RSA。它也仅限于加密小消息(比 key 空间小得多)。
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,我假设实现正在做 hybrid encryption这是使用 RSA 加密数据的好方法(使用随 secret 钥的对称加密并使用 RSA 包装/加密 key )。
关于Ruby RSA 公钥加密到 Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47981709/
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(
我正在考虑使用attr_encrypted在Rails应用程序中用于字段级加密的gem。如何生成用于此gem的加密key?更新:Encryptor的文档,它是attr_encrypted使用的底层加密,声明如下(在Usage|Basic下):secret_key=Digest::SHA256.hexdigest('asecretkey')encrypted_value=Encryptor.encrypt('somestringtoencrypt',:key=>secret_key)我猜想key可以是任意长度的随机字符串,而对hexdigest的调用将从中计算出适当的固定长度字符串。这是
我有一个pgp加密文件,我需要在运行时从中提取数据。这可以通过仅解密到内存来完成吗(而不是创建解密文件并在完成后将其删除)? 最佳答案 名为OpenPGP的Ruby库几个月前发布。看起来它对你有用。 关于ruby-在Ruby中访问pgp加密文件,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1083546/
2022年10月21日星期五【数据指标】加密货币总市值:$0.95万亿BTC市值占比:38.51%恐慌贪婪指数:23极度恐慌 【今日快讯】1、【政讯】1.1.1、美联储布拉德:市场预期美联储11月会加息75个基点1.1.2、美联储哈克:将维持加息一段时间1.2、美国10年期国债收益率触及4.197%,为2008年6月以来最高1.3、法国数字转型部长:政府将专注于DeFi和Web31.4、巴西ATM机将于11月3日起支持USDT1.5、美众议院副议长将于11月初加入a16zCrypto担任政府事务主管1.6、香港数字资产托管机构FirstDigitalTrust首席执行官:香港仍是安全
我想使用两个key对在两个通信系统之间实现具有不可否认性的安全消息传递。我使用以下方法生成并存储了两组key对:sys1_key=OpenSSL::PKey::RSA.generate(2048)sys2_key=OpenSSL::PKey::RSA.generate(2048)这两个key对都将其单独的公钥和私钥保存到文件中:sys1.pub.pemsys1.priv.pemsys2.pub.pemsys2.priv.pem系统1有自己的公钥和私钥以及系统2的公钥。系统2有自己的公钥和私钥以及系统1的公钥。在系统1上,我想获取消息“Helloworld”并使用系统1的私钥和系统2的公
尝试将一些旧的shell/unix脚本转换为Ruby。我对一个文件进行了以下加密,这是通过Unix中的gpg工具完成的。我可以传入接收者key、我要加密的文件和输出文件到pgp加密一些东西。gpg--recipient"$my_recipient_key"\--encrypt"$my_file"\--output"$my_outfile"\--always-trust\--compress-algozip像上面那样进行简单加密的Ruby等价物是什么?经过一些挖掘,我看到:OpenPGP很流行,但是在RubyGems网站上没有文档,其他地方也很少有很好的例子。gpgme似乎很受欢迎,很有