2016-04-13 5 views
0

Ich möchte einige Werte zu einem Lizenzcode mit einem geheimen privaten Schlüssel verschlüsseln, und dann, wenn es in der App des Benutzers eingegeben wird wird mit dem öffentlichen Schlüssel entschlüsselt (in der App gespeichert), um die verschlüsselten Daten einzusehen und sicherzustellen, dass sie nur von mir erstellt wurden.Verwenden von RSA in umgekehrter Reihenfolge zum Entschlüsseln eines Lizenzcodes: mit privatem Schlüssel verschlüsseln, mit öffentlichen Schlüssel entschlüsseln

Das Problem ist, scheint es, dass Sie mit dem öffentlichen Schlüssel verschlüsseln und mit dem privaten Schlüssel entschlüsseln, das ist das Gegenteil von dem, was ich will.

Es ist auch erwähnenswert, dass die Bibliothek, die ich verwende, SwiftyRSA nur Verschlüsselung mit dem öffentlichen Schlüssel unterstützt, und es nicht mag, wenn ich stattdessen den privaten Schlüssel verwende. Ich glaube, das liegt daran, dass es mit kSecAttrKeyClassPublic im Schlüsselbund gespeichert wird, weil es genau das erwartet, was dazu führt, dass Dinge scheitern.

Ich habe gelesen, dass die Schlüssel technisch austauschbar sind, aber es scheint, ich kann es in meiner Instanz nicht funktionieren. Liegt das daran, dass der öffentliche Schlüssel einen kleineren Exponenten hat? Gibt es eine Möglichkeit, den öffentlichen Schlüssel so "lang" wie den privaten Schlüssel mit ssh-keygen zu bekommen, und deshalb in der Lage zu sein, sie zu tauschen? Wenn nicht, wie könnte ich fortfahren?

+1

Sie sollten das sicherlich tun können. Was Sie erstellen möchten, ist eine digitale Signatur und es wird überall verwendet. Wenn eine Zertifizierungsstelle ein Zertifikat ausstellt, signiert sie (verschlüsselt) Informationen über das Zertifikat mit ihrem privaten Schlüssel. Dadurch kann das Zertifikat überprüft werden, wenn Sie den öffentlichen Schlüssel kennen und ihm vertrauen. – Paulw11

+2

Sie müssen die Crypto-Funktion 'SecKeyRawSign' - https://developer.apple.com/library/ios/documentation/Security/Reference/certifkeytrustservices/#//apple_ref/c/func/SecKeyRawSign, die diese Bibliothek nicht verwendet entlarven. Die andere Sache, die Sie tun könnten, ist nur mit dem öffentlichen Schlüssel zu verschlüsseln und mit dem privaten Schlüssel zu entschlüsseln; Solange der öffentliche Schlüssel geheim bleibt, kann niemand einen Lizenzcode generieren. – Paulw11

+0

@ Paulw11 Wenn ich den privaten Schlüssel verteile und den öffentlichen Schlüssel geheim halte, kann jemand nicht einfach den öffentlichen Schlüssel wieder vom privaten Schlüssel erstellen, wie ich es ursprünglich getan habe ? Und dann hätten sie den öffentlichen Schlüssel, um einen Code zu generieren. (Ich habe die Anweisungen in [README] (https://github.com/TakeScoop/SwiftyRSA/blob/master/README.md) von SwiftyRSA befolgt, um das Schlüsselpaar zu erstellen). Außerdem ist der öffentliche Schlüssel kleiner als der private Schlüssel, ist das ein sicherheitsrelevantes Problem? Einen größeren Schlüssel verteilen und den kleineren als Geheimnis behalten? – Sencha

Antwort

0

Die Schlüssel sind nicht immer austauschbar (z. B. private RSA-Schlüssel mit CRT-Parametern) und es ist ziemlich wahrscheinlich, dass das Verschlüsselungsverfahren den Schlüssel nicht vor Seitenkanalangriffen schützt. Sie sollten keine privaten Schlüssel zum Verschlüsseln verwenden, Punkt.

Sie könnten Signaturen mit Nachrichtenwiederherstellung verwenden, wenn Sie wirklich vorsichtig sind.

Andernfalls - wenn Sie genug Platz haben - können Sie Ihre Lizenz natürlich immer unterschreiben und dann verschlüsseln. Damit dies funktionieren kann (ohne zusätzliche AES-Verschlüsselung) müsste Ihr Verschlüsselungsschlüsselpaar allerdings etwas größer sein als Ihr Signaturschlüssel.