2016-06-30 7 views
0

Ich habe ein Problem, Modulo Parameter in RSAParameter setzen. Ich konvertiere meinen öffentlichen Schlüssel String in Byte-Array und mein Problem ist, dass die Länge zu lang ist.Set Modul RSA Parameter von öffentlichen String-Schlüssel

byte[] lExponent = { 1, 0, 1 }; 

//Create a new instance of the RSACryptoServiceProvider class. 
RSACryptoServiceProvider lRSA = new RSACryptoServiceProvider(); 


//Create a new instance of the RSAParameters structure. 
RSAParameters lRSAKeyInfo = new RSAParameters(); 

//Set RSAKeyInfo to the public key values. 
string KeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCV/eUrmhIZul32nN41sF0y/k4detUxPTQngHFQGOoQNCRa84+2mGdCAg3EN9DPsUtCSHjscfp5xC9otgZsj13Rn7atbGZhJn5eZpIzPZV/psfeueL0Idq7b1msyBNG8dqR0WblYvzSY8uWwIIWyOkrQvtUwHJoxrBD4iLO/NEvzQIDAQAB"; 
PublicKey = Convert.FromBase64String(KeyString); 


lRSAKeyInfo.Modulus = PublicKey; 
lRSAKeyInfo.Exponent = lExponent; 

lRSA.ImportParameters(lRSAKeyInfo); 

return Convert.ToBase64String(lRSA.Encrypt(InputStringbytes, false)); 

Die problim ist, dass meine Schlüsselgröße 1296 und nicht 1024. I mit XMLParameter String getestet haben, aber ich habe das gleiche Problem.

Ich brauche Hilfe. Danke pro Fortschritt

Antwort

0

Ich verstehe nicht wirklich, wenn Sie sagen, dass etwas mit dem ursprünglichen öffentlichen Schlüssel falsch ist, oder Sie denken, dass es richtig ist und Ihr Code nicht funktioniert. Ich verwende die folgende (BouncyCastle Bibliothek) für die Verschlüsselung:

public string PublicKeyEncrypt(string plaintext, Stream publickey) 
{ 
    try 
    { 
     var rsaKeyParameters = (RsaKeyParameters)PublicKeyFactory.CreateKey(publickey); 
     var rsaParameters = new RSAParameters(); 
     rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(); 
     rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned(); 
     var rsa = new RSACryptoServiceProvider(); 
     rsa.ImportParameters(rsaParameters); 
     return Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(plaintext), true)); 
    } 
    catch (Exception e) 
    { 
     // Whatever 
    } 
} 

Und wenn Sie für den Schlüssel mit einem Byte-Array nennen:

public string PublicKeyEncrypt(string plaintext, byte[] publickey) 
{ 
    return PublicKeyEncrypt(plaintext, new MemoryStream(publickey, false)); 
} 
+0

Normalerweise ist der öffentliche Schlüssel gut, denn mit Bibliothek JavaScript, um die öffentlichen Schlüssel der Arbeit (https://github.com/travist/jsencrypt). Ich möchte seine Bibliothek nicht verwenden, sondern die Verschlüsselung in .NET realisieren. Für mich ist es mein Code funktioniert nicht. – Christophe

0

Ihre Zeichenfolge ist 216 Zeichen lang, was es bedeutet, repräsentiert 162 Bytes. Und 162 Bytes sind 1296 Bits.

Also scheint das Programm genau das zu tun, was Sie ihm gesagt haben (die Länge des Moduls (in Bits) ist die RSA-Schlüsselgröße).

Also die Zeichenfolge, die Sie dort haben, stellt keinen RSA 1024-Bit-Modulwert dar, Sie müssen die falschen Datenwerte kopiert haben.

+0

Ich hatte das gesehen. Ich vermutete, dass es ein Problem mit der Tastenfolge gab. Ich habe die falschen Daten nicht kopiert. Ich habe die ursprüngliche Zeichenkette abgeschnitten, die enthält ----- BEGIN PUBLIC KEY ----- und ----- END PUBLIC KEY ----- – Christophe

+0

In meinem Projekt muss ich ein Passwort verschlüsseln, um ein zu verwenden SSO lgin mit Open AM. Tatsächlich wird es bereits mit diesem öffentlichen Schlüssel verwendet und das Passwort wird mit JSENCRYPT.JS verschlüsselt. Und es gibt kein Problem.Dies ist der Grund, dass ich ein Problem mit der Entwicklung in C# – Christophe

+0

habe Für den Moment werde ich versuchen, einen anderen öffentlichen Schlüssel zu generieren und – Christophe

0

Ihr KeyString ist ein Base64-codiertes DER-codiertes SubjectPublicKeyInfo-Objekt, das tatsächlich einen 1024-Bit-RSA-Modul enthält. Um zu sehen, können Sie die lapo.it base64 ASN.1 decoder verwenden. Kopieren Sie einfach die base64-Zeichenfolge und fügen Sie sie dort ein und klicken Sie auf decode.

In Java wird dieses Format (ohne die base64-Codierung) von der PublicKey.getEncoded()-Methode zurückgegeben.

Es gibt verschiedene Antworten auf Stackoverflow, die versuchen, mit dieser Frage umzugehen. In this answer wird die bouncycastle C# library verwendet, und das folgende Fragment C# wird zugeführt:

byte[] publicKeyBytes = Convert.FromBase64String(publicKeyString); 
AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(publicKeyBytes); 
RsaKeyParameters rsaKeyParameters = (RsaKeyParameters) asymmetricKeyParameter; 
RSAParameters rsaParameters = new RSAParameters(); 
rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(); 
rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned(); 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.ImportParameters(rsaParameters); 

This answer enthält eine längere Sequenz von Code, sondern vermeidet die bouncycastle C# Bibliothek.

Ich habe keines von beiden getestet.

0

Dies ist ce Lösung zu Modul in öffentlichen Schlüssel von DER-codierten Blob erhalten.

private string Encrypt(string pPublicKey, string pInputString) 
    { 
     //Create a new instance of the RSACryptoServiceProvider class. 
     RSACryptoServiceProvider lRSA = new RSACryptoServiceProvider(); 

     //Import key parameters into RSA. 
     lRSA.ImportParameters(GetRSAParameters(pPublicKey)); 

     return Convert.ToBase64String(lRSA.Encrypt(Encoding.UTF8.GetBytes(pInputString), false)); 
    } 

    private static RSAParameters GetRSAParameters(string pPublicKey) 
    { 
     byte[] lDer; 

     //Set RSAKeyInfo to the public key values. 
     int lBeginStart = "-----BEGIN PUBLIC KEY-----".Length; 
     int lEndLenght = "-----END PUBLIC KEY-----".Length; 
     string KeyString = pPublicKey.Substring(lBeginStart, (pPublicKey.Length - lBeginStart - lEndLenght)); 
     lDer = Convert.FromBase64String(KeyString); 


     //Create a new instance of the RSAParameters structure. 
     RSAParameters lRSAKeyInfo = new RSAParameters(); 

     lRSAKeyInfo.Modulus = GetModulus(lDer); 
     lRSAKeyInfo.Exponent = GetExponent(lDer); 

     return lRSAKeyInfo; 
    } 

    private static byte[] GetModulus(byte[] pDer) 
    { 
     //Size header is 29 bits 
     //The key size modulus is 128 bits, but in hexa string the size is 2 digits => 256 
     string lModulus = BitConverter.ToString(pDer).Replace("-", "").Substring(58, 256); 

     return StringHexToByteArray(lModulus); 
    } 

    private static byte[] GetExponent(byte[] pDer) 
    { 
     int lExponentLenght = pDer[pDer.Length - 3]; 
     string lExponent = BitConverter.ToString(pDer).Replace("-", "").Substring((pDer.Length * 2) - lExponentLenght * 2, lExponentLenght * 2); 

     return StringHexToByteArray(lExponent); 
    }  

    public static byte[] StringHexToByteArray(string hex) 
    { 
     return Enumerable.Range(0, hex.Length) 
         .Where(x => x % 2 == 0) 
         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
         .ToArray(); 
    } 

Vielen Dank für Ihre Hilfe