我有python
中的服务器和C
中的客户端。他们的工作是从服务器向客户端发送使用RSA private key
加密的秘密消息。我正在使用openssl/rsa.h
库,即使用私钥初始化rsa
对象并使用RSA_public_encrypt(length_of_message, "Secret Message", to, rsa, RSA_PKCS1_PADDING)
加密消息。然后,我将此加密邮件发送到python
服务器,并尝试使用from Crypto.PublicKey import RSA
库使用相同的私钥解密。问题是它没有正确解密它。它始终输出128位长度的消息,其中秘密消息随机放入其中(e.g. '\x23\xa3x\43...Secret Message\xef\x4a')
,通常它应该只返回Secret Message
。
答案 0 :(得分:3)
问题在于填充。 Python的rsa模块使用PKCS1
填充来解密结果,并且不会删除填充。我从here问题中解决了以下函数问题:
def pkcs1_unpad(text):
if len(text) > 0 and text[0] == '\x02':
# Find end of padding marked by nul
pos = text.find('\x00')
if pos > 0:
return text[pos+1:]
return None
答案 1 :(得分:0)
是否可以在Python和C中创建同一对RSA密钥。请找到下面的代码,让我知道是否需要进行任何修改才能使其正常工作。
Python中的代码
int clen = 0, num, ret;
clen = strnlen_s(req->pw,2048);
unsigned char ptext[2048];
RSA *rsa = RSA_new();
BIGNUM *e = BN_new();
ret = RSA_generate_key_ex(rsa, 2048, e, NULL );
num = RSA_private_decrypt(clen, req->pw , ptext, rsa, RSA_PKCS1_OAEP_PADDING);
// Start authentication process
strncpy(req->pw,ptext,MAX_PASSWORD_STR);
C语言代码
if($validation){
then handle the ajax form submit
}