2017-03-08 3 views
-2

laden Ich habe einen RSA-Primärschlüssel von einer Android-App, aber ich weiß nicht, wie man es in Python verwenden.Wie rsa Schlüssel (stirng) in Python

in Java-Code:

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==")); 
    } 
} 

Ich versuche, in Python:

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

aber ich habe:

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

wie kann ich diese Zeichenfolge Primärschlüssel laden Python rsa-Modul ?

hinzufügen BEGIN und 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' 

lösen:

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) 
+0

Ich versuche hinzufügen '----- BEGIN PRIVATE KEY ----- RSA' und '----- END RSA PRIVATE KEY -----', aber Ich habe: TypeError: int() Argument muss eine Zeichenfolge, ein Byte-ähnliches Objekt oder eine Nummer sein, nicht 'Sequence' – xiaoq

+0

Sie sollten mit https://lapo.it/asn1js/ überprüfen, ob Ihr privater Schlüssel tatsächlich PKCS # ist 1 oder PKCS # 8 codiert. Hier ist die Referenz, die der private Schlüssel enthalten muss: http://StackOverflow.com/a/20065522/1816580 –

+0

Es sieht so aus, als ob Ihr privater Schlüssel PKCS # 1-kodiert ist, also müssen Sie BEGIN PRIVATE KEY und END PRIVATE KEY anstelle von verwenden BEGIN RSA PRIVATSCHLÜSSEL. –

Antwort

0

rsa.PrivateKey.load_pkcs1 die PEM format standardmäßig verwendet.

Als solches erfordert es, den Schlüssel mit '-----BEGIN RSA PRIVATE KEY-----\n und enden mit

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

versuchen

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) 
+0

Wie konvertiere ich diesen Schlüssel zum PEM-Format? Ich füge BEGIN und END hinzu, aber es funktioniert nicht. – xiaoq

+0

@xiaoq Siehe meine aktualisierte Antwort. Dies ist eine sehr einfache Python-String-Formatierung. – DeepSpace

+0

Ich tyied. aber habe: TypeError: int() Argument muss eine Zeichenfolge, ein Byte-ähnliches Objekt oder eine Zahl sein, nicht 'Sequenz' – xiaoq

Verwandte Themen