当前位置: 首页 > 知识库问答 >
问题:

如何使用公钥加密数据并使用base64在python中对其进行编码?

水恩
2023-03-14

我想用python实现下面的功能,它使用公钥加密密码,然后使用base 64进行编码。我搜索了许多答案,但没有找到解决方案,我想可能是我不明白。请给我一些建议好吗?

// # java code
public static String encryptRSA(String password, String publicKey) {
        try {
            byte[] decoded = Base64.decode(publicKey);
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
                    .generatePublic(new X509EncodedKeySpec(decoded));
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            String outStr = Base64.encode(cipher.doFinal(password.getBytes("UTF-8")));
            return outStr;
        } catch (Exception e) {
        }
        return null;
    }

我使用以下代码,但它会引发错误M2Crypto。RSA。RSA错误

# python code
import base64

import M2Crypto

pub = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClnY+3rAf/az9t2bxC80TObpZ2ZCH1xSjPt9QtXl6k6UtD7mQcI2CWSwnDgKJr2m2WnM1kR6X+oOL61lXO0gSuuD8tWOx/knZA2VaSTLdsHBDLOX3e6Fo/O3CtoLVwO5FYFBIFHXMoikPkR8tFIOLWsX0y3slLQQShwSJAHytP4QIDAQAB"
password = 123


def public_encrypt(public_key, password):
    rsa_pub = M2Crypto.RSA.load_key_string(public_key.encode('utf-8'))
    ctxt_pub = rsa_pub.public_encrypt(password.encode(), M2Crypto.RSA.pkcs1_padding)
    ctxt64_pub = base64.b64encode(ctxt_pub).decode()
    return ctxt64_pub


res = public_encrypt(pub, password)
print('res:', res)

共有1个答案

郑晨
2023-03-14

完整的错误信息是:M2Crypto。RSA。RSA错误:没有起始行,表示密钥导入错误。

load_key_string()需要PKCS#1或PKCS#8格式的PEM编码私钥,但不需要公钥。可以使用load_pub_key_bio()导入X.509/SPKI格式的PEM编码公钥。

从发布的X.509/SPKI密钥中,可以通过在每64个字符后添加换行符并添加相应的页眉和页脚来创建PEM编码密钥:

import M2Crypto

x509 = '''-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClnY+3rAf/az9t2bxC80TObpZ2
ZCH1xSjPt9QtXl6k6UtD7mQcI2CWSwnDgKJr2m2WnM1kR6X+oOL61lXO0gSuuD8t
WOx/knZA2VaSTLdsHBDLOX3e6Fo/O3CtoLVwO5FYFBIFHXMoikPkR8tFIOLWsX0y
3slLQQShwSJAHytP4QIDAQAB
-----END PUBLIC KEY-----'''

bio = M2Crypto.BIO.MemoryBuffer(x509)
rsa_pub = M2Crypto.RSA.load_pub_key_bio(bio)

另一个问题是没有为整数定义encode(),但是密码应该是一个字符串,这只是一个复制/粘贴错误。

通过这些更改,代码可以正常工作。

请注意,1024位RSA密钥(如您的)现在是不安全的,而长度应该是

 类似资料:
  • 一段时间以来,我一直在阅读CodeProject a的一篇文章,该文章解释了如何使用RSA提供程序进行加密和解密: RSA私钥加密 虽然2009年的旧版本有缺陷,但2012年的新版本(支持System.Numerics.BigInteger)似乎更可靠。但这个版本缺少的是一种使用公钥加密和使用私钥解密的方法。 所以,我自己也试过了,但解密时会收到垃圾。我对RSA提供商不熟悉,所以我对这里一无所知。

  • 是否可以使用pycryptodome或任何其他库在python中使用私钥加密消息?我知道你不应该用私钥加密而用公钥解密,但我的目的是用私钥加密,这样接收者就可以确定消息是由真正的作者发送的。除了安全加密之外,我还在寻找某种模糊处理。我想做一个应用程序,其中的消息是公开的,但它只能看到,如果你有公钥。我尝试过这样做: 但它会引发下一个错误:TypeError:这不是私钥。

  • 问题内容: 我需要使用公钥(pem文件)对字符串进行加密,然后使用私钥(也为pem)对其进行签名。 我正在加载pem文件: 但是经过数小时的搜索,我似乎无法找到一种使用公钥加密数据的方法。在php中,我只是调用openssl_public_encrypt,但在节点或任何模块中都看不到任何相应的功能。 如果有人有任何建议,请告诉我。 问题答案: 没有图书馆必要的朋友, 输入密码 这是一个简单的小模块

  • 我正在为服务器编写发送电子邮件的模块。在客户端应用程序中,用户可以添加多个接收器,每个接收器都有自己的公钥。我想使用多个密钥加密附件。例如,如果我添加了3个接收者,那么附件应该用3个不同的公钥加密。我使用bouncy castle来实现这一点,但它只适用于加密过程中的第一个公钥。我的意思是只有第一个人可以使用自己的私钥解密,其余的都不起作用。我为每个键添加方法的代码如下所示: 整个方法看起来像:

  • 问题内容: 我想生成rsa密钥对(公共和私有),然后将它们用于AES加密和解密。例如,用于加密的公共密钥和用于解密的私有密钥。我为此编写了一个简单的代码,但是问题是当我运行时这段代码我得到这个错误: 我该如何解决这个问题?我的加密代码如下: 问题答案: 如评论中所建议,我搜索了“混合密码术”。这个例子解决了我的问题。

  • 本文向大家介绍如何使用nodejs对base64进行编解码?相关面试题,主要包含被问及如何使用nodejs对base64进行编解码?时的应答技巧和注意事项,需要的朋友参考一下 轮子, https://www.npmjs.com/package/js-base64