CryptographicException: Unspecified Error!?
-
Hallo zusammen!
Zur Zeit arbeite ich an einem komplexeren SOA-Projekt, das komplett auf Web Services aufbaut. Nachdem Programmlogik, Dienste-Delegation und Benutzer-Authentisierung erfolgreich funktionieren, macht mir dir Verschlüsselung noch zu schaffen.
Um den Rahmen nicht zu sprengen, habe ich das Problem eingekreist und auf eine einzige (fiktive) Methode reduziert.
Ich möchte einen beliebigen Daten-String mithilfe eines RSACryptoServiceProvider verschlüsseln. Dazu verwende ich einfach den Default-Key, der nach Instanzieren des RSA-Objektes in diesem zur Verfügung steht, und rufe die Methode Encrypt() auf.
Hier (auszugsweise) der Code:
// Key-Length in Byte int kLength = 128; // The RSA CSP (Key-Length in Bit) RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(kLength * 8); // String to be encryted (to provoke an error, it must be longer than 117 Bytes) string target = "This string is longer than 117 Bytes! Yes, it is! ..."; // Encoding-Object (could also be Unicode or ASCII) UTF8Encoding enc = new UTF9Encoding() // Encryption byte[] bytes = enc.GetBytes(target); byte[] encrypted = rsa.Encrypt(bytes, false); string encString = Convert.ToBase64String(encrypted); // Doing something with the string // ...
Der String wird in ein Byte-Array umgewandelt, das dann nachfolgend verschlüsselt wird. In der Zeile, in der der Aufruf rsa.Encrypt() steht, tritt beim Ausführen folgender Fehler auf:
CryptographicException: Unspecified Error
Mehr nicht. Nach Rumprobieren und lesen diverser (teilweise nur partiell zum Thema passender) MSDN-Artikel habe ich herausgefunden, dass der Fehler NUR dann auftritt, wenn der zu verschlüsselnde String (target) mindestens keyLength - 10 Bytes groß ist.
Ist der Key also z.B. 128 Bytes lang, so beträgt die maximale Größe des Strings 117 Byte (also 117 Zeichen). Bei 118 Zeichen wird der oben genannte Fehler ausgelöst. Bei einem Key der Länge 64 klappt es nur dann, wenn der Ziel-String maximal 53 Zeichen umfasst.Mein Problem an der Sache ist also naheliegend: Die im Rahmen des Projektes zu verschlüsselnden Strings haben eine variable (und völlig willkürliche Länge ) und können somit quasi beliebig groß sein.
Weiß vielleicht jemand einen Rat, bzw. hat jemand Erfahrung mit diesem Problem? Ich bin für jeden Hinweis dankbar.
Gruß, xeri
-
Wenn der Verschlüsselungsalgorithmus nicht für variable Stringlängen vorgesehen ist, musst du deinen String halt in Stücke zerlegen und jeden Teil einzeln durch die Verschlüsselung jagen:
while(pos<target.length() { bytes = taret.substr(pos,pos+max_len); crypt = Encrypt(bytes); code_string += crypt; pos+=max_len; }