RSA在C和python之间加密/解密

时间:2014-03-14 07:31:47

标签: python c openssl rsa

我有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

2 个答案:

答案 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
}