Wie signieren und verifizieren Sie einige Daten auf iOS mit einem RSA-Schlüssel (vorzugsweise mit dem System eigenen libcommonCrypto
)?Signieren und Verifizieren unter iOS mit RSA
Antwort
Da in StackOverflow und den Apple-Dokumenten bisher kaum Wissen zum Signieren und Verifizieren gefunden wurde, musste ich manuell in den iOS-Header-Dateien suchen und SecKeyRawSign
und SecKeyRawVerify
finden. Die folgenden Codezeilen scheinen zu funktionieren.
Signing NSData (unter Verwendung von SHA256 mit RSA):
NSData* PKCSSignBytesSHA256withRSA(NSData* plainData, SecKeyRef privateKey)
{
size_t signedHashBytesSize = SecKeyGetBlockSize(privateKey);
uint8_t* signedHashBytes = malloc(signedHashBytesSize);
memset(signedHashBytes, 0x0, signedHashBytesSize);
size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
uint8_t* hashBytes = malloc(hashBytesSize);
if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
return nil;
}
SecKeyRawSign(privateKey,
kSecPaddingPKCS1SHA256,
hashBytes,
hashBytesSize,
signedHashBytes,
&signedHashBytesSize);
NSData* signedHash = [NSData dataWithBytes:signedHashBytes
length:(NSUInteger)signedHashBytesSize];
if (hashBytes)
free(hashBytes);
if (signedHashBytes)
free(signedHashBytes);
return signedHash;
}
Verification (unter Verwendung von SHA256 mit RSA):
BOOL PKCSVerifyBytesSHA256withRSA(NSData* plainData, NSData* signature, SecKeyRef publicKey)
{
size_t signedHashBytesSize = SecKeyGetBlockSize(publicKey);
const void* signedHashBytes = [signature bytes];
size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
uint8_t* hashBytes = malloc(hashBytesSize);
if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
return nil;
}
OSStatus status = SecKeyRawVerify(publicKey,
kSecPaddingPKCS1SHA256,
hashBytes,
hashBytesSize,
signedHashBytes,
signedHashBytesSize);
return status == errSecSuccess;
}
Alternativen (OpenSSL):
Es gibt eine sehr gute Alternative, die OpenSSL direkt anstelle von libCommonCrypto verwendet. MIHCrypto ist eine gut entworfene Objective-C-Wrapper-Bibliothek für OpenSSL, die das Arbeiten mit Kryptografie sehr einfach macht. Siehe das Beispiel unten.
einen Schlüssel generieren einfach ist das:
MIHAESKeyFactory *factory = [[MIHAESKeyFactory alloc] init];
id<MIHSymmetricKey> aesKey = [factory generateKey];
Oder einen Schlüssel aus Datei laden:
NSData *privateKeyData = [[NSFileManager defaultManager] contentsAtPath:"mykey.pem"];
MIHRSAPrivateKey *privateKey = [[MIHRSAPrivateKey alloc] initWithData:privateKeyData];
Jetzt etwas unterschreiben:
NSError *signingError = nil;
NSData *message = // load something to sign from somewhere
NSData *signature = [privateKey signWithSHA256:message error:&signingError]
Weitere Beispiele durchsuchen Sie die MIHCrypto Seite .
Wäre schön, ein ähnliches Beispiel für "SecKeyRawSign" und "SecKeyRawVerify" in ** Swift ** zu haben. Wenn jemand das geschafft hat, bitte hier verlinken/einfügen. Werde das Gleiche tun, wenn ich es funktioniere. – stannie
Irgendwas Glück? Ich brauche wirklich Hilfe! http://stackoverflow.com/questions/32759385/swift-rsa-encrypt-a-string-with-a-specific-private-key –
Vergessen Sie nicht
- 1. signieren mit RSA Public Key Algorithmus
- 2. Wie signieren und verifizieren Signatur mit Ecdsa in Python
- 3. Signieren und Decodieren mit RSA-SHA in GO
- 4. OpenSSL RSA signieren mit SHA256 Digest
- 5. Kann man eine ELF-Datei signieren (und verifizieren)?
- 6. Crypto ++ RSA - Verschlüsseln und signieren mit dem gleichen Schlüsselpaar
- 7. Welche lib oder Software blind signieren und verifizieren?
- 8. RSA private Schlüssel - iOS
- 9. Überprüfen der RSA-Signatur iOS
- 10. Wie verifizieren Sie eine RSA SHA1-Signatur in Python?
- 11. Verwenden Sie den vorhandenen privaten PEM-Schlüssel zum Signieren von Daten unter iOS
- 12. Wie kann ich ein Schlüsselpaar generieren und damit Text in Node.js signieren und verifizieren?
- 13. Signieren einer Zeichenfolge mit einem privaten Schlüssel, RSA-SHA1-Signatur und als MD5 in Android
- 14. Anmelden unter OS X, Überprüfen unter iOS und OSStatus -9809
- 15. Signieren von Daten mit SoftHSM
- 16. Richtlinie zum Signieren und Verschlüsseln
- 17. PDF mit HTTPS und Tcpdf signieren?
- 18. iPhone/iOS: Einmal erstellen, zweimal signieren
- 19. Skript unter Linux für SSH-Zugriff signieren
- 20. Verifizieren von CRC mit Airpcap und pcap
- 21. Interpretieren openssl Geschwindigkeit Ausgabe für RSA mit Multi-Option
- 22. So signieren und verpacken Sie eine Xamarin.Forms-Anwendung für IOS
- 23. Verifizieren von mit dem RS256-Algorithmus signierten JWT unter Verwendung des öffentlichen Schlüssels in C#
- 24. Mail signieren und verschlüsseln
- 25. Bouncycastle PGP entschlüsseln und verifizieren
- 26. Signieren eines xml-Dokuments mit x509-Zertifikat
- 27. Verifizieren einer Dateisignatur mit openssl dgst
- 28. Signieren einer Zeichenfolge mit privatem RSA-Schlüssel in Google App Engine Python SDK
- 29. Misunderstanding mit Passwort Verifizieren php
- 30. PDF mit JavaScript signieren
Wo befinden sich die RSA-Schlüssel (Plural wegen öffentlicher und privater Teile zum Verifizieren und Signieren)? Sind sie im Schlüsselbund oder sind sie extern im PEM- oder DER-Format? – jww
Wie in der Frage beschrieben, würde ich lieber libcommonCrypto verwenden. Dies bedeutet, dass der Schlüssel außerhalb der Programmieransicht als "SecKeyRef" verfügbar ist (in der Speicherreferenz, die von Schlüsselbund, PEM oder irgendetwas anderem stammen kann, das von Apple Security Framework unterstützt wird). Die Art des Schlüssels sollte für meine Frage keine Rolle spielen, aber im Moment speichere ich alle Schlüssel (eigenen privaten Schlüssel und einige öffentliche Schlüssel) im Sandkasten Schlüsselbund. – miho
Versuchen Sie, einige Daten mithilfe von RSA mit öffentlichen/privaten Schlüsseln zu verschlüsseln/zu entschlüsseln? – jailani