使用由非对称密钥配对的 openssl R 加密的 Python 解密 openssl 字符串
我在 R 中使用过
crypted <- cyphr::encrypt_string("secret", key=cyphr::keypair_openssl("~/.ssh/id_rsa_given.pub","~/.ssh/id_rsa"))
,
decrypted <- cyphr::decrypt_string(crypted,cyphr::keypair_openssl("~/.ssh/id_rsa_given.pub","~/.ssh/id_rsa")
这在 R 中有效,两者都是:加密和解密。
但我不知道如何在 Python 中读取这个加密字符串。
REPREX
R
bash
ssh-keygen -t rsa -f mykeytest
ls -g -o mykeytest*
# -rw------- 1 2655 Mar 4 10:08 mykeytest
# -rw-r--r-- 1 577 Mar 4 10:08 mykeytest.pub
R 没有外部文件
crypted <- cyphr::encrypt_string("mysecret", key=cyphr::keypair_openssl("mykeytest.pub","mykeytest"))
decrypted <- cyphr::decrypt_string(crypted,cyphr::keypair_openssl("mykeytest.pub","mykeytest"))
decrypted
# [1] "mysecret"
R 有外部文件
writeBin(cyphr::encrypt_string("mysecret", key=cyphr::keypair_openssl("mykeytest.pub","mykeytest") ), "mysecret.txt")
mydecrypted2<-cyphr::decrypt_string(readBin("mysecret.txt", base::raw(), file.size("mysecret.txt")),
cyphr::keypair_openssl("mykeytest.pub","mykeytest")
)
mydecrypted2
# [1] "mysecret"
Python
我的 POC Python 的开头
import sys
import sshpubkeys
import os
f_pub = open("mykeytest.pub", "r")
f_priv = open("mykeytest", "rb")
f_string_mysecret= open("mysecret.txt", "rb")
key_pub=f_pub.read()
key_priv=f_priv.read()
input_string=f_string_mysecret.read()
# https://github.com/ojarva/python-sshpubkeys
ssh_pub=sshpubkeys.SSHKey(key_pub)
ssh_pub.parse()
ssh_pub.rsa
# https://stackoverflow.com/questions/59029092/how-to-load-openssh-private-key-using-cryptography-python-module/69758595#69758595
from cryptography.hazmat.primitives.serialization import load_ssh_private_key
from hashlib import sha1
key_priv_b = load_ssh_private_key(key_priv,b'mypassword')
然后呢?
这就是问题所在?
您有一个纯Python答案来解密来自 cyphr::encrypt_string() 和 cyphr::keypair_openssl() 的
字符串 解决方法 rpy2
import rpy2.robjects as R
myfct = R.r(r'''
library(cyphr)
function(myfile) {
cyphr::decrypt_string(
readBin(myfile, base::raw(), file.size(myfile)),
cyphr::keypair_openssl("mykeytest.pub","mykeytest") )
}
''')
myfct("mysecret.txt")
# <rpy2.robjects.vectors.StrVector object at 0x7f0512114100> [RTYPES.STRSXP]
# R classes: ('character',)
# ['mysecret']
# in string :
myfct("mysecret.txt")[0]
# 'mysecret'
它适用于我的真正问题。
cyphr::decrypt_string()
的 R 源代码的路径
但是它对于 R 来说有那么特别吗?没有标准的Python实现吗?
则 R 源和 C 源的路径
- 如果我很好地理解了keypair_openssl() , : https://github.com/ropensci/cyphr/blob/HEAD/R/openssl.R#L79
- openssl__decrypt_envelope_aut() : https://github.com/ropensci/ cyphr/blob/master/R/openssl.R#L232
- crypto_envelope() : https://github.com/jeroen/openssl/blob/master/ R/envelope.R#L42
- C 中的 R_envelope_decrypt() : https://github.com/jeroen/openssl/blob/master/ src/envelope.c#L56
我的问题开头的链接:
- https://cran.r-project.org/web/packages/ cyphr/vignettes/cyphr.html
- https://github.com/ropensci/cyphr
- <一href="https://github.com/ropensci/cyphr/blob/master/R/openssl.R#L79" rel="nofollow noreferrer">https://github.com/ropensci/cyphr/blob/master/ R/openssl.R#L79
- 如何使用加密python模块加载openssh私钥?
I've used in R
crypted <- cyphr::encrypt_string("secret", key=cyphr::keypair_openssl("~/.ssh/id_rsa_given.pub","~/.ssh/id_rsa"))
and
decrypted <- cyphr::decrypt_string(crypted,cyphr::keypair_openssl("~/.ssh/id_rsa_given.pub","~/.ssh/id_rsa")
This works in R, both : crypt and decrypt.
But I don't find how to read this crypted string in Python.
REPREX
R
bash
ssh-keygen -t rsa -f mykeytest
ls -g -o mykeytest*
# -rw------- 1 2655 Mar 4 10:08 mykeytest
# -rw-r--r-- 1 577 Mar 4 10:08 mykeytest.pub
R without external file
crypted <- cyphr::encrypt_string("mysecret", key=cyphr::keypair_openssl("mykeytest.pub","mykeytest"))
decrypted <- cyphr::decrypt_string(crypted,cyphr::keypair_openssl("mykeytest.pub","mykeytest"))
decrypted
# [1] "mysecret"
R with external file
writeBin(cyphr::encrypt_string("mysecret", key=cyphr::keypair_openssl("mykeytest.pub","mykeytest") ), "mysecret.txt")
mydecrypted2<-cyphr::decrypt_string(readBin("mysecret.txt", base::raw(), file.size("mysecret.txt")),
cyphr::keypair_openssl("mykeytest.pub","mykeytest")
)
mydecrypted2
# [1] "mysecret"
Python
Beginning of my POC Python
import sys
import sshpubkeys
import os
f_pub = open("mykeytest.pub", "r")
f_priv = open("mykeytest", "rb")
f_string_mysecret= open("mysecret.txt", "rb")
key_pub=f_pub.read()
key_priv=f_priv.read()
input_string=f_string_mysecret.read()
# https://github.com/ojarva/python-sshpubkeys
ssh_pub=sshpubkeys.SSHKey(key_pub)
ssh_pub.parse()
ssh_pub.rsa
# https://stackoverflow.com/questions/59029092/how-to-load-openssh-private-key-using-cryptography-python-module/69758595#69758595
from cryptography.hazmat.primitives.serialization import load_ssh_private_key
from hashlib import sha1
key_priv_b = load_ssh_private_key(key_priv,b'mypassword')
And after ?
That is the question ?
Have you a pure python answer to decrypt string from cyphr::encrypt_string()
and cyphr::keypair_openssl()
Workaround with rpy2
import rpy2.robjects as R
myfct = R.r(r'''
library(cyphr)
function(myfile) {
cyphr::decrypt_string(
readBin(myfile, base::raw(), file.size(myfile)),
cyphr::keypair_openssl("mykeytest.pub","mykeytest") )
}
''')
myfct("mysecret.txt")
# <rpy2.robjects.vectors.StrVector object at 0x7f0512114100> [RTYPES.STRSXP]
# R classes: ('character',)
# ['mysecret']
# in string :
myfct("mysecret.txt")[0]
# 'mysecret'
An it works for my real issue.
Path of the R source of cyphr::decrypt_string()
But is it so special to R ? There is not standard python implementation ?
Path of the R source and C Source if I have well understood
- keypair_openssl() : https://github.com/ropensci/cyphr/blob/HEAD/R/openssl.R#L79
- openssl__decrypt_envelope_aut() : https://github.com/ropensci/cyphr/blob/master/R/openssl.R#L232
- decrypt_envelope() : https://github.com/jeroen/openssl/blob/master/R/envelope.R#L42
- R_envelope_decrypt() in C : https://github.com/jeroen/openssl/blob/master/src/envelope.c#L56
Links at the start of my question:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论