【问题标题】:How to load rsa key(string) in python如何在python中加载rsa键(字符串)
【发布时间】:2017-07-28 19:58:52
【问题描述】:

我从一个 android 应用程序中获得了一个 rsa 主键,但我不知道如何在 python 中使用它。

在java代码中:

public class RSAHelper
{
  public static String decrypt(String paramString)
    throws Exception
  {
    return new String(RSAUtils.decryptByPrivateKey(Base64Utils.decode(paramString), "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIrrUGxh+yvNNI1c9hUg1rH+EtipI0nPk3zRm2Cj4mLDWLJ6DaTzdJTXTF3BYZaancWeG3QtBL+fITUi72InwBP7zaNG8uv/guwuhWT6V/YO7AaTrOFeTkg9NXuaFbn3hWVtZxQm2tIlaVa8snoNj3VGnPqIjXmGcxk4axuYd7sTAgMBAAECgYA43YhnRVh2nqJzd2k4Tt/zrmhyjhHm5fSetIKg9ZT3DrXhITsymYHQZ61X95AGATayLT1Zug/mjLIgOTO6f0ENkRQtjVCmKd8Yf/BeDEc5kRLUYDfSqoEydHK0+rCw5tJMgrAnQc5lHc+FVdGe2bOxKTEtZoss9VQ2jYuQ+Z5fUQJBANnvDOcI2OYSksX3PpHzO9F272xkmqYBRGkMc/a5RuOv1CY6FqMIkkloTf6nVl9y6XYV8gnHfbbI/wj4Q4UnPYsCQQCjLxyRYaOeEb/qOzSmFXytgMuCM9sr4eY9jpjzDgNWhpbtaVaf1QvSTXqN0zaUu4Se2tmWGX7zXw9p/dFf8DmZAkEAzl1o0FU2XhZ0WXVYEIhMunpvGSrirhNBHmAmZxjmoa/bqh8TVGpHa6+TO3JlfZioraL2QIBg8Ha/2VSNS0bvJQJALfCLaFpGh6+TicuVLNSLvwStRkB3CUmVWesVIAfn5KoLP1cSbfi6VUA+qkK18PVBhr8x1lHjLXyriDlOgmXMsQJAW9vD/IoBs4QJF87xF7tZvu/b1KRVgLM1edqOgVwMNbIQHBAXghjVjrpuln5w6z1dJ2cEjRP98OxKC0hqEIwIuQ=="), Charset.defaultCharset());
  }

  public static String encrypt(String paramString)
    throws Exception
  {
    return Base64Utils.encode(RSAUtils.encryptByPrivateKey(paramString.getBytes(), "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIrrUGxh+yvNNI1c9hUg1rH+EtipI0nPk3zRm2Cj4mLDWLJ6DaTzdJTXTF3BYZaancWeG3QtBL+fITUi72InwBP7zaNG8uv/guwuhWT6V/YO7AaTrOFeTkg9NXuaFbn3hWVtZxQm2tIlaVa8snoNj3VGnPqIjXmGcxk4axuYd7sTAgMBAAECgYA43YhnRVh2nqJzd2k4Tt/zrmhyjhHm5fSetIKg9ZT3DrXhITsymYHQZ61X95AGATayLT1Zug/mjLIgOTO6f0ENkRQtjVCmKd8Yf/BeDEc5kRLUYDfSqoEydHK0+rCw5tJMgrAnQc5lHc+FVdGe2bOxKTEtZoss9VQ2jYuQ+Z5fUQJBANnvDOcI2OYSksX3PpHzO9F272xkmqYBRGkMc/a5RuOv1CY6FqMIkkloTf6nVl9y6XYV8gnHfbbI/wj4Q4UnPYsCQQCjLxyRYaOeEb/qOzSmFXytgMuCM9sr4eY9jpjzDgNWhpbtaVaf1QvSTXqN0zaUu4Se2tmWGX7zXw9p/dFf8DmZAkEAzl1o0FU2XhZ0WXVYEIhMunpvGSrirhNBHmAmZxjmoa/bqh8TVGpHa6+TO3JlfZioraL2QIBg8Ha/2VSNS0bvJQJALfCLaFpGh6+TicuVLNSLvwStRkB3CUmVWesVIAfn5KoLP1cSbfi6VUA+qkK18PVBhr8x1lHjLXyriDlOgmXMsQJAW9vD/IoBs4QJF87xF7tZvu/b1KRVgLM1edqOgVwMNbIQHBAXghjVjrpuln5w6z1dJ2cEjRP98OxKC0hqEIwIuQ=="));
  }
}

我在 python 中尝试:

key = "MIICdgIBADANBgkqhkiG9w0BAQEFA..."
rsa.PrivateKey.load_pkcs1(key)

但我得到了:

ValueError: No PEM start marker "b'-----BEGIN RSA PRIVATE KEY-----'" found

如何使用 python rsa 模块加载这个字符串主键?

添加 BEGIN 和 END

In [109]: key
Out[109]: '-----BEGIN RSA PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIrrUGxh+yvNNI1c9hUg1rH+Etip I0nPk3zRm2Cj4mLDWLJ6DaTzdJTXTF3BYZaancWeG3QtBL+fITUi72InwBP7zaNG8uv/guwuhWT6V/YO7AaTrOFeTkg9NXuaFbn3hWVtZxQm2tIlaVa8snoN j3VGnPqIjXmGcxk4axuYd7sTAgMBAAECgYA43YhnRVh2nqJzd2k4Tt/zrmhyjhHm5fSetIKg9ZT3DrXhITsymYHQZ61X95AGATayLT1Zug/mjLIgOTO6f0EN kRQtjVCmKd8Yf/BeDEc5kRLUYDfSqoEydHK0+rCw5tJMgrAnQc5lHc+FVdGe2bOxKTEtZoss9VQ2jYuQ+Z5fUQJBANnvDOcI2OYSksX3PpHzO9F272xkmqYB RGkMc/a5RuOv1CY6FqMIkkloTf6nVl9y6XYV8gnHfbbI/wj4Q4UnPYsCQQCjLxyRYaOeEb/qOzSmFXytgMuCM9sr4eY9jpjzDgNWhpbtaVaf1QvSTXqN0zaU u4Se2tmWGX7zXw9p/dFf8DmZAkEAzl1o0FU2XhZ0WXVYEIhMunpvGSrirhNBHmAmZxjmoa/bqh8TVGpHa6+TO3JlfZioraL2QIBg8Ha/2VSNS0bvJQJALfCL aFpGh6+TicuVLNSLvwStRkB3CUmVWesVIAfn5KoLP1cSbfi6VUA+qkK18PVBhr8x1lHjLXyriDlOgmXMsQJAW9vD/IoBs4QJF87xF7tZvu/b1KRVgLM1edqO gVwMNbIQHBAXghjVjrpuln5w6z1dJ2cEjRP98OxKC0hqEIwIuQ==\n-----END RSA PRIVATE KEY-----'

In [110]: rsa.PrivateKey.load_pkcs1(key)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-110-0a0425032302> in <module>()
----> 1 rsa.PrivateKey.load_pkcs1(key)

c:\users\winside824\appdata\local\programs\python\python35-32\lib\site-packages\rsa\key.py in load_pkcs1(cls, keyfile, f ormat)
     73
     74         method = cls._assert_format_exists(format, methods)
---> 75         return method(keyfile)
     76
     77     @staticmethod

c:\users\winside824\appdata\local\programs\python\python35-32\lib\site-packages\rsa\key.py in _load_pkcs1_pem(cls, keyfi le)
    509
    510         der = rsa.pem.load_pem(keyfile, b('RSA PRIVATE KEY'))
--> 511         return cls._load_pkcs1_der(der)
    512
    513     def _save_pkcs1_pem(self):

c:\users\winside824\appdata\local\programs\python\python35-32\lib\site-packages\rsa\key.py in _load_pkcs1_der(cls, keyfi le)
    457             raise ValueError('Unable to read this file, version %s != 0' % priv[0])
    458
--> 459         as_ints = tuple(int(x) for x in priv[1:9])
    460         return cls(*as_ints)
    461

c:\users\winside824\appdata\local\programs\python\python35-32\lib\site-packages\rsa\key.py in <genexpr>(.0)
    457             raise ValueError('Unable to read this file, version %s != 0' % priv[0])
    458
--> 459         as_ints = tuple(int(x) for x in priv[1:9])
    460         return cls(*as_ints)
    461

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Sequence'

解决:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from base64 import b64decode

key = "MIICdgIBADANBgkqhkiG9w0BAQEFA..."
msg = "plain text"
key = b64decode(key)
private_key = RSA.importKey(key)
cipher = PKCS1_v1_5.new(private_key)
cipher.encrypt(msg)

【问题讨论】:

  • 我尝试添加 '-----BEGIN RSA PRIVATE KEY-----' 和 '-----END RSA PRIVATE KEY-----',但我得到了: TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是 'Sequence'
  • 您应该使用lapo.it/asn1js 检查您的私钥实际上是 PKCS#1 还是 PKCS#8 编码的。这是私钥必须包含的参考:stackoverflow.com/a/20065522/1816580
  • 您的私钥似乎是 PKCS#1 编码的,因此您需要使用 BEGIN PRIVATE KEY 和 END PRIVATE KEY 而不是 BEGIN RSA PRIVATE KEY。

标签: java python algorithm encryption rsa


【解决方案1】:

rsa.PrivateKey.load_pkcs1 默认使用PEM format

因此,它要求密钥以'-----BEGIN RSA PRIVATE KEY-----\n 开头并以

结尾

'\n-----END RSA PRIVATE KEY-----'.

试试

pem_prefix = '-----BEGIN RSA PRIVATE KEY-----\n'
pem_suffix = '\n-----END RSA PRIVATE KEY-----'
key = "MIICdgIBADANBgkqhkiG9w0BAQEFA..."
key = '{}{}{}'.format(pem_prefix, key, pem_suffix)
rsa.PrivateKey.load_pkcs1(key)

【讨论】:

  • 如何将此密钥转换为 PEM 格式?我添加了 BEGIN 和 END,但它不起作用。
  • @xiaoq 查看我的更新答案。这是非常基本的 Python 字符串格式。
  • 我绑了。但是得到了:TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是 'Sequence'
  • @xiaoq 编辑您的问题以包含您当前的代码。
  • 我更新代码时出错。你能帮我解决这个错误吗,我对 rsa 不熟悉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2021-12-16
相关资源
最近更新 更多