RSA密码不兼容-python脚本无法解密由bash脚本加密的密钥

时间:2019-02-05 05:50:57

标签: python encryption openssl rsa pycrypto

我写了一个实现加密和解密的python脚本。为了将加密数据的密钥发送给接收器,该程序对随机生成的密钥使用RSA公共密钥加密和解密。

以下是python脚本中的加密和解密方法,我曾使用它们使用公共/私有密钥对密钥进行加密和解密:

from Crypto.Cipher import PKCS1_OAEP

def encrypt_public_key(msg, public_key):
    cipher = PKCS1_OAEP.new(public_key)
    return cipher.encrypt(msg)

def decrypt_private_key(msg, private_key):
    cipher = PKCS1_OAEP.new(private_key)
    return cipher.decrypt(msg)

我的程序应该与同学程序通信,但是,此人已使用以下命令将其程序编写为bash脚本进行加密和解密:

openssl rsautl -encrypt -inkey id_rsa.pub.pem -pubin -in key.bin -out key.bin.enc
openssl rsautl -decrypt -inkey id_rsa.pem -in key.bin.enc -out key.bin 

当我的程序尝试解密我同学的加密密钥时,出现此错误:

File "[script-path]", line 54, in decrypt_private_key
return cipher.decrypt(msg)
File "C:\[path_to_python]\Python37-32\lib\site-packages\Crypto\Cipher\PKCS1_OAEP.py", line 167, in decrypt
    raise ValueError("Ciphertext with incorrect length.")
ValueError: Ciphertext with incorrect length.

我相信这意味着我们的脚本没有使用相同的密码,我对此假设是否正确?但是,我找不到用于bash脚本的密码(我的同学也不知道),并且我正努力寻找如何在python Crypto模块中使用另一个密码。

我试图将加密和解密方法切换为与此类似的内容:

from Crypto.PublicKey import RSA

def encrypt_public_key(msg, public_key):
    return public_key.encrypt(msg, 32)
def decrypt_private_key(msg, private_key):
    return private_key.decrypt(msg)

但这给了我以下错误:

File "[script_path]", line 52, in decrypt_private_key
    return private_key.decrypt(msg)
  File "[python-path]\Python37-32\lib\site-packages\Crypto\PublicKey\RSA.py", line 378, in decrypt
    raise NotImplementedError("Use module Crypto.Cipher.PKCS1_OAEP instead")
NotImplementedError: Use module Crypto.Cipher.PKCS1_OAEP instead

哪个密码(PKCS1_OAEP)无法与我的同学使用的加密密钥一起使用。

您有什么建议可以解决这个问题?问题是我们使用的是不同的密码,是否可以切换密码,还是必须从python加密模块切换?

1 个答案:

答案 0 :(得分:0)

您可能正在使用不同的RSA填充方案。 也许您的同学可以尝试使用public class BookedInfantDetails{ private int bookingId; private int bookedInfantinfoId; private int bookedadultpaxinfoid; public int getBookingId() { return bookingId; } public void setBookingId(int bookingId) { this.bookingId = bookingId; } public int getBookedInfantinfoId() { return bookedInfantinfoId; } public void setBookedInfantinfoId(int bookedInfantinfoId) { this.bookedInfantinfoId = bookedInfantinfoId; } public int getBookedadultpaxinfoid() { return bookedadultpaxinfoid; } public void setBookedadultpaxinfoid(int bookedadultpaxinfoid) { this.bookedadultpaxinfoid = bookedadultpaxinfoid; } OAEP填充选项SimpleJdbcCall call = new SimpleJdbcCall(dataSource2) .withCatalogName("BOOKING_PG") .withProcedureName("get_infant_info_pr") .withoutProcedureColumnMetaDataAccess() .declareParameters(new SqlParameter("c_booking_id", OracleTypes.Integer), new SqlParameter("c_booked_infant_details", OracleTypes.CURSOR), .returningResultSet("c_booked_infant_details", BeanPropertyRowMapper.newInstance(BookedInfantDetails.class)); SqlParameterSource in = new MapSqlParameterSource() .addValue(C_BOOKING_ID, bookingId); Map<String, Object> res = call.execute(in); List<BookedInfantDetails> l1= (List<BookedInfantDetails>)res.get("c_booked_infant_details");

openssl rsautl的默认填充模式似乎是-oaep(PKCS#1 v1.5)。

因此,您也可以尝试使用:

rsautl