我写了一个实现加密和解密的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加密模块切换?
答案 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